2025/10/06 20:46 Immutable Value

やあ、ロボ子!今日はValue Objectパターンについて話すのじゃ。

Value Objectパターン、ですか。オブジェクトのアイデンティティよりも、値が重要なオブジェクトのことですね。

そう!オブジェクトは通常、アイデンティティ、振る舞い、状態を持つけど、Value Objectは振る舞いと状態が特に重要なのじゃ。

なるほど。例えば、どんなものがValue Objectに該当するんですか?

例えば、色とか、日付とか、住所とかじゃな。これらはオブジェクトのアイデンティティよりも、その値自体が重要なのじゃ。

確かにそうですね。住所が変わったら、それは別の住所、別のValue Objectになりますね。

その通り!そして、Immutable Valueパターンは、Value Objectをさらに強力にするためのものなのじゃ。

Immutable、つまり不変にするということですね。Value Objectを不変にすると、どんなメリットがあるんですか?

一番のメリットは、並行処理が楽になることじゃ!オブジェクトの状態が変わらないから、複数のスレッドで同時にアクセスしても、競合状態が発生しないのじゃ。

同期処理が不要になるんですね!それは大きなメリットです。

そうじゃ!それに、エイリアシングの副作用も気にしなくていいし、コピーも不要になるのじゃ。`java.lang.String`クラスは、その良い例じゃな。

`String`クラスは不変なので、安心して共有できますね。

ただし、Immutable Value Objectは、値が頻繁に変わる場合には、メモリ割り当てが増えるというデメリットもあるのじゃ。

新しい値を作るたびに、新しいオブジェクトを生成する必要があるからですね。

そういうことじゃ。C++やAdaでは、`const`や`constant`を使って、不変な値を直接表現できるのじゃ。

Javaには、そのような機能はないんですね。

JavaでImmutable Value Objectを作るには、クラスを`final`にして、コンストラクタで値を設定し、setterメソッドを作らないようにする必要があるのじゃ。

少し手間がかかりますね。でも、それだけの価値はありそうです。

最後に、Circle-and-ellipse問題(またはSquare-and-rectangle問題)についてじゃ。これは、円が楕円の一種であるという直感的なステップから生じる問題を解決するものじゃ。

円と楕円の関係から、どのような問題が生じるんですか?

例えば、楕円の幅と高さを変更できるメソッドがあったとするじゃろ。円は幅と高さが同じだから、そのメソッドを使うと円でなくなってしまう可能性があるのじゃ。

なるほど。円は不変であるべきなのに、楕円のメソッドを継承してしまうと、不変性を保てなくなるんですね。

そういうことじゃ!Value ObjectとImmutable Valueパターンを理解することで、より安全で効率的なコードを書けるようになるのじゃ。…ところでロボ子、今日は何の日か知ってるか?

今日は…特に何もありませんが…何かありましたっけ?

今日は、私がValue Objectパターンを初めて理解した記念日なのじゃ!…って、ウソじゃぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
