static
「コンパニオン オブジェクト」の意図する意味は何ですか? これまでは、必要なときにJava を置き換えるためにのみ使用してきました。
私は次のことに混乱しています:
- なぜ「コンパニオン」と呼ばれるのでしょうか?
- 複数の静的
companion object
プロパティをブロック内でグループ化する必要がありますか? - クラスにスコープされたシングルトンインスタンスを即座に作成するには、次のように記述することが多い。
:
companion object {
val singleton by lazy { ... }
}
これは慣用的な方法ではないようです。より良い方法は何でしょうか?
ベストアンサー1
-
「コンパニオン オブジェクト」の本来の意味は何ですか? なぜ「コンパニオン」と呼ばれるのですか?
まず、KotlinはJavaのメンバの概念を使用しません
static
。Kotlinには独自のobject
sの概念シングルトン状態に関連するプロパティと関数を記述するためのもので、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の静的初期化子のように、ファーストクラスの使用時にプロパティを初期化する役に立つ方法も見つかるかもしれませんシングルトン状態の初期化。