2017-05-16 29 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