gpt4 book ai didi

java - 将可变对象封装到只读对象中

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:55:48 24 4
gpt4 key购买 nike

我目前正在实现迭代求解器,它通过不断改进对特定问题的解决方案的估计来工作。由于解决方案是一个相当大的数据集,因此进行了细化。

我已经实现了一个简单的 Observer/Observable 模式,以便能够在迭代发生时观察算法。特别地,求解器提供了一种方法

Foo getCurrentSolution()

返回解的当前估计。然后,观察者可以根据当前估计自由地进行一些计算(例如:确定解决方案是否足够好以及是否可以停止迭代)。 Foo 是可变的,但当然,如果观察者修改解的当前估计值,这可能会破坏求解器的迭代。

因此,getCurrentSolution() 应该真正返回防御副本。但这在大问题上需要时间和内存,所以我想到了另一个想法,即让 getCurrentSolution() 返回一个新的 ReadOnlyFoo(bar),其中 foo 是解决方案的(可变)当前估计,对求解器私有(private)。这个想法是 ReadOnlyFoo 具有与 Foo 几乎相同的接口(interface),只是可能修改数据的方法被“停用”(它们抛出异常)。下面给出了一些虚拟类的所有详细信息。

我的问题是:这种方法是好的做法吗?有没有更好的模式?

谢谢!塞巴斯蒂安

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");
}
}

最佳答案

我会定义一个只包含只读方法的接口(interface) Solution 和一个包含所有方法的可变类 MutableSolution ,并使 getCurrentSolution() 方法返回一个 Solution 实例。这样,您不需要创建防御性副本或将您的解决方案包装到只读包装器中。

当然,观察者仍然可以将解决方案转换为 MutableSolution,但这并非偶然。如果您想保护自己免受强制转换,请编写一个 ReadOnlySolution 包装类来实现 Solution 并委托(delegate)给包装的 MutableSolution。这与您的提议类似,只是方法的签名清楚地表明对象是不可变的。

关于java - 将可变对象封装到只读对象中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7024577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com