質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

2422閲覧

kotlinでインタフェースに遅延初期化プロパティを持たせる方法

mosa

総合スコア218

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2017/06/13 02:29

いつもありがとうございます。

質問

kotlinではインタフェースにプロパティを持てますが、バッキングフィールドを持てず、プロパティ移譲もできません。
当然、インタフェースのプロパティに by lazy での遅延初期化はできません。
結果、「呼び出し時に初期化され、その後は再計算されず値を保持しておいてもらう」プロパティをインタフェースできません。

  1. 上記の認識はあっていますか?
  2. 「インタフェースは実体がないのだから、by lazy によって値を保持させることはできないのは当然」という認識であっていますか?
  3. 下記に示したように抽象クラスであれば実現可能ですが、「呼び出し時に初期化され、その後は再計算されず値を保持しておいてもらう」プロパティを持つ共通インタフェース(抽象クラス)の実現にはこの方法が最適だと思いますか?

ソースコード

インタフェースによる記述

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

kotlinのinterfaceはJavaのinterfaceのようにmix-inできるものなので、JVMの制約(Javaの制約)により状態を持てないと思います(JVMのinterfaceにはインスタンスフィールドが許可されてないため)。lazyは状態を持つことを必要とする言語機能だと思いますので、そういう意味でkotlinのインターフェースでもやはり許可できないのだと思います。

1

Yesだと思います。

2

Yesだと思います。

3

lazyかどうかは実装にかかわるものだと思います。interfaceを利用者がみたとき、「このプロパティーにアクセスすると何が得られるか」が興味の中心であり「それがいつ計算されるか」は必要のない情報(実装側が良きに計らえばよいことであって利用者のあずかり知らぬ問題)だと思います。

つまりlazyは「インターフェースではない」と自分は思います。インターフェースは機能にどのようにアクセスすればよいかを規定するものですが、lazyであってもlazyでなくても利用者側から知らなくてすむので規定も必要ないという考え方ではないかと思います。いかがでしょうか?

投稿2017/06/13 03:35

編集2017/06/23 01:15
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mosa

2017/06/13 03:54

ありがとうございます。ものすごく腑に落ちる回答でした。 結果、「遅延評価させたい共通のプロパティ実装」を記述したい場合は、 abstract class (もしくは open class)で記載するのでベストでしょうか。
KSwordOfHaste

2017/06/13 05:06

そういうことになると思います。それは「実装を共有したい」という意図になると思うので。
mosa

2017/06/13 05:18

ありがとうございます。 わかりやすい説明で理解・納得することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問