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