1. ホーム
  2. kotlin

[解決済み] Kotlinで'by'キーワードは何をするのですか?

2022-04-27 02:22:49

質問

アンドロイドの開発をしていると、時々このようなものに出くわすことがあります。

var someModel: someViewModel by notNullAndObservable { vm ->
  ...
}

の意味がよくわからない。 by というキーワードがあります。

どのように解決するのですか?

Kotlin リファレンス には、2つの使い方があります。 by 1つ目は 委譲されたプロパティ ということで、上記のような使い方をしています。

一般的なプロパティには、必要なたびに手動で実装することもできますが、一度だけ実装してライブラリ化できれば非常に良いものがあります。例えば、lazyプロパティ:最初のアクセスの時だけ値が計算される。 observableプロパティ:このプロパティの変更についてリスナーに通知されます。 プロパティを個別のフィールドではなく、マップに格納する。

ここでは、ゲッター/セッターを、作業を行う別のクラスに委譲し、共通のコードを含むことができます。 他の例として、Kotlinの依存性注入器のいくつかは、依存性注入エンジンが管理するインスタンスのレジストリから値を受け取るためにゲッターを委譲することによって、このモデルをサポートしています。

そして インターフェース/クラスの委譲 がもう一つの使用法です。

Delegationパターンは実装継承の良い代替案であることが証明されており、Kotlinはそれをネイティブでサポートしているので、定型的なコードは一切必要ない。DerivedクラスはBaseインターフェイスを継承し、そのパブリックメソッドを全て指定したオブジェクトに委譲することができる。

ここでは、インターフェイスを別の実装に委譲することで、実装クラスは変更したい部分のみをオーバーライドすればよく、残りのメソッドはより完全な実装に委譲することができます。

実際の例としては Klutter Readonly/Immutable コレクション ここでは、特定のコレクションインターフェイスを別のクラスに委譲し、読み込み専用の実装で異なる必要があるものをオーバーライドするだけです。 他のすべてのメソッドを手動でデリゲートする必要がなく、多くの作業を節約できます。

この2つをカバーするのが Kotlin言語リファレンス 言語の基本的なトピックについては、そこから始めてください。