这个问题在这里已有答案:
是否建议在final(Immutable)java类中为数据字段设置公共访问修饰符,即使数据字段不是对可变数据类型的引用或者我们应该直接访问数据字段,因为数据字段应该在构造函数本身中定义因此取消了改变类的内部表示的所有机会 . 请指教?
例如:
public class MainApp {
public static void main(String args[]) {
Immutablesample immutablesample = Immutablesample.getInstance("akkhil");
System.out.println(" Before modification " + immutablesample.getName());
immutablesample.name = "gupta";
System.out.println(" After modification " + immutablesample.getName());
}
}
尝试通过直接访问(不使用访问修饰符)以下类来更改数据字段的调用代码:
public final class Immutablesample {
private final String name;
private Immutablesample(String name){
this.name = name;
}
public String getName(){
return name;
}
public static Immutablesample getInstance(String name){
return new Immutablesample(name);
}
}
如果我将修饰符从私有字符串名称更改为公共私有字符串名称,它将如何使类更容易获得其内部表示形式; to public String name;由于对象是使用参数化构造函数创建的,因此具有不可变数据字段,为什么必须将数据字段设为私有?
2 回答
一般来说,显示一个类的内部表示是一个糟糕的决定,所以如果隐藏最终的不可变字段会更好 . 如果您的类类似于元组,那么您只能显示诸如字段,其中所有成员都是从外部使用的 .
遵循两个简单的规则:
尽量让全班成为"immutable" . 例如,仅通过构造函数设置私有final字段 . 使用"incoming"集合对象时,请考虑创建其内容的 copy ,以确保安全 .
请记住,好的OO是关于暴露 behavior ;不是暴露 data . 含义:除非你有充分的理由这样做,否则你绝对要做 not 想要公开领域 . 换句话说:你做 not 希望其他一些B类因为A类中某些字段的内容而做某事 . 以及防止这种情况的方法:将你的字段设为私有!