KotlinのJava静的メソッドに相当するものは何ですか?


619

ありません staticKotlinにキーワード。

staticKotlinでJavaメソッドを表す最良の方法は何ですか?



13
注意してください: KotlinはJavaスタイルのstaticを削除して、より保守しやすい(私が 'より良い'と言っていい)コーディングプラクティスを奨励しています。静的グローバルは一般にOOPパラダイムに反していますが、非常に便利な場合があります。したがって、Kotlinは、静的オブジェクトを持つよりOOPに適した方法であるコンパニオン
Nicholas Miller

Googleによると、Kotlinは現在Android開発の優先言語です。
AFD

@NicholasMillerなぜOOPフレンドリーなのですか?静的(ボイラープレート)の繰り​​返しのメモがなくても読み書きが簡単だと思います。それとも別の理由がありますか?
Torben G

回答:


889

関数を「コンパニオンオブジェクト」に配置します。

したがって、次のようなJavaコード:

class Foo {
  public static int a() { return 1; }
}

となります

class Foo {
  companion object {
     fun a() : Int = 1
  }
}

次に、Kotlinコード内から次のように使用できます。

Foo.a();

しかし、Javaコード内から、次のように呼び出す必要があります。

Foo.Companion.a();

(これはKotlin内でも機能します。)

Companionビットを指定する必要がない場合は、@JvmStatic注釈を追加するか、コンパニオンクラスに名前を付けることができます。

ドキュメントから:

コンパニオンオブジェクト

クラス内のオブジェクト宣言は、コンパニオンキーワードでマークできます。

class MyClass {
   companion object Factory {
       fun create(): MyClass = MyClass()
   }
}

コンパニオンオブジェクトのメンバーは、クラス名を修飾子として使用するだけで呼び出すことができます。

val instance = MyClass.create()

...

ただし、JVMでは、@JvmStatic アノテーションを使用すると、実際の静的メソッドおよびフィールドとして生成されるコンパニオンオブジェクトのメンバーを持つことができます。詳細については、Javaの相互運用性のセクションを参照してください。

@JvmStatic注釈の追加は次のようになります

class Foo {
  companion object {
    @JvmStatic
    fun a() : Int = 1;
  }
}

そして、それは実際のJava静的関数として存在し、JavaとKotlinの両方からアクセスできますFoo.a()

Companion名前が嫌いな場合は、コンパニオンオブジェクトの名前を次のように明示的に指定することもできます。

class Foo {
  companion object Blah {
    fun a() : Int = 1;
  }
}

同じ方法でKotlinから呼び出すことができますが、JavaのようにFoo.Blah.a()(これはKotlinでも動作します)。


4
コトリンでは、fun a(): Int { return 1 }それは同じか、それとも同じですfun a(): Int = 1
Dmitry Zaytsev

3
@DmitryZaitsev さえもfun a() = 1
モイラ2017

Factoryの意味?
Bagus Aji Santoso 2017

@BagusAjiSantoso Factoryはコンパニオンオブジェクトの名前ですが、何に使用できますか?わかりませんが、興味があったので、専用の質問を作成しました:stackoverflow.com/q/45853459/221955
マイケルアンダーソン

1
:私はそれを直接アドレス指定する質問を作成しましたので- Yajairo87 @私はあなたがしているの提示はここのコメントでカバーにあまりあるものだと思うstackoverflow.com/questions/47046474/...
マイケル・アンダーソン

154

ドキュメントでは、静的関数のほとんどのニーズをパッケージレベルの関数で解決することをお勧めしています。これらは、ソースコードファイルのクラス外で宣言されているだけです。ファイルのパッケージは、packageキーワードを使用してファイルの先頭に指定できます。

宣言

package foo

fun bar() = {}

使用法

import foo.bar

あるいは

import foo.*

これで関数を呼び出すことができます:

bar()

または、importキーワードを使用しない場合:

foo.bar()

