MutableとImmutableオブジェクトの違いをJavaを例に解説

java

 

オブジェクトのmutableimmutableって何??

mutable(可変)」と「immutable(不変)」という意味です!

プログラミングの世界では、オブジェクトが「mutable(可変)」か「immutable(不変)」かということは非常に重要な意味を持ちます!

 

「mutable(可変)」と「immutable(不変)」特性はオブジェクトの振る舞いを左右し、それがプログラムの動作に大きな影響を及ぼします。

この記事では、Java言語を例に、mutableimmutableの違いについて解説していきます

 

MutableオブジェクトとImmutableオブジェクト

Mutableオブジェクト

Mutableオブジェクトとは、作成後にその状態や内容を変更できるオブジェクトのことを指します。

Javaにおいては、ほとんど全てのオブジェクトがmutableとなっています。

 

例えば、以下のコードはArrayListの内容を変更しています。

ArrayList list = new ArrayList();
list.add(1);  // リストに1を追加
list.add(2);  // リストに2を追加
list.set(0, 3);  // リストの最初の要素を3に変更


このように、ArrayListのインスタンスは、作成後にその内容を自由に変更することができます

 

 

Immutableオブジェクト

immutableオブジェクトとは、作成後にその状態や内容を変更できないオブジェクトのことを指します。

JavaではStringクラスがその典型的な例です

 

例えば、以下のコードは新しいStringオブジェクトを作成しています。

String str = "Hello";
str = str + ", World!";  // 新しいStringオブジェクトを作成


strは元の”Hello”という文字列を変更せずに、新しい”Hello, World!”という文字列を作成しています。

これはStringオブジェクトがimmutableであるため、その内容を直接変更することはできないからです

 

 

注意点

finalキーワードを使って参照自体をimmutableにすることも可能です!

ただし、これは参照先のオブジェクト自体がimmutableであることを保証するものではないという点に注意が必要です。

 

final ArrayList list = new ArrayList();
list.add(1);  // これは許可される
list = new ArrayList();  // これはコンパイルエラー


上記のコードでは、listはfinalキーワードにより再代入は不可能ですが、その内容(リストの要素)は変更可能です。

つまり、参照先のオブジェクト自体はmutableであるため、このリストは本質的にはmutableな状態を保持しています。

 

プログラムを設計する際には、オブジェクトがmutableであるべきか、それともimmutableであるべきかを慎重に考える必要があります。それぞれの性質が理解できていれば、より安全で効率的なコードを書くことができるでしょう!

 

 

まとめ

Javaにおけるオブジェクトのmutable性とimmutable性は、オブジェクトの振る舞いを決定する重要な要素です!

 

mutableオブジェクトは、
自由に変更でき、これはArrayListなど多くのクラスで見られますが、その結果予期せぬバグを生む可能性もあります。
immutableオブジェクトは、
一度作成された後に変わることがないため、より安定した振る舞いが期待できます。

 

注意点として
Javaではfinalキーワードを使って参照自体をimmutableにすることも可能ですが、それが参照先のオブジェクト自体がimmutableであることを保証するものではないという点があります。

 

これらの特性を理解し、適切に活用することで、より安全で効率的なプログラムを作成することができます。
プログラムを設計する際には、オブジェクトがmutableであるべきか、それともimmutableであるべきかを慎重に考え、それぞれの性質を最大限に活用しましょう!

コメント

PAGE TOP
タイトルとURLをコピーしました