不可变类字段查询

时间:2017-05-16 08:59:07

标签: java immutability private final

我有一些与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

提前致谢。

2 个答案:

答案 0 :(得分:1)

  

问题1:为什么必须将字段定义为私人决赛?

因为否则有可能添加修改字段的代码,然后它就不再是不可变的了。

  

问题2:为什么需要和私人一起决赛。当我们宣布该领域为最终时,它将不会在课外显现?

最后一句话不是真的;制作一个字段final并不会使它在课堂外不可见。在课堂外隐藏它是private关键字的作用。

  

问题3:为什么我们不能将其公之于众?

您可以将其设为public final,但字段通常应为private,并且只能通过类中的方法直接访问。

答案 1 :(得分:1)

  

问题1:为什么必须将字段定义为私人决赛?

不,它不是。 final足以实现不变性。

  

问题3:为什么我们不能将其公之于众?

我们可以做到。
在您的示例中,int empId是开箱即用的不可变的(与任何原语一样) 因此,empId publicprivate在声明为final时不会更改Student的状态(在实例化包含它的类之后无法重新分配)。

一般来说,不建议提供具有public修饰符的字段,因为它违反了OOP的封装原则。

  

问题2:为什么需要和私人一起决赛。就像我们一样   宣称该领域是最终的,它不会在课外看到吗?

不,final修饰符只执行上面描述的内容,但无论如何,在您的情况下(原始),使该字段可见或不可见它的不变性{{1 }}