初学者ですが、個人的な勉強のためまとめました
##可変オブジェクト/不変オブジェクト
・オブジェクトに一度セットしたフィールドの値を、後から変更できるオブジェクトを可変(mutable)オブジェクト、変更できないオブジェクトを**不変オブジェクト(immutable)**という
・java.lang.Stringクラスやjava.io.Fileクラスのインスタンスは不変オブジェクトの代表例であり、
値を後から変更することはできない
新しい値を扱いたい場合は新しいインスタンスを作るしかないが、**「変数の値(オブジェクトに対する参照)を変更」するのであって、「オブジェクトの状態を変更」**するわけではないで、そこの違いをしっかり理解すべし
・不変なオブジェクトを定義するには以下のようにする
①オブジェクトの内部状態を変更可能なメソッドを提供しない(setterメソッドなど)
②クラスをfinalで宣言し、どのメソッドもオーバーライドされないことを保証する(サブクラスからの状態の変更を防ぐ)
③**全てのフィールドを"private final"**で定義する("final"の指定は必須ではないが、より明示的に不変クラスであることを宣言できる)
④内部に可変オブジェクトを保持している場合、そのオブジェクトを外部に提供しない。(getterメソッドなど)また、該当可変オブジェクトの値を内部的に変更しない