我有一些与immutable
类字段相关的问题。
假设我有一个班级Student
:
public class Student {
private final int empId;
public int getEmpId() {
return empId;
}
public Student(int empId) {
this.empId=empId;
}
}
问题1:为什么必须将字段定义为private
final?
问题2:为什么需要final
以及private
。当我们将该字段声明为final
时,它将不会在课外显示?
问题3:我们为什么不能成功public final
?
提前致谢。
答案 0 :(得分:1)
问题1:为什么必须将字段定义为私人决赛?
因为否则有可能添加修改字段的代码,然后它就不再是不可变的了。
问题2:为什么需要和私人一起决赛。当我们宣布该领域为最终时,它将不会在课外显现?
最后一句话不是真的;制作一个字段final
并不会使它在课堂外不可见。在课堂外隐藏它是private
关键字的作用。
问题3:为什么我们不能将其公之于众?
您可以将其设为public final
,但字段通常应为private
,并且只能通过类中的方法直接访问。
答案 1 :(得分:1)
不,它不是。问题1:为什么必须将字段定义为私人决赛?
final
足以实现不变性。
问题3:为什么我们不能将其公之于众?
我们可以做到。
在您的示例中,int empId
是开箱即用的不可变的(与任何原语一样)
因此,empId
public
或private
在声明为final时不会更改Student的状态(在实例化包含它的类之后无法重新分配)。
一般来说,不建议提供具有public
修饰符的字段,因为它违反了OOP的封装原则。
问题2:为什么需要和私人一起决赛。就像我们一样 宣称该领域是最终的,它不会在课外看到吗?
不,final
修饰符只执行上面描述的内容,但无论如何,在您的情况下(原始),使该字段可见或不可见它的不变性{{1 }}