いつもありがとうございます。
質問
kotlinではインタフェースにプロパティを持てますが、バッキングフィールドを持てず、プロパティ移譲もできません。
当然、インタフェースのプロパティに by lazy での遅延初期化はできません。
結果、「呼び出し時に初期化され、その後は再計算されず値を保持しておいてもらう」プロパティをインタフェースできません。
- 上記の認識はあっていますか?
- 「インタフェースは実体がないのだから、by lazy によって値を保持させることはできないのは当然」という認識であっていますか?
- 下記に示したように抽象クラスであれば実現可能ですが、「呼び出し時に初期化され、その後は再計算されず値を保持しておいてもらう」プロパティを持つ共通インタフェース(抽象クラス)の実現にはこの方法が最適だと思いますか?
ソースコード
インタフェースによる記述
kotlin
1interface Hoge { 2 val a get() = 3 + 5 // 呼び出し毎に毎回計算される 3 // val b by lazy { 4 + 8 } // インタフェースはプロパティ移譲できないのでこの記述はできない 4} 5 6class Fuga : Hoge { 7 val c by lazy { 4 + 8 } // 呼び出し時に初期化され、その後は再計算されず値を保持される 8}
抽象クラスによる記述
kotlin
1abstract class Hoge { 2 val a get() = 3 + 5 // 呼び出し毎に毎回計算される 3 val b by lazy { 4 + 8 } // ←OK 4} 5 6class Fuga : Hoge() { 7 val c by lazy { 4 + 8 } // 呼び出し時に初期化され、その後は再計算されず値を保持される 8}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/13 03:54
2017/06/13 05:06
2017/06/13 05:18