2016-07-14 5 views
82

「コンパニオンオブジェクト」の意味は何ですか?今のところ私はそれを必要とするときにJavaのstaticを置き換えるために使用しています。KotlinのJava静的フィールドの代わりに「コンパニオンオブジェクト」を使用するのはなぜですか?

私はと混乱しています:

  • それは "仲間" と呼ばれているのはなぜ?
  • 複数のスタティックのプロパティを作成するには、それをまとめてcompanion objectブロック内にグループ化する必要がありますか?
  • 即座クラスにスコープされたシングルトンインスタンスを作成するために、私はしばしば

を書く:

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

それを行うのunidiomatic方法のように思われます。より良い方法は何ですか?

答えて

64
  • "コンパニオンオブジェクト" の意図した意味は何ですか?なぜそれは "仲間"と呼ばれていますか?Kotlinはシングルトン状態と接続特性および機能を説明するための独自concept of objectsを有し、およびJavaクラスのstatic部分はエレガントなシングルトンで表すことができるので

    まず、KotlinはstaticメンバーのJavaの概念を使用しませんこれは、クラスの名前で呼び出すことができるシングルトンオブジェクトです。したがって、命名:クラスに付属するオブジェクトです。

    その名前はclass object and default objectであったが、その後はit got renamed to companion objectであり、より明確であり、またScala companion objectsと一致している。

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

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

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

    class MyClass { 
        object IO { 
         fun makeSomethingWithIO() { /* ... */ } 
        } 
    
        object Factory { 
         fun createSomething() { /* ... */ } 
        } 
    } 
    
  • は即座に、私は頻繁にやってのunidiomatic方法のように思われる/*...*/を書き、クラスにスコープされたシングルトンインスタンスを作成するにはそれ。より良い方法は何ですか?

    それぞれのケースで必要なものによって異なります。あなたのコードは、最初の呼び出し時に初期化されるクラスにバインドされた状態を格納するのに適しています。あなただけのオブジェクトの宣言を使用、クラスに接続することを必要としない場合

    :あなたはまた、財産を作るためにlazy { ... } delegationを削除することができます

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

    はちょうどJavaの静的同様に、最初のクラスの使用量に初期化します初期化子

    initializing singleton stateの便利な方法があります。

+0

ニースとイディオムの例。 – Trein

13

なぜ「コンパニオン」と呼ばれていますか?

このオブジェクトは、インスタンスのコンパニオンです。 はIIRC長い議論がここにありました:upcoming-change-class-objects-rethought

それは、複数の静的プロパティを作成することを意味しています、私はコンパニオンオブジェクトブロックの内部をグループ化することがありますか?

はい。すべての "静的な"プロパティ/メソッドは、このコンパニオン内に配置する必要があります。

即座クラスにスコープされたシングルトンインスタンスを作成するには、私は多くの場合、あなたは即座にシングルトンインスタンスを作成しない

を書きます。初めてsingletonにアクセスするときに作成されます。

これは、それを行うユニシスな方法のようです。より良い方法は何ですか?

シングルトンクラスを定義するには、object Singleton { }というよりむしろ。参照:Object Declarations あなたがSingletonのインスタンスを作成する必要はありません、ただ単にKotlinはあなたのコードを整理するために他のものを提供していますことを心に留めておくことSingleton.doWork()

のようにそれを使用しています。例えば、単純な静的関数の代替物が存在する。代わりにトップレベル関数を使用することができます。

0

なぜ「コンパニオン」と呼ばれていますか?

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

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

メンバーが修飾子として単にクラス名を使用して呼び出すことができます。

val instance = MyClass.create() 

あなただけの「仲間」なし「オブジェクト」を使用する場合は、次のようにしなければならない。

val instance = MyClass.Factory.create() 

私の理解では、「コンパニオン」は、このオブジェクトがアウトクラスとコンパニオンであることを意味します。

関連する問題