2016-08-08 62 views
3

爲什麼要爲不可變類型聲明static final變量爲private聲明私有靜態最終變量的原因

在任何情況下是否可能對其聲明public有任何傷害?

+5

僅僅因爲這個字段是final的,並不意味着它引用的對象是不可變的,所以你可能仍然需要封裝它。 – Andreas

+1

記錄器是一個很好的例子,請參閱http://stackoverflow.com/questions/26241787/declaring-variable-final-and-static?rq=1 –

+2

或者只是任何不需要暴露的東西,以保持API小。 –

回答

3

因此,沒有人可以從外部訪問它並依賴該值,從而使您可以自由地改變它,而不會產生副作用(至少在聲明它的類之外)。

+0

此答案不完整。 @ A4L給出了一個更完整的答案。 –

0

將變量保持在適當的範圍內,這是最好的OOP練習。一個例子是一個全局靜態的最終整數,用於在類中執行一些計算。暴露(公開)不僅會造成問題,還會造成混亂。

說你有,你需要知道圓周率的值類:

public class MyClass { 
    private static final double PI = 3.14159; 

    //functions performing calculations with value of PI 
} 

圓周率的值只需要內MyClass,所以把它留給被暴露是沒有意義的 - 與所有的計算變量在MyClass之內完成。如果您再次需要它來執行計算,則應該在保持代碼組織的類的類中完成。

+0

_暴露(公開)不僅可能會導致問題,而且還會造成混淆。請詳細瞭解這一點。這是答案中有趣的部分。 –

+0

@SotiriosDelimanolis當然可以!沒有意識到我不得不更詳細地討論,但我很樂意。 –

3

有serveral的原因...

隱私

保持實施細則,從客戶端隱藏,用於內部使用例如常量只有與沒有使用客戶

安全

保護您的代碼免受惡意客戶端代碼侵害,例如:

static class A 
{ 
    public final static List<String> list = buildList(); 

    public static List<String> buildList() 
    { 
     ArrayList<String> list = new ArrayList<>(); 
     list.addAll(Arrays.asList("A", "B", "C")); 
     return list; 
    } 
} 

static class B 
{ 
    public static void main(String[] args) 
    { 
     A.list.clear(); 
     System.out.println(A.list); 
    } 
} 

你不想讓任何人操縱你的內部數據。

+0

我認爲你的例子與你的答案不一致。 'list'沒有真正的保護,可以修改。你可以防止它,如果生成列表將返回'Collections.unmodifiableList(Arrays.asList(「A」,「B」,「C」));' – user902383

+0

@ user902383這就是爲什麼的例子,即表明它不是因爲這個問題是關於'private static final'的問題,如果這個列表是公開的或者是受保護的,那麼它肯定會被一個不可修改的集合保護,就像你在你的評論或者副本中指出的那樣。 – A4L

+0

在你的列表聲明中使用什麼關鍵字並不重要,如果提供的實現將是'ArrayList',它的內容可能會改變。 – user902383

-2

靜態修飾符與最終修飾符一起也用於定義常量。最終修飾符表示該字段的值不能更改。

https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

如果聲明公共靜態最終變量,該變量就能夠看出來的網站它的類。如果有人試圖改變其他類中的值,它可能會在編譯時造成潛在的錯誤。

如果聲明靜態final變量爲private,則它隱藏在其他類中。所以你可以避免這樣的錯誤。