パッケージを指定しない場合、関数はルートからアクセスできます。

Javaの経験しかない場合、これは少し奇妙に思えるかもしれません。その理由は、kotlinが厳密にオブジェクト指向の言語ではないためです。クラス外のメソッドをサポートしていると言えます。

編集:彼らはドキュメントを編集して、パッケージレベルの関数の推奨に関する文が含まれないようにしました。これは上記で参照されたオリジナルです。


8
内部では、これらの「トップレベル」または「パッケージ」関数は実際には独自のクラスにコンパイルされることに注意してください。上記の例では、コンパイラーはclass FooPackageすべてのトップレベルのプロパティと関数でを作成し、すべての参照をそれらに適切にルーティングします。jetbrainsからの詳細情報。
Mitchell Tracy

29
+1 Javaのミラー同等物だけでなく、Kotlinで同等の権利を実行する方法を説明するため。
フェニックス

1
これは承認済みの回答であるか、MODが承認済みの回答を更新してパッケージレベルの関数を含める必要があります
Osama Shabrez

@MitchellTracy素晴らしい情報!ありがとう。
ドロイド、

1
これはこれまでのところより良い解決策です。関数を定義する場所がbar()ファイル名に関係なく、名前を付けることができることを明確にしたかったBarUtils.ktので、テキストでそれをインポートするとしますimport <package name>.bar
Mariano Ruiz

33

A.古いJavaの方法:

  1. companion object静的メソッド/変数を囲むようにaを宣言します

    class Foo{
    companion object {
        fun foo() = println("Foo")
        val bar ="bar"  
        }
    }
  2. 使用する :

    Foo.foo()        // Outputs Foo    
    println(Foo.bar) // Outputs bar


