1. ホーム
  2. kotlin

[解決済み] なぜKotlinではJavaの静的フィールドの代わりのようなものとして「コンパニオンオブジェクト」を使うのか?

2022-04-22 19:50:57

質問

コンパニオンオブジェクトの意味を教えてください。今のところ、私は、Javaの static が必要です。

と迷っています。

  • なぜ、"companion"と呼ばれているのですか?
  • を複数作成するということでしょうか? スタティック プロパティの中でグループ化する必要があります。 companion object ブロックを作成しますか?
  • あるクラスにスコープされたシングルトン・インスタンスを即座に作成するために、私はよく次のように書きます。

:

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

というのは非日常的な方法のような気がします。何かいい方法はないでしょうか?

どのように解決するのですか?

  • <ブロッククオート

    コンパニオンオブジェクトの意図するところは何ですか?また、なぜコンパニオンと呼ばれるのですか?

    まず、KotlinではJavaの概念である static メンバは、Kotlinが独自の という概念で object s は、シングルトン状態に関連するプロパティや関数を記述するためのものであり、Java static の部分は、シングルトンでエレガントに表現することができます。そのため、「クラスに付属するオブジェクト」というネーミングになっている。

    その名前は、以前は class objectdefault 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 の静的イニシャライザのように、最初のクラスの使用時にプロパティが初期化されるようになります。

    また シングルトン状態の初期化 .