【发布时间】:2014-04-16 16:03:32
【问题描述】:
我有一些封闭的组件正在处理一些 XML 对象。我需要在这个组件之外公开这个对象,但我不想允许在我的组件之外对其进行更改。我怎样才能完成这个?
【问题讨论】:
-
创建类及其所有字段
final。这样你可以一次创建对象并初始化所有字段,你将无法修改属性。
标签: java immutability
我有一些封闭的组件正在处理一些 XML 对象。我需要在这个组件之外公开这个对象,但我不想允许在我的组件之外对其进行更改。我怎样才能完成这个?
【问题讨论】:
final。这样你可以一次创建对象并初始化所有字段,你将无法修改属性。
标签: java immutability
确保您的对象有一个copy constructor,它允许您制作您的类的深度克隆副本。
然后在返回对象时调用它,例如
SomeClass instance = // ....
public SomeClass getInstance() {
return new SomeClass(instance);
}
这不会使返回的对象不可变。但这并不需要 - 您只是不希望外部代码更改您的数据副本。
【讨论】:
好吧,这里是访问级别的倡导者;-)
如果您只是希望阻止调用者进行更改,这并不意味着它必须是不可变的 [在您的包中] - 它只是意味着它不应该有 [ public] 改变它的方法 :) 实际上,我越来越喜欢返回 限制性公共接口。
例如:
// 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,它不会 [直接] 提供改变对象的方法。
【讨论】:
我认为您需要创建另一个不可变的类,将您的对象作为参数(可能在构造函数中)。那么你应该只公开你的新类的实例。
以下是使对象不可变的一些技巧:Immutable class?
【讨论】:
"I need to expose this object outside of this component"。我告诉他/她应该创建另一个不可变的类,创建该新类的实例并公开该新创建的对象而不是他想要公开的对象。