2017-12-15 4 views
1

私はあなたが見ることができるようにKotlinKotlinのコンストラクタの引数にプライベート修飾子を追加するときの違いは何ですか?

class ConcreteItem(val title: String) : Item() { 

} 

class ConcreteItem(private val title: String) : Item() { 
} 

で書かれた以下の2つのコンストラクタの違いについてはよく分からない、唯一の違いは、タイトルの前に「プライベート」修飾子ですフィールド。タイトルフィールドの範囲にはどのような影響がありますか?

+0

'private'はそれをインスタンスによく公開し、valはパブリックゲッターを持っています - ヒント:デコンパイルされたコードを見てください。 –

+0

@ s1m0nw1 "プライベート"をコードとしてマークするだけでなく、正しく実行することもできませんでした。 – Tom

答えて

5

次のコード:

class ConcreteItem(title: String) : Item() { 
    val title: String = title 
} 

不足:

class ConcreteItem(val title: String) : Item() { 
} 

はショートカットですのval titleためxplicitアクセス修飾子は、publicを意味:

class ConcreteItem(title: String) : Item() { 
    public val title: String = title 
} 

同様に、以下のコード:

アカウントにそれをとる
class ConcreteItem(title: String) : Item() { 
    private val title: String = title 
} 

、2つの宣言の間の差:

class ConcreteItem(private val title: String) : Item() { 
} 

でのショートカットであります単にパブリックプロパティとプライベートプロパティを宣言しています。

+0

とてもきれいな説明、私はそれが好きです – crgarridos

1

private修飾子を適用すると、パブリック "ゲッター"が合成されず、他のクラスが "title"の値を調べることができます。さもなければそうなるでしょう。

-1

ほとんどの場合、クラス内のすべてのコードでコンストラクタ引数を使用できます。これは、コンストラクタパラメータからプライベートメンバ変数を作成する慣用的な方法です。

class ConcreteItem(private val title: String) {} 

Javaへのあなたが似ている場合、意味:

class ConcreteItem { 
    private final String title; 

    public ConcreteItem(final String title) { 
     this.title = title; 
    } 
} 
+0

'private'修飾子は、「クラス内のすべてのコードに対して」プロパティの利用可能性とは何の関係もありません。また、これは質問に答えません。 – hsl

+0

「クラス内のすべてのコードに」集中しないでください。私はちょうど彼らがそこに 'プライベート'を置く理由を言った。 –

+0

'これは、コンストラクタパラメータからプライベートメンバー変数を作る慣用方法です。これは私の答えです。しかし、私のサンプルコードを見てください。 –

関連する問題