2017-05-16 26 views
0

我有几个与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

问题1:为什么有必要将字段定义为私人最终?

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

问题2:为什么最终需要私人。当我们宣布该字段为最终字段时,它将不会在课程以外显示出来吗?

最后一句是不正确的;使场final不会让它在课堂以外不可见。让它在课堂外不可见是关键字private的作用。

问题3:为什么我们不能将它公开为最终?

您可以制作它public final,但字段通常应该是private,并且只能由类中的方法直接访问。

+1

q1)不完全正确,因为公共final int无法修改 – Michael

+0

嗨,感谢您的回复。对于第2点,它是输入错误,我的意思是私人。问题2:为什么最终需要私人。当我们将该字段声明为PRIVATE时,它将不会在课程外部显示出来吗? –

+0

@KamalVerma'private'并不直接与类是否是不可变的。关于不可变的一点是:在构造并初始化对象之后,不应该可以更改状态(成员变量)。 – Jesper

1

问题1:为什么有必要将字段定义为私人最终?

不,它不是。 final对于不变性已经足够了。

问题3:为什么我们不能把它公开最终的?

我们可以做到这一点。
在你的例子int empId是不可变的(作为任何原语)。
所以使得empIdpublicprivate而它声明为final(即包含它的类的实例化后不重新分配)将不会改变学生的状态。

通常,不建议提供带有public修饰符的字段,因为它违背了OOP的封装原则。

问题2:为什么最终需要与私人。当我们 宣布该字段为final时,它将不会在课堂以外显示出来吗?

没有,final修改器只有它是什么以上,但无论如何描述为解释的,你的情况(原始),使得现场可见或不可见有它的不变性不发病,而这是final

+0

“一般来说,不建议使用公共修饰符提供字段,因为它会破坏封装原理机制”吸气剂正在以同样的方式破坏封装 – Michael

+0

@Michael大部分时间都是这样。但它有一个区别:使用方法获取值非常灵活,因为它允许使用多态性,逻辑,验证,缓存等等......你无法通过字段访问来完成。 – davidxxx

+0

根据定义,吸气剂始终打破封装。你真的*说的是,声明它'public'比提供getter更不灵活。封装被破坏了。 – Michael