2009-05-21 104 views
0

我意識到我會因爲不僅僅是自己寫一個測試而感到憤怒...但是我很好奇人們的觀點,而不僅僅是功能,所以...這裏去...我可以通過getter直接添加到私人列表嗎?

我有一個擁有私人清單的班級。我想通過public getMyList()方法添加到該私人列表中。

所以...這項工作?

public class ObA{ 
private List<String> foo; 
public List<String> getFoo(){return foo;} 
} 

public class ObB{ 
    public void dealWithObAFoo(ObA obA){ 
    obA.getFoo().add("hello"); 

    } 
} 

回答

4

是的,這絕對有效 - 這通常是一件壞事。 (這是因爲你真的返回一個參考的集合對象,不是集合本身的副本。)

很多時候你想提供真正只讀的集合,這通常意味着訪問回國該集合是一個只讀包裝。使返回類型成爲由集合實現的只讀接口並返回實際的集合引用不會提供太多保護:調用方可以輕鬆地轉換爲「真實」集合類型,然後無任何問題地添加。

+0

感謝喬恩。在我的場景中,ObA是一個DTO,我通過一個服務類將其添加到其成員之一中...假設我想盡可能保持DTO儘可能沒有行爲,那麼您會建議什麼是首選方法(也就是說,我我喜歡基本上是一個虛擬的數據持有者,沒有業務邏輯)。 – 2009-05-21 21:31:40

+0

嗯...我的意思是我想*它是...我個人恐怕沒有辦法成爲一個虛擬數據持有者:) – 2009-05-21 21:32:31

+0

如果它*真的*意味着是一個「啞巴」類,並且它的所有客戶都會*知道*這個集合很可能是由其他呼叫者修改,那麼可以繼續使用它。我會非常明確地記錄這些 - 如下所示:「該屬性返回對後備集合的直接引用:通過此引用所做的任何更改都會被其他調用者看到。」 – 2009-05-21 21:34:19

2

事實上,不是一個好主意。不要將可變成員發佈之外,做一個副本,如果你不能提供一個只讀的飛行版本...

public class ObA{ 
    private List<String> foo; 
    public List<String> getFoo(){return Collections.unmodifiableList(foo);} 
    public void addString(String value) { foo.add(value); } 
} 
1

如果您想了解這樣的看法,我會刪除getFoo()呼叫,添加一個add(String msg)remove(String msg)方法(或任何其他功能,你想暴露)到ObA

1

給我的經驗似乎總是一件壞事 - 主要是因爲他們幾乎不可能控制一旦他們出去。我養成了從不允許直接訪問包含它們的課外集合的習慣。

這背後的主要原因是,幾乎總是有某種業務邏輯附加到數據集合 - 例如,驗證添加或可能某天您需要添加第二個密切相關的集合。

如果允許訪問像你說的是,這將是非常困難的,將來做這樣的修改。

哦,另外,我經常發現我最終要存儲與對象多一點的數據我存儲 - 所以我創建一個新的對象(僅適用於內,裏面收集了「集裝箱」之稱)和在把它放入集合之前,我把它放在裏面。

如果你已經把你的收藏鎖定了,這是一個簡單的重構。試着想象它會在你在哪裏,你沒有保持鎖定的收集工作的一些情況多麼困難...

1

如果你想支持添加和刪除功能,美孚,我建議的方法addFoo()和removeFoo()。理想情況下,您可以通過爲您需要的每項功能創建方法來消除getFoo。這就清楚了調用者將在列表中執行的功能。

相關問題