Kotlinにおける「イミュータブル(immutable)」とは、「変更不可能な状態を持つオブジェクト」や「再代入・要素の変更ができないコレクション」を指します。主に安全性と予測可能性を高める目的で使用されます。
1. イミュータブルの基本概念
イミュータブルとは、一度作成されたらその状態(値や構造)が変更されないという性質を持つものです。特にKotlinでは、変数の宣言方法やコレクションの種類によってミュータブル(mutable)かイミュータブルかが区別されます。
2. 変数のイミュータブル性
Kotlinでは、変数を val で宣言すると、その参照を再代入することはできません(イミュータブル参照)。一方、var は再代入可能です。
※ただし、val であってもオブジェクトの中身(プロパティやリストの要素など)がミュータブルであれば変更可能です。
3. イミュータブルなコレクション
Kotlinは標準ライブラリで、イミュータブルとミュータブルの両方のコレクション型を提供しています。以下が代表的なイミュータブルなコレクションです:
| コレクション型 | 作成関数 | 特徴 |
|---|---|---|
| List | listOf() |
要素の追加・削除が不可 |
| Set | setOf() |
要素は一意、変更不可 |
| Map | mapOf() |
キーと値のペアが固定 |
例:イミュータブルなList
4. ミュータブルとの違い
| 種類 | 作成関数 | 特徴 |
|---|---|---|
| イミュータブル | listOf() |
要素の変更・追加不可 |
| ミュータブル | mutableListOf() |
要素の追加・削除・変更が可能 |
ミュータブルなListとの比較例
5. なぜイミュータブルが重要か
-
スレッドセーフ:状態を変更しないため、マルチスレッド環境でも安全。
-
バグの抑制:不意の状態変更を防止できる。
-
関数型プログラミングとの親和性:Kotlinでは関数型スタイルも推奨されており、副作用のない設計に貢献する。
6. より厳密な不変性を求めるには
val + イミュータブルなコレクションを組み合わせても、内部オブジェクトの変更は可能な場合があります。完全な不変性が必要な場合は、以下を意識する必要があります:
-
コレクション内のオブジェクト自体もイミュータブルにする(例:
data classの全プロパティをvalにする) -
外部からの変更手段を排除する設計にする(カプセル化)
まとめ
-
Kotlinのイミュータブルは「変更不可能な状態」を意味し、主に
valとlistOfなどで実現される。 -
ミュータブルとの明確な区別があるため、用途に応じた使い分けが可能。
-
安全性・保守性・並行性に優れたコードを書くために有効。
生成日:2025/05/04