2016-02-01 53 views
3

我想定義一個具有ArrayList作爲其參數之一的類。 ArrayList的條目應該是最終的。在我的理解中,簡單地聲明該類的ArrayList屬性爲'final'將無法實現此目的,因爲它僅表示對此列表的引用是最終的。我怎樣才能聲明列表中的條目被視爲'最終'?具有最終條目作爲類屬性的Java ArrayList

public class MyClass{ 

    private final ArrayList<Double> classAttributeWithFinalValues; // the entries of the list can still be changed 


    public MyClass(ArrayList<Double> classAttribute){ 
     this.classAttributeWithFinalValues = classAttribute; 
    } 
} 
+0

我很高興能夠糾正,但我認爲你最好的選擇就是讓類類型不可變(即所有公共final字段)。 –

+0

您可以通過最終的方式來防止重新分配集合,並且您可以通過使用J8不可修改的集合來防止添加/刪除,但我認爲任何東西都不能阻止您在對象上使用setter,以免造成setter :) –

+2

First ,你應該使用'List'而不是'ArrayList'。其次,由於'Double'已經是不可變的,所以'UnmodifyableList'中的給定'List'的**拷貝就足夠了 - 'this.list = Collections.unmodifiableList(new ArrayList <>(list)) '。 –

回答

0

的ArrayList始終是可變的,如果你想列表爲不可變的,你可以創建自己的列表實現,不允許add()操作正在興建之後,或者乾脆用番石榴的ImmutableList。該列表使用生成器類建成,一旦建成,它不能被修改:

ImmutableList<String> myList = ImmutableList.<String>builder().add("a").add("b").build(); 
myList.add("c"); //Throws UnsupportedOperationException 

如果,另一方面,你只想要條目是不可改變的,而不是地圖本身,則取決於您放入列表中的對象。您在代碼片段中使用的Double已經是不可變的。但是如果你想讓可變對象不可變,你必須將它們封裝在不允許訪問setter方法的包裝器中,或者確保返回存儲的原始項目的副本。

+0

雖然這確實回答了這個問題,但它是一個僅鏈接的答案。它不包含任何代碼來解釋如何使用它。而且,當我建議加入一個(真正相當大的)第三方庫時,我會期待一些理由來解釋爲什麼JDK解決方案(防禦性拷貝和不可修改的收集)是不合適的。 –

+0

這不回答這個問題imho。 Op正在詢問如何使ENTRIES不可變,而不是集合(即添加/刪除)。雖然問題可能是模棱兩可的,那就是他的意思。 –