今週は第19回を開催しました。
前回の様子はコチラ↓
[第19回の様子]
2020/06/24に第19回を開催した。
参加メンバーは自分を含めて4人。引き続き、みんな在宅勤務中なので、それぞれオンラインミーティングルームに参加する形式で実施。今日もシンプルにSnap Cameraで背景を装飾して参加。相変わらずの冬毛。冬毛でドライバーを担当した。
勉強会本編の内容としては、Learn Kotlin by Exampleの第7章 DelegationのDelegated Properties
を途中まで進めた。
今回から、Learn Kotlin by Exampleのサイトに仕様変更が入り、サイト上でサンプルコードを実行できなくなっていた。もしかして使いすぎただろうか。申し訳ないというか、残念というか。今日のもやもやポイントその1。
とりあえず、ブラウザのタブを行ったり来たりするのが面倒だが、今後はpaiza.ioなど他のサイトで動作確認をすることに。
[学んだことや疑問点]
- Delegated Properties: 概要
- プロパティのget/setを
by
を利用して別のオブジェクトに移譲できる - そのオブジェクトは
getValue
とsetValue
のメソッドを持たなくてはいけない(不変オブジェクトの場合setterは不要)
class Delegate() { operator fun getValue(thisRef: Any?, prop: KProperty<*>): String { return "$thisRef, delegating '${prop.name}'!" } operator fun setValue(thisRef: Any?, prop: KProperty<*>, value: String) { println("$value to ${prop.name} in $thisRef") } }
- Paiza.io上でがんばって
getValue
の中で、KProperty
の実際の値にアクセスしようとしたが、うまくいかなかった。今日のもやもやポイントその2。 - どうやら、Kotlinでリフレクションを利用するには別途ライブラリの追加が必要らしい。オンラインエディタではあまり過激なことができないようになっているらしく、
${prop.value}
や${prop}
でプロパティの値にアクセスしようとしたが、うまく値を取得することができなかった - Delegated Properties: Standard Delegates
lazy
やobservable
といった標準ライブラリが提供するしくみがあるlazy
であれば、遅延初期化を行う。オブジェクト作成時にはプロパティはセットされず、初回のgetter呼び出し時のみ計算が実行される。
class LazySample { init { println("created!") } val lazyStr: String by lazy { println("computed!") "my lazy" } } fun main() { val sample = LazySample() // created! sample.lazyStr // computed! sample.lazyStr // 出力なし }
- サイトの解説では
lazy
をblockingLazy
にすることでスレッドセーフになる、と記載があったが、これも動作させることができなかった。もやもやポイントその3。 - 下記のサイトを参考に
import
文とDelegates.blockingLazy
方式にしたがコンパイルエラー。
class LazySample { init { println("created!") } val lazyStr: String by blockingLazy { // error: unresolved reference: blockingLazy println("computed!") "my lazy" } }
import kotlin.properties.Delegates class LazySample { init { println("created!") } val lazyStr: String by Delegates.blockingLazy { // error: unresolved reference: blockingLazy println("computed!") "my lazy" } }
- サイトが少し古いので、Kotlinのバージョンが変わって動作しなくなったりしたのだろうか。詳細は結局わからず...ただ、あまり使わない構文との声もあったので、いったんスルーすることに。出てきたらまた勉強しよう。
[まとめ]
今回は、「やったー!」を実施できる場面がほとんどなく、かわりにもやもやポイントが多かった。残念。
次回も引き続きDelegationを学んでいくぞ!