对于访问者/变异者和浅/深拷贝,最佳做法是什么?或者这个问题是否与当前的情况有关?
即
public class Test {
private final Point point = new Point(-32, 168);
public void getPoint{
return point
}
}
我目前的想法是使用深拷贝来处理任何可变的东西;因此,如果Point
提供了一个setter,我会在Test#getPoint
中使用深层复制。
现状是什么?
[编辑]
在JB Nizet
回答之后,我发现了this很有用的资源。
答案 0 :(得分:2)
这取决于。有时您想要返回对象的引用,并让调用者修改它。有时您想要返回副本。在Point的情况下,副本似乎更合适。
保护班级状态的另一种方法是返回你的领域的不可修改的视图。这可以通过将返回类型声明为仅提供只读方法的接口来完成,或者,如在Java集合api中,通过返回提供与对象相同的接口的包装器对象,但在调用mutator方法时抛出异常。
无论您选择何种解决方案,关键是记录您的方法的作用。