2011-03-30 54 views
11

的ArrayList是什麼在聲明集合作爲這樣我應該聲明/初始化的ArrayList的列表,的ArrayList,或<Cat>

public class CatHerder{ 
    private List cats; 
    public CatHerder(){ 
     this.cats = new ArrayList<Cat>(); 
    } 
} 
//or 
public class CatHerder{ 
    private ArrayList cats; 
    public CatHerder(){ 
     this.cats = new ArrayList(); 
    } 
} 
//or 
public class CatHerder{ 
    private ArrayList<Cat> cats; 
    public CatHerder(){ 
     this.cats = new ArrayList<Cat>(); 
    } 
} 

回答

22

你應該聲明爲List<Cat>的差異,並將其初始化爲ArrayList<Cat>

List是一個接口,ArrayList是一個實現類。對接口進行編碼幾乎總是可取的,而不是實現。這樣,如果您稍後需要更改實施方案,則不會中斷針對該接口進行編碼的消費者。

根據您實際使用列表的方式,您甚至可以使用較不具體的java.util.CollectionList延伸的接口)。

至於List<Cat>(您可以讀作「貓的列表」)與List:這是Java的generics,它確保編譯時類型的安全。簡而言之,它讓編譯器確保List只包含Cat對象。


public class CatHerder{ 
    private final List<Cat> cats; 
    public CatHerder(){ 
     this.cats = new ArrayList<Cat>(); 
    } 
} 
+2

並將其標記爲最終,如果您只在構造函數中設置它。 – Puce 2011-03-30 15:14:55

+0

@Puce:好點。 – 2011-03-30 15:16:49

+0

我以前見過這個說法被多次使用過。但是在什麼情況下你會發現有必要聲明接口類型?是否有用例初始化特定的集合類型,向其添加數據,然後稍後改變他對集合類型的看法? – 2014-11-26 13:06:09

1

爲了確保類型安全,因爲如果一個泛型類型沒有類型參數當前Java編譯器會抱怨,你應該始終明確指定型 - 或<?>如果你真的不在乎。

也就是說,除非您使用特定於ArrayList類的內容,否則應該使用List<Cat>來避免將代碼綁定到特定的List實現。

4

我會做以下事情。

public class CatHerder{ 
    private final List<Cat> cats = new ArrayList<Cat>(); 
} 
+1

6年後,假設java 7+我更喜歡用列表初始化cats =新的ArrayList <>();.我從eclipse聲納插件中選擇了這個。引用Sonar規則id 2293,「Java 7引入了菱形運算符(<>)以減少泛型代碼的冗長性,例如,不必在其聲明和構造函數中聲明List的類型,現在可以簡化構造函數用<>聲明,編譯器會推斷出這個類型。「 – kyle 2017-09-07 22:06:33

1

正如馬特所說,使用最常見的接口/超類是最好的方式去這裏。 確保始終聲明出現在列表中的類型,所以使它成爲一個List<Cat>甚至List<? extends Cat>

如果在以後的某個時候,你要替換的ArrayList有,比如說,一個LinkedList,你不會必須更改聲明,但僅限於實例化。

1

ListArrayList更具靈活性,List<Cat>List更安全。所以List<Cat>是不錯的選擇。

1

首先,List是一個接口,ArrayListList界面(實際上,它的子類AbstractListimplements List)的實現。因此List cats = new ArrayList()有效,因爲ArrayListis-aList

對於此:

private List cats; 

cats變爲原始型(有以通用類型沒有提到用於List),它並沒有被參數化。

你的第三個解決方案是正確的(它解決你的問題的選項1),

private ArrayList<Cat> cats; 

已界定的泛型類型EList<E>一個類型Cat。因此,cats的實例化是有效的,因爲通用邊界是相同的。

你的第二個解決方案允許只有ArrayListcats可以實例化。其他2個選項允許您實例化任何對象,例如是-alList,例如, LinkedList