class を持つ不変のライブラリがあると仮定しましょうImmutableFoo
:
scala> class ImmutableFoo(x: Int) {
def add(y: Int): ImmutableFoo = new ImmutableFoo(x + y)
}
defined class ImmutableFoo
もちろん、このクラスのオブジェクトは に追加y
することによってその状態を変更するのではなくx
、クラスの新しいオブジェクトを作成します。ここまでは順調ですね。
次に、不変のサブクラスを作成します。初挑戦:
scala> class subImmutableFoo(x: Int) extends ImmutableFoo(x)
defined class subImmutableFoo
しかし、数値を追加すると、サブクラスのオブジェクトは取得されません。
scala> (new subImmutableFoo(5)).add(6)
res0: ImmutableFoo = ImmutableFoo@1ee69d3
この問題を解決するためのベスト プラクティスは何ですか?
解決策の 1 つは、サブクラスのメソッドをオーバーライドして、サブクラスのオブジェクトを作成することです。この場合、この解決策は単純ですが、メソッドが大きくなると、多くの二重コード (基本クラス + サブクラス) が発生する可能性があります。または、複数のサブクラスを作成してメソッドをオーバーライドすると、さらに二重のコードになります。