Kotlin で Java の静的フィールドの代わりに「コンパニオン オブジェクト」を使用するのはなぜですか? 質問する

Kotlin で Java の静的フィールドの代わりに「コンパニオン オブジェクト」を使用するのはなぜですか? 質問する

static「コンパニオン オブジェクト」の意図する意味は何ですか? これまでは、必要なときにJava を置き換えるためにのみ使用してきました。

私は次のことに混乱しています:

  • なぜ「コンパニオン」と呼ばれるのでしょうか?
  • 複数の静的companion objectプロパティをブロック内でグループ化する必要がありますか?
  • クラスにスコープされたシングルトンインスタンスを即座に作成するには、次のように記述することが多い。

:

companion object {
    val singleton by lazy { ... }
}

これは慣用的な方法ではないようです。より良い方法は何でしょうか?

ベストアンサー1

  • 「コンパニオン オブジェクト」の本来の意味は何ですか? なぜ「コンパニオン」と呼ばれるのですか?

    まず、KotlinはJavaのメンバの概念を使用しませんstatic。Kotlinには独自のobjectsの概念シングルトン状態に関連するプロパティと関数を記述するためのもので、staticクラスの Java 部分はシングルトンという用語で簡潔に表現できます。シングルトンは、クラス名で呼び出すことができるシングルトン オブジェクトです。これが名前の由来です。つまり、クラスに付属するオブジェクトです。

    その名前はかつてclass objectそしてdefault object、 しかしその後名前が変更されましたcompanion objectこれはより明確であり、またScala コンパニオンオブジェクト

    名前を付ける以外にも、Java メンバーよりも強力ですstatic。クラスとインターフェースを拡張でき、他のオブジェクトと同じように参照したり渡したりすることができます。

  • companion object複数の静的プロパティを作成するには、ブロック内でグループ化する必要があるということですか?

    はい、それが慣用的な方法です。または、意味によって非コンパニオン オブジェクトにグループ化することもできます。

    class MyClass {
        object IO {
            fun makeSomethingWithIO() { /* ... */ }
        }
    
        object Factory {
            fun createSomething() { /* ... */ }
        }
    }
    
  • クラスにスコープされたシングルトン インスタンスを即座に作成するために、私はよく次のように記述しますが、/*...*/これは慣用的な方法ではないようです。より良い方法は何でしょうか?

    それは、それぞれの特定のケースで何が必要かによって異なります。コードは、最初の呼び出し時に初期化されるクラスにバインドされた状態を保存するのに適しています。

    クラスに接続する必要がない場合は、オブジェクト宣言を使用します。

    object Foo {
        val something by lazy { ... }
    }
    

    削除することもできますlazy { ... }委任Javaの静的初期化子のように、ファーストクラスの使用時にプロパティを初期化する

    役に立つ方法も見つかるかもしれませんシングルトン状態の初期化

おすすめ記事