Javaに限らずだと思うけど「イミュータブル(immutable)」という言葉をよく聞く。
要は再代入するなって話。
もっと言うと「val」とか「final」つけやがれってこと。


例えば下記のように再代入できる場合はミュータブル

String hoge = "hoge";
hoge = "hoge";

これがイミュータブルになると

val hoge = "hoge";
hoge = "hoge"; ←コンパイルエラー

というように再代入不可になる。

また、イミュータブルの考えだとSetterを持たせない。

@Builder
@Getteer
public class HogeBuilder {

    private final Sting name;
    private final Integer age;

}

HogeBuilder hoge = HogeBuilder.builder().name("名前").age(20).build();


デメリット


分岐によって変数の値を変えたい場合は困ってくる。
例えば下記のようなイメージ(かなり乱暴なロジックだけど)
private String test(boolean isHoge){
   String hoge = "hoge1"; // 初期値

  if(isHoge){
    hoge = "hoge2";  ←ミュータブルだとOKだけどイミュータブルだとNG
   }
   return hoge;
}

こういう場面はreturnする等して再代入を避ける必要が出てくる。

※ちなみに上記の例だと三項演算子を使う方がよい。
private String test(boolean isHoge){
   return isHoge ? "hoge2" : "hoge1;
}


メリット

一度宣言した変数の状態が変わらないので可読性は大いに増す。

できたてほやほやの自分が作ったロジックなら細部まで理解しているので問題ないが、数か月数年後に見返した時や他人がメンテナンスする場合は問題が発生する。

ミュータブルな実装だとわざわざこの変数が今どの状態にあるか追いかけないといけなくなる。

イミュータブルであれば変更されないことが保証されているため状態を追う必要はなくなる。
保守性も格段にあがる。
他にもメリットがあるかもしれないがこれが最大のメリットだと思う。

ちなみに、再代入はできないけど配列等にaddしたりすることはできるので要注意。

まとめ

可能な限りイミュータブルでコード書きましょう!!
最近はイミュータブルじゃないと許してくれない現場が多くなってますからね~。
スポンサーリンク