Kotlin

KotlinのListにaddができない理由 (JavaとKotlinの違い)

KotlinのListにaddメソッドが存在しないので困った経験は無いですか?

この記事では、KotlinのListにaddメソッドが無い理由と、その解決策について記載しています。

実はこの問題は、JavaからKotlinに移行した人にこそハマりやすい問題かも知れません。

ゴイチ

JavaとKotlinのList の明確な違いについて、しっかりと理解して行きましょう!

結論

Kotlinの List型は、Immutable(不変の) List であり、コレクションの要素を追加や削除することはできません。
代わりに、Mutable(可変の) List を使用する必要があります。

解決方法

リストの生成方法をlistOfからmutableListOfに変更します。

listOf() -> mutableListOf()

具体例

以下、具体的なサンプルコードを元に説明します。

fun listExample() {
    val immutableList = listOf(1, 2, 3)
    val mutableList = mutableListOf(1, 2, 3)
    val arrayList = arrayListOf(1, 2, 3)

    immutableList.add(4)    // NG(コンパイルエラー)
    mutableList.add(4)      // OK
    arrayList.add(4)        // OK
}

listOf関数で作成されるリストは List<T>型であり、これは公式ドキュメント(List)にもある通り Read-onlyのImmutableなリストになります。

対して、mutableListOf関数で作成されるリストは MutableList<T>型で、公式ドキュメント(MutableList)にもある通り、Read/Writeが可能なリストになります。

ちなみに、arrayListOf 関数で作成されるリストはArrayList<T>型で、ArrayListはMutableListを実装しているので、Read/Writeが可能です。

plusメソッドについて

List型にplus というメソッド(正確には Collection<T>の拡張関数)があって、これを使って要素を追加することも出来ますがオススメしません

fun listExample2() {
    val immutableList = listOf(1, 2, 3)

    val newImmutableList = immutableList.plus(4)    // OK
}

plusの中の処理を見ると分かりますが、新しくArrayListのインスタンスを生成して元のリスト要素と追加要素を連結したものを返す処理になっているので、非常に処理効率が悪いです。

一度だけ呼び出すならまだしも、何度も plusを呼び出す様な処理を書くのは止めましょう。

何回も要素を追加する必要がある場合、素直にMutableListを使うべきです。

まとめ

最後に、この記事の内容をまとめます。

要点

  • listOfで生成されるインスタンスは Immutable (不変) なので、add / remove 出来ない
  • mutableListOfでリストを生成することで add / remove が可能になる
  • 効率が悪いので plus を使うことはなるべく避けよう

今回は、Kotlinで起こりがちな勘違い 「Listにaddができない」について解説しました。

JavaのListとは動きが違うので、戸惑った部分もあるかも知れません。

しかし、KotlinのListはJavaに比べて大きく改善されており、慣れれば非常に安全で使いやすいものです。

今回の記事を参考に、ぜひマスターしてみて下さいね!

ゴイチ

それではまた、他の記事でお会いしましょう!

この記事は役に立ちましたか?

  • この記事を書いた人
アバター画像

ゴイチ

ソフトウェアエンジニア歴20年。 C/C++, C#, Java, Kotlinが得意で、組込系・スマホ・大規模なWebサービスなど幅広いプログラミング経験があります。 現在は某SNSの会社でWebエンジニアをしています。

-Kotlin
-,