2012-05-06 27 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,所以没有人可以颠覆你的意图。

相关问题