在我的 Java 大学课程中,我了解了隐私泄露的概念,其中公共 getter 返回对私有可变对象的引用。
他们给出的示例如下:(如果语法不太正确,请原谅我,我正在记忆中工作)
private HashSet<*> priv = new HashSet<*>
public Collection<*> getPriv () {
return this.priv;
}
现在的问题是对象的客户端现在有机会故意或以其他方式破坏私有 HashSet。
在课程中,建议的解决方案是使用以下内容:
public Collection<*> getPriv () {
return Collections.unmodifiableCollection (this.priv);
}
这对我来说似乎是一个很好的解决方案,因为不仅对象的内部状态不受外部修改的影响,任何修改返回的 unmodifiableCollection 的尝试都会触发异常。但是,问题在于它仅适用于集合。似乎没有其他可变 Java 类的等价物。
从那以后,我读过的大多数 Java 书籍都建议以下内容:
public Collection<*> getPriv () {
return this.priv.clone ();
}
这适用于任何可克隆对象,但返回的对象可以修改为客户端对象的内容。对象的内部状态仍然受到保护,但现在如果我尝试修改无法真正修改的数据,我不会得到异常。这意味着我可能会在获取私有集合并对其进行修改时出错,并且对为什么我的更改没有反映在对象中感到困惑,因此我将一类错误(修改私有状态)换成了另一类(修改应该是不可变的克隆)。
是否有一种更通用的方法return Collections.unmodifiableCollection (this.priv);
可以与任何类(或至少任何满足某些先决条件的类,例如实现可克隆)一起使用,或者是我唯一的选择来实现我可能想要的所有私有类的可变和不可变版本通过吸气剂公开?