2012-08-31 68 views
3

決賽和列表/ HashSets只好與使用Java中的final結構爲HashSetListSet辦公室查詢等意見對Java的

假設你有一個用戶名列表,你想要被更新。該列表本身不會重新初始化,只是它的值已更改。

然後問題是否用戶名變量應該是final或不。

private static final List<String> USERNAMES = new List<String>(); 
... 
USERNAMES.add("user1"); 

或者

private static List<String> usernames = new List<String>(); 
... 
usernames.add("user1"); 

我的問題是,其中,傳統上,你會不會用?

由於您可以修改列表的內容(您不能在列表實例本身中找到),因此可能會提出參數,意味着它不可修改,因此在此無效。因此,它並不是一個常數。

出於同樣的原因,可以說list是不可修改的,因此首都& final沒問題。

想法? Java公約會說什麼?

我真的對答案感興趣,並且相信這是一個問題。 Java約定必須對此有一個立場或評論。

回答

2

聲明它爲final可能是一個好方法。它基本上告訴你,你不能將final變量的引用改爲另一個實例。請注意0​​。一個static變量將使其成爲一個類變量,這意味着所有實例共享相同的引用。在某些情況下,這可能是完全錯誤的。當你需要每個實例擁有自己的用戶名實例時,你不會想要這樣做static

+0

謝謝你,我同意最終決定。如果變量不需要修改,總是比較安全。 靜態:這是部分重點,我們希望它能夠在課堂上共享。它提供了一個用戶名列表(比方說),該對象不需要每次構建。所以靜態很好。感謝指針,但。 –

1

首都通常用來暗示一個常量,通常是一個原始字符串或一個字符串,但有時可以引用一個對象。在實踐中,它們很少顯示爲基本的數據結構,如列表。我會說在這種情況下使用大寫字母是不好的形式。

將變量標記爲final的適當性取決於上下文,而它用於常量,這不是唯一的用途。如果它是適合列表永遠不會被再次分配,然後有一個小寫的最後例如,

private static final List<String> usernames = new List<String>();

將是最好的一段路要走。

+0

有點同意。大會說,但是,如果你有一個最終變量,它應該被大寫。降低它並不完全正確。不過,我確實認爲,在視覺上,它更有意義。這就是爲什麼我張貼在板子上:) –

-1

當談到

final關鍵字

的Java的Java集合(地圖,集合和列表)的背景下

,宣佈爲最終版本並不能讓他們unmodifyable。當我說收集/容器是可修改的/不可修改的,這實際上意味着我可以/不能修改它的內容。所以使用聲明它們的最終實際上意味着對該集合的引用是不可修改的,但是集合本身是可修改的。假設你想讓他們unmodifyable,你必須做的是,

UnmodifyableCollection<T> { 

    public boolean add(T t){ 
    throw new UnsupportedException(); 
} 

    public T remove(T t){ 
    throw new UnsupportedException(); 
} 

} 

像上述其中內容有任何添加/刪除是不允許的。 Collections.unmodifyXXX()方法做同樣的事情。

也最終關鍵字已經得到更爲廣泛的用途等

1)來限制的子類(使一個類不可變)

2)爲了限制方法覆蓋

3)來定義常量

還要小心,當你聲明一個靜態final的集合,因爲容器可用於所有的對象秒。檢查你的意圖是否真的需要這種設計,並確定你爲什麼要這樣做。

+0

感謝您的回答,但我知道它是可修改的並表達了這一點。 :)這是一個關於最終的適當性的問題,因爲它是參考文獻的最終結果(本質上)。 –

-1

將列表標記爲最終列表不會使列表不可修改。相反,將其標記爲最終只會使其無法重新初始化。

如果你真的想要一個不可修改的列表,我建議你看看Guava的ImmutableList

這裏給出一個從ImmutableList的文檔片段:

不同於Collections.unmodifiableList(java.util.List的),它是一個單獨的集合,仍然可以改變的視圖,ImmutableList的一個實例包含它自己的私人數據,並且永遠不會改變。 ImmutableList對於公共靜態最終列表(「常量列表」)來說很方便,並且還可以讓你輕鬆地爲調用者提供給你的類的列表製作一個「防禦副本」。