Udemyの人気コースが今なら80%OFF!

【Java入門】イミュータブルなクラスとミュータブルなクラス

【Java入門】イミュータブルなクラスとミュータブルなクラス

イミュータブルは英語で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が大文字になります。

イミュータブルなクラスを自作する

イミュータブルなクラスを作成するには以下の条件を満たす必要があります。

  1. クラスはfinalで宣言する。(オーバーライド等サブクラスからの変更を防ぐ)
  2. すべてのフィールドをprivateで宣言する。
  3. setterメソッドを提供しない。(オブジェクトの状態を変更不可にするため。)
  4. 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」になります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です