我目前正在实施迭代求解器,它通过不断改进对特定问题的解决方案的估计来工作。由于解决方案是一组相当大的数据,因此进行了适当的细化。
我已经实现了一个简单的 Observer/Observable 模式,以便能够在迭代发生时观察算法。特别是,求解器提供了一种方法
Foo getCurrentSolution()
它返回解决方案的当前估计。然后观察者可以根据当前估计自由地进行一些计算(例如:决定解决方案是否足够好以及是否可以停止迭代)。Foo
是可变的,但是当然,如果观察者修改了解决方案的当前估计,这可能会破坏求解器的迭代。
所以,getCurrentSolution()
真的应该回归防御副本。但这需要时间和内存来解决大问题,所以我想出了另一个想法,即getCurrentSolution()
返回一个 new 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");
}
}