プロパティは初期化するか、抽象的である必要があります


121

馬鹿げた質問に違いありませんが、私はKotlinに本当に慣れていないので、解決策は見つかりませんでした。

クラスフィールドを宣言する方法は?私たちはそれをJavaで持つことができるように:

protected SharedPreferences mSharedPreferences;

そして後でonCreate()

mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

これで、このベースアクティビティのサブクラス内の任意の場所で使用できます。

私はコトリンでも同じことをしようとします:

protected var sharedPreferences : SharedPreferences

そしてでonCreate()

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

しかし、「プロパティは初期化するか、抽象的である必要があります」という警告が表示されます

回答:


186

コンストラクタの外でプロパティを初期化したい場合は、遅れて初期化されたプロパティを探します。lateinit修飾子を使用してプロパティを宣言します。これにより、その他の方法で必要なイニシャライザをスキップできるようになり、意味のある値が割り当てられるまで例外でプロパティアクセスが失敗します。

protected lateinit var sharedPreferences: SharedPreferences

12
「protected var sharedPreferences:SharedPreferences?= null」を使用しようとしましたが、これも機能しますが、何が違うのですか?
アントンシュクレンコ2015年

DIにDagger2を使用する場合、バリアントを使用する必要がありますね。
アントンシュクレンコ2015年

30
違いは、null以外の値をlateinitで宣言できることです。
Kirill Rakhman、2015年

15

可視化のためのアレクサンダーウダロフの回答からのコメントからこれを引き出します。null可能プロパティの場合:

protected var sharedPreferences : SharedPreferences? = null

...後で値を割り当てます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.