yujiro's blog

「インターネット上で正しい答えを得る最善の方法は、質問することではない。間違った答えを投稿することだ」by ウォード・カニンガム

Kotlin でby キーワードを使ってコレクションオブジェクトを簡単に実装する

コレクションオブジェクトを実装する際、Kotlin だとby キーワードを使って実装をシンプルにすることができます。

例えば、

data class SampleData(
    val title: String,
    val body: String
)

という値オブジェクトがあり、これを内包するSampleCollection というものを定義します。

data class SampleCollection (
    private val list: List<SampleData>
) {

    val size: Int
        get() = list.size

    fun get(index: Int): SampleData {
        return list.get(index)
    }
}

list プロパティは直接参照されたくないので、private にし、コレクションオブジェクトが必要なメソッドを実装してlist プロパティに転送します。

これはよく見られるコレクションオブジェクトのパターンですが、Kotlin の場合これをシンプルにできます。

data class SampleCollection (
    private val list: List<SampleData>
) : List<SampleData> by list

とします。

: List

ですので、SampleCollection がList インタフェースを実装しているという形になり、

by [property名]

で指定されたプロパティにメソッドを転送できます。

使用してみましょう。

val sampleData = SampleData(
    "SampleTitle",
    "SampleBody"
)
val sampleCollection = SampleCollection(listOf(sampleData))

sampleCollection.size // => 1

val sampleData = sampleCollection.get(0)

sampleData.title // => SampleTitle