Effective Java
項目13 不変性を選ぶの一部を引用。(各項目の説明部分は省略)
クラスを不変にするためには、次の5つの規則に従ってください。
1.オブジェクトを修正するためのいかなるメソッドも提供しない。
2.どのメソッドもオーバーライドされないことを保障する。
3.すべてのフィールドを final にする。
4.すべてのフィールドを private にする。
5.可変コンポーネントに対する独占的アクセスを保障する。
今までに書いたコードを思い出してみると、4番目の項目に反してるところ、結構あるよなぁ。
不変クラスが、基本データ型の値や不変オブジェクトへの参照を保持している public final のフィールドを持つことは、技術的に差し支えはないのですが、後のリリースで内部表現を変更することができなくなりますので、推奨されません。
つまり、不変クラスの属性を取得するための getter を作れということなのね。いちいち getter を作るってのは XP的には YAGNI に反するようにも思う。でも、もし内部表現を変更したくなったときを考えると確かにリファクタリングは容易ではない。
最近の開発ツールを使えば、getter なんて一瞬でコードジェネレーションしてくれるんだから、そのくらいは手間をかけてもいいような気がする。
「不変クラスのフィールドは public final で書いてもよい」としたコードの単純さよりは、「すべての属性には必ず getter でアクセスする」というルールの単純さを重視した方が方がいいのかもしれない。