创建不可变类时将字段设为私有有什么好处?
我见过为什么在创建不可变类时,字段被声明为私有?但我没有从这篇文章中理解任何内容。
有人可以向我解释一下吗?
最好的解释方法是举个例子:
public class Immutable {
private final char[] state = "Hi Mom".getChars();
public char[] getState() {
return state.clone();
}
}
这里我们有一个正确封装的、不可变的类。没有什么可以改变状态(模数讨厌的反射技巧)。
现在让我们更改该字段的访问权限:
public class Immutable {
public final char[] state = "Hi Mom".getChars();
public char[] getState() {
return state.clone();
}
}
请注意,我们仍在 getState 中制作防御性副本...像以前一样...但现在有人可以这样做:
Immutable mu = new Immutable();
mu.state[1] = 'o';
...我们所谓的不可变对象的状态已经改变了。
这就是为什么保留这些字段是个好主意的原因之一private
。 (显然,这仅适用于类型为可变引用类型的字段。)
第二个原因是封装。将字段声明为私有会隐藏实现细节,从而降低不必要的交叉耦合的风险。如果我不这样做,那么我(或其他一些程序员)可能会试图编写依赖于内部结构的代码Immutable
。如果我需要改变它们,这会导致问题;例如改变类型state
to String
。问题如“还有更多代码需要检查/更改”。
第三个原因是非私有(特别是public
) 字段可能会成为子类化的障碍。如果我将一个字段声明为public
那么,我不能未申报它在一个子类中。如果我想隐藏字段或修改子类中字段的行为(通过覆盖)......我不能。相比之下,如果该字段是私有的并且通过实例方法访问,我可以override子类中的那些方法。或者我可以选择根本不使用该字段。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)