accessor / mutator中的浅/深拷贝语义

时间:2011-09-12 11:24:02

标签: java

对于访问者/变异者和浅/深拷贝,最佳做法是什么?或者这个问题是否与当前的情况有关?

public class Test {
    private final Point point = new Point(-32, 168);
    public void getPoint{
       return point
    }
}

我目前的想法是使用深拷贝来处理任何可变的东西;因此,如果Point提供了一个setter,我会在Test#getPoint中使用深层复制。

现状是什么?

[编辑]

JB Nizet回答之后,我发现了this很有用的资源。

1 个答案:

答案 0 :(得分:2)

这取决于。有时您想要返回对象的引用,并让调用者修改它。有时您想要返回副本。在Point的情况下,副本似乎更合适。

保护班级状态的另一种方法是返回你的领域的不可修改的视图。这可以通过将返回类型声明为仅提供只读方法的接口来完成,或者,如在Java集合api中,通过返回提供与对象相同的接口的包装器对象,但在调用mutator方法时抛出异常。

无论您选择何种解决方案,关键是记录您的方法的作用。