2012-05-06 31 views
9

我想保留我的子類通用,並且我想要更改的是ArrayList的add(Object)方法,以便在您調用arrayList.add(null)時不會添加任何內容(ArrayList的正常實現將添加null;我希望它可以執行沒有)。Java - 如何子類化通用ArrayList,以便MyArrayList <foo>的實例將是ArrayList <foo>的子類?

+2

思想警察蜂擁在這一塊。 OP的要求已明確說明,我不明白爲什麼這個問題不能按照要求回答。 @fbafelip已經展示瞭如何去做。提到的代表團備選方案需要更多數量級的代碼。 – EJP

+4

有很多方法可以將元素添加到ArrayList (或任何List ):add(T),add(int,T),addAll(Collection ),addAll int,Collection )',通過構造函數,通過'Iterator '和'ListIterator '的'add'方法,並且通過以上述任何方式修改以'subList'返回的視圖。你需要處理所有這些嗎? – trutheality

+0

思想警察?真的,你會比較我的答案和極權主義國家嗎?因爲我使用的只是權威的一個論點......正確的疑難雜症。 –

回答

13

在這種情況下,你真的應該喜歡合成而不是繼承,因爲如果你忘記覆蓋ArrayList中添加/更改元素的方法之一(例如,你可能忘記覆蓋集合),它仍然是可能的有空元素。

但由於問題是關於如何繼承ArrayList中,這裏是你如何做到這一點:

import java.util.ArrayList; 

public class MyArrayList<T> extends ArrayList<T> { 
    public boolean add(T element) { 
     if (element != null) return super.add(element); 
     return false; 
    } 
} 
+0

如果您可以保證這是您修改數組列表行爲的唯一位置,則此解決方案是合理的,因爲此實現細節在外部是透明的。 – Jeremy

+0

你爲什麼不喜歡我的編輯版本?它在行爲上是相同的,但代碼更好(出於多種原因)。 – Bohemian

+1

@Bohemian我只是想保持它更明確,因爲它是一個示例代碼。 – fbafelipe

10

這是一個例子,你應該贊成合成而不是繼承。

而不是延長ArrayList,你應該創建一個類,它有一個ArrayList成員字段,並公開add方法做正確的事情。

閱讀Effective Java。這裏是專門描述這個問題的example

+2

我同意他應該贊成組合繼承,但也許他會傳遞ArrayList到外部庫,所以組合在這種情況下不起作用。他詢問如何將其子類化,而不是如果他應該。 – fbafelipe

+1

您的引用和示例不適用。 OP *特別希望*無論超類的行爲如何。 – EJP

+2

這確實不利於提問者。他的下一個問題是:>如何對泛型列表進行子類化,以使MyList 的實例成爲List 的子類? – xehpuk

0

你有沒有考慮實施一個過濾器,Add方法將被稱爲?如果它只從代碼中的一個地方被調用,那麼這可能是最簡單的。一個簡單的if語句可能工作。

if (input/object != null) { 
    arrayList.add(input/object); 
} 
else { 
    //do something else instead, or nothing 
} 
0

這是非常值得尊敬想限制什麼進入一個名單,但無論默默的說法值得商榷。不過,這就是爲什麼我們有Apache Commons Collections。可能有一個番石榴等價物。使用其中的一個來聲明final的子類ArrayList,所以沒有人可以顛覆你的意圖。

相關問題