从方法返回可变对象的不可变副本

时间:2014-04-16 07:48:44

标签: java immutability

我有一些封闭的组件正在处理一些XML对象。我需要在此组件之外公开此对象,但我不想在组件之外允许对其进行更改。我怎么能完成这个?

3 个答案:

答案 0 :(得分:4)

确保您的对象有copy constructor,允许您制作深度克隆的班级副本。

然后在返回对象时调用它,例如

SomeClass instance = // ....


public SomeClass getInstance() {
  return new SomeClass(instance);
}

这不会使返回的对象不可变。但它不需要 - 您只是不希望外部代码更改您的数据副本。

答案 1 :(得分:2)

嗯,这是访问级别的倡导者; - )

如果您只是希望阻止来电者进行更改,那么它并不意味着它必须是[在您的包裹中]不可变的 - 它只是意味着它不应该是有一个[公共]方式来改变它:)我实际上是一个越来越多的粉丝,返回限制公共接口

例如:

// Option A with a "limiting public interface"
public interface Awesome {
    public String getText();
}

class MyAwesome implements Awesome {
    public String getText() {
       // ..
    }
    // Option B is to make setText non-public
    public void setText() {
       // ..
    }
}

然后你的代码可以返回Awesome,它没有[直接]提供改变对象的方式。

答案 2 :(得分:1)

我认为你需要创建另一个不可变的类,将你的对象作为参数(可能在构造函数中)。那么你应该只公开你的新类的实例。

这里有一些使对象不可变的提示:Immutable class?