イミュータブルは英語でImmutableと書きます。これを和訳すると「不変の」という意味になります。つまり、イミュータブルなクラスとは、不変なクラスのことです。
不変なクラスとはどういう意味かというと、「自身の値を書き換えないクラス」ということです。
イミュータブルなクラスは、オブジェクト自身の値を書き換えずに、処理の結果を別のオブジェクトに代入します。
イミュータブル(Immutable)なクラス:Stringクラス
Java
String str = "abcde";
String str2 = str.toUpperCase();
System.out.println("str:" + str);
System.out.println("str2:" + str2);
実行結果
str:abcde
str2:ABCDE
解説
「.toUpperCase()」メソッドは大文字の文字列を返すメソッドですが、str自身は大文字にならず、str2に大文字のオブジェクトを返しています。そのため、strは小文字のままで、str2が大文字になります。
イミュータブルなクラスを自作する
イミュータブルなクラスを作成するには以下の条件を満たす必要があります。
- クラスはfinalで宣言する。(オーバーライド等サブクラスからの変更を防ぐ)
- すべてのフィールドをprivateで宣言する。
- setterメソッドを提供しない。(オブジェクトの状態を変更不可にするため。)
- getterメソッドを提供しない。(オブジェクト内部に可変オブジェクトが存在した場合にそれを外部に提供させないため。)
Java
public final class SampleImmutable {
//フィールド
private final String str;
private final int num;
//コンストラクタ
public SampleImmutable(String str, int num){
this.str = str;
this.num = num;
}
//フィールド「str」に「です。」を付与して返すメソッド。
public String StrDesu(){
return str + "です。";
}
//フィールド「num」を2倍にして返すメソッド。
public int Twice(){
return num * 2;
}
}
解説
上記のクラスは、コンストラクタで値を初期化した後は、フィールドの値を変更することができなくなります。
異なる値を持たせたい場合は、新しいインスタンスを生成する必要があります。
ミュータブル(mmutable)なクラス:StringBufferクラス
Java
StringBuffer sbf = new StringBuffer("abc");
System.out.println("append前:" + sbf);
sbf.append("def");
System.out.println("append後:" + sbf);
実行結果
append前:abc
append後:abcdef
解説
append()メソッドを実行すると、オブジェクト自身の値が書き換えれ、「abcdef」になります。
以上で記事の解説はお終い!
もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!