2017-11-01 6 views
3

Kotlinコード:普通のオブジェクトに比べてコンパニオンオブジェクトの利点は何ですか?このような

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

は自明

object FooStatic { 
    fun a() : Int = 1 
} 

class Foo { 
    fun b() = FooStatic.a() 
} 

に変更することができ、私はコンパニオンオブジェクトは、実際のJavaの静的関数としての使用を可能にするために使用することができることを承知しているが、任意ですコンパニオンオブジェクトを使用する他の利点?

+0

この質問は本当に私の返事が適切となるように長すぎませんでした別の答え(https://stackoverflow.com/a/40352734/221955)、でコメントへの返信を置くためだけの場所ですコメントとして残しました。 –

答えて

2

重要な違いの1つは、メンバーの可視性です。 コンパニオンオブジェクトでは、メンバーがクラスの一部であった場合、それを含むクラスへの可視性があります。これは、生のオブジェクトには当てはまりません。

以下の例は、クラスのプライベート静的内部構造を実装するために「オブジェクト」を使用できないことを示しています。

package com.example 

class Boo { 

    companion object Boo_Core { 
     // Public "static" call that non-Boo classes should not be able to call 
     fun add_pub(a:Int) = a+1; 

     // Internal "static" call that non-Boo classes should not be able to call 
     private fun add_priv(a:Int) = a+1; 
    } 

    // OK: Functions in Boo can call the public members of the companion object 
    fun blah_pub(a:Int) = add_pub(a) 
    // OK: Functions in Boo can call the private members of the companion object 
    fun blah_priv(a:Int) = add_priv(a) 
} 

//Same idea as the companion object, but as an "object" instead. 
object Foo_Core { 
    fun add_pub(a:Int) = a+1 
    private fun add_priv(a:Int) = a+1; 
} 

class Foo { 
    // OK Foo can get Foo_Cors add_pub 
    fun blah_pub(a:Int) = Foo_Core.add_pub(a); 

    // ERROR: can not get to add_priv 
    // fun blah_priv(a:Int) = Foo_Core.add_priv(a); 
} 

class AnInterloper { 

    // OK Other classes can use public entries in Foo. 
    fun blah_foo_pub(a:Int) = Foo_Core.add_pub(a); 

    // ERROR Other classes can use public entries in Foo. 
    // fun blah_foo_priv(a:Int) = Foo_Core.add_priv(a); 

    // OK: Other classes can use public Boo classes 
    fun blah_boo_pub(a:Int) = Boo.add_pub(a); 

    // ERROR: Other classes can not use private Boo classes 
    // fun blah_boo_priv(a:Int) = Boo.add_priv(a); 
} 
+0

素晴らしい。あなたの説明をありがとうございました。 – Yajairo87

関連する問題