2010-07-18 15 views
0

我真的不知道標題是否合適。關於在Java中使用ArrayList的問題?

我有兩個選擇: 選項1:

Class A { 
    ArrayList<B> BList = new ArrayList<B>(); 

    public B[] getBList() { 
     return (B[])BList.toArray(); 
    } 
} 

Class Facade { 
    public B[] getAllB(){ 
     A a = new A(); 
     return a.getBList(); 
    } 
} 

選項2:

Class A { 
    ArrayList<B> BList = new ArrayList<B>(); 

    public ArrayList getBList() { 
     return BList; 
    } 
} 

Class Facade { 
    public B[] getAllB(){ 
     A a = new A(); 
     ArrayList BList = a.getBList(); 
     return (B[])BList.toArray(); 
    } 
} 

我應該使用哪一種方式?

+0

通過返回的數組'ArrayList.toArray'實際上將有'對象[]'一個運行時類型。施放它可能會產生意想不到的後果... – 2010-07-18 13:55:03

回答

0

我認爲唯一的區別是類A是否是組件的公共接口的一部分。

如果不是(例如,只有門面計數到公共接口),那麼它並不重要

如果A類是公共接口的一部分,我會與選項1

+0

A類實際上對用戶隱藏,GUI將直接與門面類 – 2010-07-18 12:36:36

1

去,我沒有強烈的偏好無論哪種方式。但是,我注意到你正在使用一個數組來返回列表的內容,可能是爲了使它不可變。我推薦使用Collections.unmodifiableList

+0

交互良好的基本想法。我更喜歡Google的Guava Immutable集合對象,因爲它們是爲通用類型安全設置的。 – fishtoprecords 2010-07-18 16:48:07

0

除非你真的需要,對於類似圖像的東西,本地formt是bytes [],應該總是在一個API中返回Collection類型,而不是一個數組。在你的案例中使用Collections.unmodifiableXXX(...)包裝原始的集合。

3

使用集合類,除非您有特定的理由使用數組。所以,我會選擇選項2.

對於您的代碼還有許多其他意見。

首先,這是更好地program to an interface, not an implementation - 使成員變量BListAList<B>而不是ArrayList<B>。此外,成員變量應該是private(除非有很好的理由不要private)。第三,儘可能使用泛型 - 爲什麼您的方法getBList()返回原始ArrayList? Java中變量的事實上的命名標準是camel case,以小寫字母開頭。所以不要叫成員變量BList,但bList(或其他,更好的名字)。

class A { 
    private List<B> bList = new ArrayList<B>(); 

    public List<B> getBList() { 
     return bList; 
    } 
} 

真的有必要爲類Facade返回一個B[]

還有一點要考慮的是使A類不可變的,因爲如果你從A對象獲取列表意想不到的事情會發生,然後從列表中選擇A對象中添加或刪除元素(該列表會也會被改變,這可能會令人困惑)。你必須在你的getBList()方法返回列表的只讀視圖:

public List<B> getBList() { 
    return Collections.unmodifiableList(bList); 
} 
+0

謝謝,對我來說非常有用。我修改了它:) – 2010-07-18 15:54:06