イミュータブル

Kotlinにおける「イミュータブル(immutable)」とは、「変更不可能な状態を持つオブジェクト」や「再代入・要素の変更ができないコレクション」を指します。主に安全性と予測可能性を高める目的で使用されます。


1. イミュータブルの基本概念

イミュータブルとは、一度作成されたらその状態(値や構造)が変更されないという性質を持つものです。特にKotlinでは、変数の宣言方法やコレクションの種類によってミュータブル(mutable)かイミュータブルかが区別されます。


2. 変数のイミュータブル性

Kotlinでは、変数を val で宣言すると、その参照を再代入することはできません(イミュータブル参照)。一方、var は再代入可能です。

kotlin
val name = "Kotlin" // name = "Java" // エラー: 再代入不可

※ただし、val であってもオブジェクトの中身(プロパティやリストの要素など)がミュータブルであれば変更可能です。


3. イミュータブルなコレクション

Kotlinは標準ライブラリで、イミュータブルとミュータブルの両方のコレクション型を提供しています。以下が代表的なイミュータブルなコレクションです:

コレクション型 作成関数 特徴
List listOf() 要素の追加・削除が不可
Set setOf() 要素は一意、変更不可
Map mapOf() キーと値のペアが固定

例:イミュータブルなList

kotlin
val fruits = listOf("apple", "banana", "orange") // fruits.add("grape") // エラー: 要素の追加不可

4. ミュータブルとの違い

種類 作成関数 特徴
イミュータブル listOf() 要素の変更・追加不可
ミュータブル mutableListOf() 要素の追加・削除・変更が可能

ミュータブルなListとの比較例

kotlin
val mutableFruits = mutableListOf("apple", "banana") mutableFruits.add("orange") // OK

5. なぜイミュータブルが重要か

  • スレッドセーフ:状態を変更しないため、マルチスレッド環境でも安全。

  • バグの抑制:不意の状態変更を防止できる。

  • 関数型プログラミングとの親和性:Kotlinでは関数型スタイルも推奨されており、副作用のない設計に貢献する。


6. より厳密な不変性を求めるには

val + イミュータブルなコレクションを組み合わせても、内部オブジェクトの変更は可能な場合があります。完全な不変性が必要な場合は、以下を意識する必要があります:

  • コレクション内のオブジェクト自体もイミュータブルにする(例:data class の全プロパティを val にする)

  • 外部からの変更手段を排除する設計にする(カプセル化)


まとめ

  • Kotlinのイミュータブルは「変更不可能な状態」を意味し、主にvallistOfなどで実現される。

  • ミュータブルとの明確な区別があるため、用途に応じた使い分けが可能。

  • 安全性・保守性・並行性に優れたコードを書くために有効。

生成日:2025/05/04