私は現在、反復ソルバーを実装しています。これは、特定の問題に対するソリューションの推定値を連続的に改善することによって機能します。ソリューションはかなり大きなデータ セットであるため、その場で絞り込みが実行されます。
反復が行われている間にアルゴリズムを監視できるようにするために、単純な Observer/Observable パターンを実装しました。特に、ソルバーはメソッドを提供します。
Foo getCurrentSolution()
解の現在の推定値を返します。オブザーバーは、現在の推定値に基づいて自由に計算を行うことができます (たとえば、解が十分であるかどうか、反復を停止できるかどうかを判断するため)。Foo
変更可能ですが、もちろん、オブザーバーが解の現在の推定値を変更すると、ソルバーの反復が台無しになる可能性があります。
したがって、getCurrentSolution()
実際には防御コピーを返す必要があります。しかし、これは大規模な問題では時間とメモリを必要とするため、新しいをgetCurrentSolution()
返すという別のアイデアを思いつきました。とほぼ同じインターフェースを持ち、データを変更する可能性のあるメソッドのみが「非アクティブ化」されます (例外がスローされます)。いくつかのダミー クラスのすべての詳細を以下に示します。ReadOnlyFoo(bar)
foo
ReadOnlyFoo
Foo
私の質問は次のとおりです。このアプローチは良い習慣ですか?より良いパターンはありますか?
ありがとう!セバスチャン
public abstract class AbstractFoo{
public abstract double getValue();
public abstract void setValue(final double x);
public abstract AbstractFoo add(AbstractFoo bar);
public void addToSelf(AbstractFoo bar){
setValue(getValue + bar.getValue());
}
}
public class Foo extends AbstractFoo{
private double value;
public Foo(final double x){
value = x;
}
public double getValue(){
return value;
}
public void setValue(final double x){
value = x;
}
public AbstractFoo add(AbstractFoo bar){
return new Foo(value + bar.getValue());
}
}
public final class FooReadOnly extends AbstractFoo{
private final Foo foo;
public FooReadOnly(AbstractFoo foo){
this.foo = foo;
}
public double getValue(){
return foo.getValue();
}
public void setValue(final double x){
throw new NotImplementedException("read only object");
}
public AbstractFoo add(AbstractFoo bar){
return foo.add(bar);
}
public void addToSelf(AbstractFoo bar){
throw new NotImplementedException("read only object");
}
}