kdnakt blog

hello there.

会社でKotlin勉強会(第19回)を開催した

今週は第19回を開催しました。

 

前回の様子はコチラ↓

kdnakt.hatenablog.com

 

 

[第19回の様子]

2020/06/24に第19回を開催した。

 

参加メンバーは自分を含めて4人。引き続き、みんな在宅勤務中なので、それぞれオンラインミーティングルームに参加する形式で実施。今日もシンプルにSnap Cameraで背景を装飾して参加。相変わらずの冬毛。冬毛でドライバーを担当した。

 

勉強会本編の内容としては、Learn Kotlin by Exampleの第7章 DelegationのDelegated Propertiesを途中まで進めた。

 

今回から、Learn Kotlin by Exampleのサイトに仕様変更が入り、サイト上でサンプルコードを実行できなくなっていた。もしかして使いすぎただろうか。申し訳ないというか、残念というか。今日のもやもやポイントその1。

とりあえず、ブラウザのタブを行ったり来たりするのが面倒だが、今後はpaiza.ioなど他のサイトで動作確認をすることに。

paiza.io

 

[学んだことや疑問点]

  • Delegated Properties: 概要
    • プロパティのget/setをbyを利用して別のオブジェクトに移譲できる
    • そのオブジェクトはgetValuesetValueのメソッドを持たなくてはいけない(不変オブジェクトの場合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
    • lazyobservableといった標準ライブラリが提供するしくみがある
    • 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 // 出力なし
}
    • サイトの解説ではlazyblockingLazyにすることでスレッドセーフになる、と記載があったが、これも動作させることができなかった。もやもやポイントその3。
    • 下記のサイトを参考にimport文とDelegates.blockingLazy方式にしたがコンパイルエラー。

yyyank.blogspot.com

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を学んでいくぞ!