Java

【Java】mutableとimmutableとは

こんにちは、ともです。

JavaSilverの取得を目指して学習中でして、「mutable」と「immutable」というものを知りました。

それらについて理解したことをまとめ記事にしたいと思います。

結論から

  • mutableとはフィールドを変更可能なオブジェクト
  • immutableとはフィールドを変更不可能なオブジェクト

順をおって解説していきます。

英語の意味

  • mutable・・・【可変】
  • immutable・・・【不変】

を表します。変更可能かどうかどいうことですね。

Javaでは変更可能なオブジェクトをimmutableオブジェクトと呼びます。

では、immutableオブジェクトとはどのようなものかサンプルを示します。

サンプル

// ① finalで継承でず、サブクラスでsetterを作れない
 public final class ImmutableClass {
		// プライベートで外部から参照できない。②
		private int num;
		
		public ImmutableClass() {
			num = 1;
		}
		// setterが存在しない。③
}

Immutableなクラスを作成してみました。

Immutableオブジェクトはフィールドを変更することができません。

ですので、

  • フィールドはprivateで外からアクセスできない
  • setterが存在しない
  • クラスをfinalで宣言し、サブクラスからの変更できない
  • 可変オブジェクトを提供するgetterが存在しない

上記の条件が揃ったオブジェクトはimmutableなオブジェクトです。

java.lang.Stringクラスもイミュータブルなクラスです。インスタンスを生成すると後から値を変更することはできません。新しい文字列を扱いたい場合は、新しいインスタンスを生成する必要があります。

イミュータブルにする目的

もしオブジェクトがイミュータブルであったなら、オブジェクトの複製はオブジェクト全体の複製ではなく、単に参照の複製で済む。参照は通常オブジェクト自体よりもずっと小さいので(典型的にはポインタのサイズのみ)、メモリが節約でき、プログラムの実行速度もよくなる。(Wiki参照)

Wikipediaには上記のように記述されていました。

イミュータブルであれば、いくらインスタンスを生成しても同じものしか生まれて来ません。

つまり、1つインスタンスを生成してしまえば、後はそれを参照するだけで良いのです。

まとめ

immutableとmutableについて理解をまとめました。

たまに見かけるimmutableという言葉。とても難しそうに聞こえますが単純なクラスですね。クラスの設計手法の一つとして覚えておきましょう。