不可变类字段查询
问题描述:
我有几个与immutable
类字段有关的问题。不可变类字段查询
假设我有一个类Student
:
public class Student {
private final int empId;
public int getEmpId() {
return empId;
}
public Student(int empId) {
this.empId=empId;
}
}
问题1:为什么它必须定义字段作为private
决赛?
问题2:为什么需要final
以及private
。当我们宣布该字段为final
时,它将不会在课程外部显示出来吗?
问题3:为什么我们不能做到public final
?
在此先感谢。
答
问题1:为什么有必要将字段定义为私人最终?
因为否则有可能添加修改字段的代码,然后它不再是不可变的。
问题2:为什么最终需要私人。当我们宣布该字段为最终字段时,它将不会在课程以外显示出来吗?
最后一句是不正确的;使场final
不会让它在课堂以外不可见。让它在课堂外不可见是关键字private
的作用。
问题3:为什么我们不能将它公开为最终?
您可以制作它public final
,但字段通常应该是private
,并且只能由类中的方法直接访问。
答
问题1:为什么有必要将字段定义为私人最终?
不,它不是。 final
对于不变性已经足够了。
问题3:为什么我们不能把它公开最终的?
我们可以做到这一点。
在你的例子int empId
是不可变的(作为任何原语)。
所以使得empId
public
或private
而它声明为final(即包含它的类的实例化后不重新分配)将不会改变学生的状态。
通常,不建议提供带有public
修饰符的字段,因为它违背了OOP的封装原则。
问题2:为什么最终需要与私人。当我们 宣布该字段为final时,它将不会在课堂以外显示出来吗?
没有,final
修改器只有它是什么以上,但无论如何描述为解释的,你的情况(原始),使得现场可见或不可见有它的不变性不发病,而这是final
。
q1)不完全正确,因为公共final int无法修改 – Michael
嗨,感谢您的回复。对于第2点,它是输入错误,我的意思是私人。问题2:为什么最终需要私人。当我们将该字段声明为PRIVATE时,它将不会在课程外部显示出来吗? –
@KamalVerma'private'并不直接与类是否是不可变的。关于不可变的一点是:在构造并初始化对象之后,不应该可以更改状态(成员变量)。 – Jesper