こんにちは、ともです。
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という言葉。とても難しそうに聞こえますが単純なクラスですね。クラスの設計手法の一つとして覚えておきましょう。