2017-08-14 11 views
1

でクラス変数を初期化するための正しい場所は何ですか:はkotlin

private class ViewHolder(view: View) { 
    val menuImg: ImageView 
    val txtMenu: TextView 

    init { 
     menuImg = view.find(R.id.menuImg) 
     txtMenu = view.find(R.id.txtMenu) 
    } 
} 

Bのinitブロック内のクラス変数を初期化:クラスのブロックに直接変数クラスを初期化

private class ViewHolder(view: View) { 
    val menuImg: ImageView = view.find(R.id.menuImg) 
    val txtMenu: TextView = view.find(R.id.txtMenu) 
} 

2つのコードの間で異なるものをなぜ ?。

+3

これらの間に違いはありません。 'init'ブロックは、プロパティの初期化に複数のステートメントが必要な便利な方法です。あなたのコードにはコンパイルできないキャスト式はありませんでした。 –

+0

2番目のコードスニペットで重複した '= menuImg'を見てください。宣言し、1つの場所に割り当てる。 (編集:うわ、あなたはそれを速く修正した!!) – AjahnCharles

+0

holi-java説明をありがとう。 –

答えて

1

これらのオプションAおよびBの実行には違いはありません。 (初期値を割り当てる)プロパティ初期化子と(初期化ブロックを使用して)Initializerブロック。しかし、コードのような単純な初期化の場合は、Property initializer - オプションBを使用するのが一般的です。

ただし、コードで両方のバージョンを使用する場合は、イニシャライザの実行順序に注意してください。 this articleから引用

まず、デフォルトコンストラクタの引数は、任意の委任コンストラクタの引数 続くあなたが直接呼び出すコンストラクタの引数 、で始まる、評価されます。次に、イニシャライザ(プロパティ イニシャライザとinitブロック)が、 がクラス内で定義された順に実行されます(上から下へ)。最後に、コンストラクタは で実行され、プライマリコンストラクタから開始し、 というコンストラクタが実行されるまで、デリゲートされたコンストラクタを介して の外側に移動します。

+0

それは非常に有用だった –