B.新しいKotlinの方法

  1. ファイルを直接宣言したクラスせず.ktファイル。

    fun foo() = println("Foo")
    val bar ="bar"
  2. 名前methods/variablesとともにを使用します。(インポート後

    使用する :

    foo()        // Outputs Foo          
    println(bar) // Outputs bar     


他のクラスで初期化しようとしている場合、java.lang.ExceptionInInitializerErrorが発生し、valではなくvarを使用します
Sudarshan

4
メソッドの呼び出しは持っている必要がありINSTANCE、このように、キーワードを:Foo.INSTANCE.sayFoo()
Raeglan

static CLASSだけでなく、このソリューションが必要な場合に推奨される方法だと思いますstatic methdos。コンパニオンオブジェクトを使用すると、親クラスをインスタンス化できるためです。
fabriciorissetto 2018

val静的ではありませんstatic final。Java と同等です
ファリッド

23

オブジェクトを使用してval / var / methodを表し、静的にします。シングルトンクラスの代わりにオブジェクトを使用することもできます。クラス内で静的にしたい場合は、コンパニオンを使用できます

object Abc{
     fun sum(a: Int, b: Int): Int = a + b
    }

Javaから呼び出す必要がある場合:

int z = Abc.INSTANCE.sum(x,y);

Kotlinでは、INSTANCEを無視します。


11

これも私のために働いた

object Bell {
    @JvmStatic
    fun ring() { }
}

コトリンから

Bell.ring()

Javaから

Bell.ring()

8
object objectName {
    fun funName() {

    }
}

5
このコードスニペットが解決策となる場合もありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
Narendra Jadhav

5

kotlinには静的キーワードがないため、静的メソッドのコンパニオンオブジェクトを渡す必要があります-コンパニオンオブジェクトのメンバーは、クラス名を修飾子として使用するだけで呼び出すことができます。

package xxx
    class ClassName {
              companion object {
                       fun helloWord(str: String): String {
                            return stringValue
                      }
              }
    }

4

Kotlinでstaticを適用する方法は2つあります

まず、クラスの下にコンパニオンオブジェクトを作成します

例:

class Test{
    companion object{
          fun isCheck(a:Int):Boolean{
             if(a==0) true else false
          }
     }
}

この関数は次のように呼び出すことができます

Test.Companion.isCheck(2)

もう1つの方法は、オブジェクトクラスを作成することです。

object Test{
       fun isCheck(a:Int):Boolean{
            if(a==0) true else false
       }
}

ハッピーコーディング!


最初の使用(IE用Test.Companion.isCheck(2))IDEショーの警告と言いますCompanion reference is redundant。それはに縮小することができTest.isCheck(2)、縮小された形式はJavaの同等物により近くなります。
VSB

3

Kotlinには静的キーワードはありません。あなたはそれをJavaに使用しました

 class AppHelper {
        public static int getAge() {
            return 30;
        }
    }

そしてコトリンのために

class AppHelper {
        companion object {
            fun getAge() : Int = 30
        }
    }

Javaの呼び出し

AppHelper.getAge();

Kotlinの呼び出し

AppHelper.Companion.getAge();

私はそれが完全に機能すると思います。


3

上記の回答に何か追加したいと思います。

はい、ソースコードファイル(クラス外)で関数を定義できます。ただし、Kotlin Extensionsを利用して静的関数を追加できるため、Companion Objectを使用してクラス内に静的関数を定義することをお勧めします。

class MyClass {
    companion object { 
        //define static functions here
    } 
}

//Adding new static function
fun MyClass.Companion.newStaticFunction() {
    // ...
}

また、コンパニオンオブジェクト内の任意の関数を呼び出すので、上記で定義した関数を呼び出すことができます。


3

これは2年以上前で、すばらしい答えがたくさんありますが、「静的な」Kotlinフィールドを取得する他の方法がいくつか見受けられます。Kotlin-Java static相互運用のガイドの例を次に示します。

シナリオ1:Kotlin for Javaで静的メソッドを作成する

コトリン

@file:JvmName("KotlinClass") //This provides a name for this file, so it's not defaulted as [KotlinClassKt] in Java
package com.frybits

class KotlinClass {
    companion object {

        //This annotation tells Java classes to treat this method as if it was a static to [KotlinClass]
        @JvmStatic
        fun foo(): Int = 1

        //Without it, you would have to use [KotlinClass.Companion.bar()] to use this method.
        fun bar(): Int = 2
    }
}

ジャワ

package com.frybits;

class JavaClass {

    void someFunction() {
        println(KotlinClass.foo()); //Prints "1"
        println(KotlinClass.Companion.bar()); //Prints "2". This is the only way to use [bar()] in Java.
        println(KotlinClass.Companion.foo()); //To show that [Companion] is still the holder of the function [foo()]
    }

    //Because I'm way to lazy to keep typing [System.out], but I still want this to be compilable.
    void println(Object o) {
        System.out.println(o);
    }
}

マイケルアンダーソンの回答はこれよりも詳細であり、このシナリオでは必ず参照する必要があります。


この次のシナリオでは、Kotlinで静的フィールドを作成するためKotlinClass.foo()、静的関数が不要な場合にJavaが呼び出しを続ける必要がないようにします。

シナリオ2:Kotlin for Javaで静的変数を作成する

コトリン

@file:JvmName("KotlinClass") //This provides a name for this file, so it's not defaulted as [KotlinClassKt] in Java
package com.frybits

class KotlinClass {

    companion object {

        //This annotation tells Kotlin to not generate the getter/setter functions in Java. Instead, this variable should be accessed directly
        //Also, this is similar to [@JvmStatic], in which it tells Java to treat this as a static variable to [KotlinClass].
        @JvmField
        var foo: Int = 1

        //If you want something akin to [final static], and the value is a primitive or a String, you can use the keyword [const] instead
        //No annotation is needed to make this a field of [KotlinClass]. If the declaration is a non-primitive/non-String, use @JvmField instead
        const val dog: Int = 1

        //This will be treated as a member of the [Companion] object only. It generates the getter/setters for it.
        var bar: Int = 2

        //We can still use [@JvmStatic] for 'var' variables, but it generates getter/setters as functions of KotlinClass
        //If we use 'val' instead, it only generates a getter function
        @JvmStatic
        var cat: Int = 9
    }
}

ジャワ

package com.frybits;

class JavaClass {

    void someFunction() {
        //Example using @JvmField
        println(KotlinClass.foo); //Prints "1"
        KotlinClass.foo = 3;

        //Example using 'const val'
        println(KotlinClass.dog); //Prints "1". Notice the lack of a getter function

        //Example of not using either @JvmField, @JvmStatic, or 'const val'
        println(KotlinClass.Companion.getBar()); //Prints "2"
        KotlinClass.Companion.setBar(3); //The setter for [bar]

        //Example of using @JvmStatic instead of @JvmField
        println(KotlinClass.getCat());
        KotlinClass.setCat(0);
    }

    void println(Object o) {
        System.out.println(o);
    }
}

Kotlinの優れた機能の1つは、トップレベルの関数と変数を作成できることです。これは、定数フィールドと関数の「クラスレス」リストを作成するのに最適です。これはstatic、Javaで関数/フィールドとして使用できます。

シナリオ3:JavaからKotlinの最上位フィールドおよび関数にアクセスする

コトリン

//In this example, the file name is "KSample.kt". If this annotation wasn't provided, all functions and fields would have to accessed
//using the name [KSampleKt.foo()] to utilize them in Java. Make life easier for yourself, and name this something more simple
@file:JvmName("KotlinUtils")

package com.frybits

//This can be called from Java as [KotlinUtils.TAG]. This is a final static variable
const val TAG = "You're it!"

//Since this is a top level variable and not part of a companion object, there's no need to annotate this as "static" to access in Java.
//However, this can only be utilized using getter/setter functions
var foo = 1

//This lets us use direct access now
@JvmField
var bar = 2

//Since this is calculated at runtime, it can't be a constant, but it is still a final static variable. Can't use "const" here.
val GENERATED_VAL:Long = "123".toLong()

//Again, no need for @JvmStatic, since this is not part of a companion object
fun doSomethingAwesome() {
    println("Everything is awesome!")
}

ジャワ

package com.frybits;

class JavaClass {

    void someFunction() {

        println(KotlinUtils.TAG); //Example of printing [TAG]


        //Example of not using @JvmField.
        println(KotlinUtils.getFoo()); //Prints "1"
        KotlinUtils.setFoo(3);

        //Example using @JvmField
        println(KotlinUtils.bar); //Prints "2". Notice the lack of a getter function
        KotlinUtils.bar = 3;

        //Since this is a top level variable, no need for annotations to use this
        //But it looks awkward without the @JvmField
        println(KotlinUtils.getGENERATED_VAL());

        //This is how accessing a top level function looks like
        KotlinUtils.doSomethingAwesome();
    }

    void println(Object o) {
        System.out.println(o);
    }
}

「静的」フィールドとしてJavaで使用できるもう1つの注目すべき点は、Kotlin objectクラスです。これらは、最初の使用時に遅延してインスタンス化されるゼロパラメーターのシングルトンクラスです。これらの詳細については、https//kotlinlang.org/docs/reference/object-declarations.html#object-declarationsをご覧ください。

ただし、シングルトンにアクセスするために、特別なINSTANCEオブジェクトが作成されます。これは、そのまま処理するのと同じくらい面倒Companionです。アノテーションを使用staticしてJava でクリーンな感じを与える方法は次のとおりです。

シナリオ4:objectクラスの使用

コトリン

@file:JvmName("KotlinClass")

//This provides a name for this file, so it's not defaulted as [KotlinClassKt] in Java
package com.frybits

object KotlinClass { //No need for the 'class' keyword here.

    //Direct access to this variable
    const val foo: Int = 1

    //Tells Java this can be accessed directly from [KotlinClass]
    @JvmStatic
    var cat: Int = 9

    //Just a function that returns the class name
    @JvmStatic
    fun getCustomClassName(): String = this::class.java.simpleName + "boo!"

    //Getter/Setter access to this variable, but isn't accessible directly from [KotlinClass]
    var bar: Int = 2

    fun someOtherFunction() = "What is 'INSTANCE'?"
}

ジャワ

package com.frybits;

class JavaClass {

    void someFunction() {
        println(KotlinClass.foo); //Direct read of [foo] in [KotlinClass] singleton

        println(KotlinClass.getCat()); //Getter of [cat]
        KotlinClass.setCat(0); //Setter of [cat]

        println(KotlinClass.getCustomClassName()); //Example of using a function of this 'object' class

        println(KotlinClass.INSTANCE.getBar()); //This is what the singleton would look like without using annotations
        KotlinClass.INSTANCE.setBar(23);

        println(KotlinClass.INSTANCE.someOtherFunction()); //Accessing a function in the object class without using annotations
    }

    void println(Object o) {
        System.out.println(o);
    }
}

3

短くするには、「コンパニオンオブジェクト」を使用して、次のようにKotlin静的世界に入ることができます。

  companion object {
    const val TAG = "tHomeFragment"
    fun newInstance() = HomeFragment()
}

また、定数フィールドを作成するには、コードのように「const val」を使用します。ただし、静的クラスはMockito!を使用した単体テストを困難にしているため、避けてください。


3

java静的メソッドを同等のkotlinに正確に変換すると、次のようになります。たとえば、ここでは、utilクラスに、javaとkotlinの両方で同等の静的メソッドが1つあります。@JvmStaticの使用は重要です。

Javaコード:

    class Util{
         public static String capitalize(String text){
         return text.toUpperCase();}
       }

Kotlinコード:

    class Util {
        companion object {
            @JvmStatic
            fun capitalize(text:String): String {
                return text.toUpperCase()
            }
        }
    }

2

単にあなたはコンパニオンオブジェクトを作成し、それに関数を置く必要があります

  class UtilClass {
        companion object {
  //        @JvmStatic
            fun repeatIt5Times(str: String): String = str.repeat(5)
        }
    }

kotlinクラスからメソッドを呼び出すには:

class KotlinClass{
  fun main(args : Array<String>) { 
    UtilClass.repeatIt5Times("Hello")
  }
}

またはインポートを使用する

import Packagename.UtilClass.Companion.repeatIt5Times
class KotlinClass{
  fun main(args : Array<String>) { 
     repeatIt5Times("Hello")
  }
}

Javaクラスからメソッドを呼び出すには:

 class JavaClass{
    public static void main(String [] args){
       UtilClass.Companion.repeatIt5Times("Hello");
    }
 }

または@JvmStaticアノテーションをメソッドに追加する

class JavaClass{
   public static void main(String [] args){
     UtilClass.repeatIt5Times("Hello")
   }
}

または、メソッドに@JvmStaticアノテーションを追加し、Javaで静的インポートを行う

import static Packagename.UtilClass.repeatIt5Times
class JavaClass{
   public static void main(String [] args){
     repeatIt5Times("Hello")
   }
}

2

Javaの場合:

public class Constants {
public static final long MAX_CLICK_INTERVAL = 1000;}

同等のKotlinコード:

object  Constants {
const val MAX_CLICK_INTERVAL: Long = 1000}

したがって、Javaの静的メソッドに相当するのは、Kotlinのオブジェクトクラスです。


2

Androidの場合、単一のアクティビティから必要なすべてのアクティビティまでの文字列を使用します。Javaの静的のように

public final static String TEA_NAME = "TEA_NAME";

Kotlinでの同等のアプローチ:

class MainActivity : AppCompatActivity() {
    companion object {
        const val TEA_NAME = "TEA_NAME"
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

価値が必要な別の活動:

val teaName = MainActivity.TEA_NAME

2

マイケルアンダーソンの答えを除いて、私は私のプロジェクトで他の2つの方法でコーディングしています。

最初:

すべての変数を1つのクラスにホワイト化できます。Constという名前のkotlinファイルを作成しました

object Const {
    const val FIRST_NAME_1 = "just"
    const val LAST_NAME_1 = "YuMu"
}

KotlinとJavaコードで使用できます

 Log.d("stackoverflow", Const.FIRST_NAME_1)

第二:

Kotlinの拡張関数を使用して
、Extという名前のkotlinファイルを作成できます。以下のコードは、Extファイル内のすべてのコードです

package pro.just.yumu

/**
 * Created by lpf on 2020-03-18.
 */

const val FIRST_NAME = "just"
const val LAST_NAME = "YuMu"

あなたはkotlinコードでそれを使うことができます

 Log.d("stackoverflow", FIRST_NAME)

あなたはそれをJavaコードで使うことができます

 Log.d("stackoverflow", ExtKt.FIRST_NAME);

1

それらを直接ファイルに書き込みます。

Java(醜い):

package xxx;
class XxxUtils {
  public static final Yyy xxx(Xxx xxx) { return xxx.xxx(); }
}

コトリンでは:

@file:JvmName("XxxUtils")
package xxx
fun xxx(xxx: Xxx): Yyy = xxx.xxx()

これらの2つのコードは、コンパイル後に等しくなります(コンパイルされたファイル名であっても、これはコンパイルされたファイル名file:JvmNameを制御するために使用されます。これはパッケージ名宣言の直前に置く必要があります)。


7
「Kotlin(醜い)」を忘れた... KOTLIN:コンパニオンオブジェクト{val handler = object:Handler(Looper.getMainLooper()){] ..... JAVA:static Handler handler = new Handler(Looper.getMainLooper() ){};
CmosBattery 2017年

1

@JVMStatic注釈を使用

companion object {

    // TODO: Rename and change types and number of parameters
    @JvmStatic
    fun newInstance(param1: String, param2: String) =
            EditProfileFragment().apply {
                arguments = Bundle().apply {
                    putString(ARG_PARAM1, param1)
                    putString(ARG_PARAM2, param2)
                }
            }
}

1

では、クラスStudentがあります。そして、1つの静的メソッドgetUniversityName()と、totalStudentという1つの静的フィールドがあります。ます。

クラス内でコンパニオンオブジェクトブロックを宣言する必要があります。

companion object {
 // define static method & field here.
}

その後、クラスは次のようになります

    class Student(var name: String, var city: String, var rollNumber: Double = 0.0) {

    // use companion object structure
    companion object {

        // below method will work as static method
        fun getUniversityName(): String = "MBSTU"

        // below field will work as static field
        var totalStudent = 30
    }
}

次に、これらの静的メソッドとフィールドをこのように使用できます。

println("University : " + Student.getUniversityName() + ", Total Student: " + Student.totalStudent)
    // Output:
    // University : MBSTU, Total Student: 30

1

kotlinには静的キーワードはありません。kotlin docsは、DRYを追跡したい場合はパッケージレベルの関数を使用することを推奨しています。拡張子が.ktのファイルを作成し、その中にメソッドを配置します。

package p
    fun m(){
    //fun body
    }

コンパイル後、m public static final voidのます

そして

import p.m


0

コンパニオンオブジェクトによってKotlinの静的機能を実現できます。

  • 追加 オブジェクト宣言にコンパニオンをすると、静的を追加でき ます、実際の静的概念がKotlinに存在しない場合でも、オブジェクトに機能を。
  • コンパニオンオブジェクトプライベートコンストラクタを含め、あまりにもクラスのすべてのメンバーにアクセスすることができます。
  • コンパニオンオブジェクトは、クラスがインスタンス化されるときに初期化されます。
  • コンパニオンオブジェクトは、クラス外で宣言することはできません。

    class MyClass{
    
        companion object {
    
            val staticField = "This is an example of static field Object Decleration"
    
            fun getStaticFunction(): String {
                return "This is example of static function for Object Decleration"
            }
    
        }
    }

コンパニオンオブジェクトのメンバーは、クラス名を修飾子として使用するだけで呼び出すことができます。

出力:

MyClass.staticField // This is an example of static field Object Decleration

MyClass.getStaticFunction() : // This is an example of static function for Object Decleration

0

すべての静的メンバーと関数はコンパニオンブロック内にある必要があります

  companion object {
    @JvmStatic
    fun main(args: Array<String>) {
    }

    fun staticMethod() {
    }
  }

0

多くの人がコンパニオンオブジェクトについて言及していますが、これは正しいです。ただし、ご存知のように、(クラスではなくオブジェクトキーワードを使用して)あらゆる種類のオブジェクトを使用することもできます。

object StringUtils {
    fun toUpper(s: String) : String { ... }
}

Javaの静的メソッドと同じように使用します。

StringUtils.toUpper("foobar")

この種のパターンはKotlinでは役に立たないようですが、その長所の1つは、静的メソッドで満たされたクラスの必要性がなくなることです。ユースケースによっては、代わりにグローバル関数、拡張関数、ローカル関数を使用する方が適切です。私が作業している場所では、グローバル拡張関数を、命名規則を使用して別のフラットファイルで定義することがよくあります:[className] Extensions.kt、つまりFooExtensions.kt しかし、より一般的には、オペレーティングクラスまたはオブジェクトの内部で必要な関数を記述します。


0

Javaでは、以下のように書くことができます

class MyClass {
  public static int myMethod() { 
  return 1;
  }
}

コトリンでは、以下のように書くことができます

class MyClass {
  companion object {
     fun myMethod() : Int = 1
  }
}

コンパニオンはKotlinでは静的として使用されます。


0

kotlinドキュメントプロバイダーは、3つの方法でそれを行うことができます。1つ目は、クラスなしでパッケージ内の関数を定義することです。

package com.example

fun f() = 1

2つ目は@JvmStaticアノテーションを使用する方法です。

package com.example

class A{
@JvmStatic
fun f() = 1
}

3番目は、コンパニオンオブジェクトを使用することです。

package com.example

clss A{
companion object{
fun f() = 1
}
}

-1

関数またはプロパティをインスタンスではなくクラスに関連付ける必要がある場合は、コンパニオンオブジェクト内で宣言できます。

class Car(val horsepowers: Int) {
    companion object Factory {
        val cars = mutableListOf<Car>()

        fun makeCar(horsepowers: Int): Car {
            val car = Car(horsepowers)
            cars.add(car)
            return car
        }
    }
}

コンパニオンオブジェクトはシングルトンであり、そのメンバーには、含まれているクラスの名前を介して直接アクセスできます。

val car = Car.makeCar(150)
println(Car.Factory.cars.size)

受け入れられた回答はすでにコンパニオンオブジェクトを記述しているようです。他の多くの答えもそうです。あなたの答えは何か新しいことを提供しますか?
Sneftel


-2

コンパニオンオブジェクトを使用できます-kotlinlang

最初にそのインターフェースを作成することで表示できます

interface I<T> {

}

次に、そのインターフェイス内に関数を作成する必要があります。

fun SomeFunc(): T

その後、クラスが必要です:

class SomeClass {}

そのクラス内では、そのクラス内にコンパニオンオブジェクトが必要です。

companion object : I<SomeClass> {}

そのコンパニオンオブジェクトの内部には古いSomeFunc関数が必要ですが、それを乗り越える必要があります。

override fun SomeFunc(): SomeClass = SomeClass()

最後に、そのすべての作業の下に、静的関数を強化するための何かが必要です。変数が必要です。

var e:I<SomeClass> = SomeClass()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.