FLINTERS Engineer's Blog

FLINTERSのエンジニアによる技術ブログ

KotlinのMutableListって…

※この記事は、Kotlin1.0.0を元に書かれています

ゆのうえです。 KotlinのMutableListは要素の追加・削除を行うことができますが、Listクラスを継承しておりforEachなどのループ関数も使えます。 「え…そんなことしちゃって大丈夫? ま、まさか、ループを回すときImmutableな配列オブジェクトを生成して回してくれている…!?」などと妄想しました。

実装を見ればすぐ分かることですが。

public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit {
    for (element in this) action(element)
}

…Iterableの実装そのままです。 なので、次のようなコードは例外が発生します。

val list = mutableListOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
list.forEach {
    if (it == 5) list.remove(it)
}

ちゃんと別オブジェクトを生成すれば大丈夫。

val list = mutableListOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
list.toList().forEach {
    if (it == 5) list.remove(it)
}

MutableMapなども同じです。明示的にMutableと宣言する以上そういうものだということでしょうか。

Javaコードと混在するプロジェクトの場合などで意図せずMutableListを使う機会があるかもしれませんが、ループ処理の際はJavaArrayList同様に注意が必要です。

ちなみにmutableListOfで生成されるオブジェクトの実体はArrayListです。MutableListはKotlinでArrayListを扱うためのinterfaceとして存在する、という認識でよさそうです。