【发布时间】:2011-12-27 06:29:04
【问题描述】:
我想扩展 ArrayList 为特定类添加一些方法,该类的实例将由扩展的 ArrayList 保存。下面是一个简化的说明性代码示例。
这对我来说似乎很明智,但我对 Java 还是很陌生,而且我看到了其他不鼓励扩展 ArrayList 的问题,例如 Extending ArrayList and Creating new methods。我对 Java 的了解不够,无法理解这些反对意见。
在我之前的尝试中,我最终在 ThingContainer 中创建了许多方法,这些方法本质上是传递给 ArrayList,因此扩展似乎更容易。
有没有更好的方法来做我想做的事情?如果有,应该如何实施?
import java.util.*;
class Thing {
public String name;
public int amt;
public Thing(String name, int amt) {
this.name = name;
this.amt = amt;
}
public String toString() {
return String.format("%s: %d", name, amt);
}
public int getAmt() {
return amt;
}
}
class ThingContainer extends ArrayList<Thing> {
public void report() {
for(int i=0; i < size(); i++) {
System.out.println(get(i));
}
}
public int total() {
int tot = 0;
for(int i=0; i < size(); i++) {
tot += ((Thing)get(i)).getAmt();
}
return tot;
}
}
public class Tester {
public static void main(String[] args) {
ThingContainer blue = new ThingContainer();
Thing a = new Thing("A", 2);
Thing b = new Thing("B", 4);
blue.add(a);
blue.add(b);
blue.report();
System.out.println(blue.total());
for (Thing tc: blue) {
System.out.println(tc);
}
}
}
【问题讨论】:
-
Jon Skeet 的回答包括“我不会扩展 ArrayList 除非我真的不得不这样做,我更喜欢组合而不是继承”或“正如许多其他人所说,是的,你可以扩展类 ArrayList,但这不是你通常应该做的事情;这在 Java 中被认为不是好的做法。”来自stackoverflow.com/questions/4779173/…。但是,从您和其他答案来看,我似乎误解了。
-
就我个人而言,我倾向于避免子类化 JDK 类,因为在实现中可能会发生我无法控制的更改,或者会破坏我不知道的扩展中的某些内容——那里在依赖超类行为时偶尔会出现微妙的“陷阱”,而我们并不总是考虑,或者如果我们没有实现细节,则无法考虑。
-
@DaveNewton,这个问题不是同样适用于使用 JDK 类吗?
-
你的意思是只使用它们而不子类化它们?
-
那是不同的,因为类方法的所有使用都由类控制。我会在几分钟内在我的答案中添加一个小插曲。