域对象的集合 - 组合与继承

时间:2012-06-20 14:54:59

标签: java oop

我最近一直在尝试扩展集合对象,而不是使用我的域对象的组合。例如,我将使用它:

public class Path extends ArrayList<PathElement> {
}

public static void main(String args[]) {
  Path path = new Path();
  path.add(new PathElement());
}

而不是:

public class Path {
  private List<PathElement> pathElements = new ArrayList<PathElement>();

  /* getter/setter*/

}

public static void main(String args[]) {
  Path path = new Path();
  path.getPathElements().add(new PathElement());
}

这是一种常见/可接受的做法吗?有任何缺点或更好的选择吗?我可以看到的一个缺点是实现无法轻易更改,因此您不能使用LinkedList而不是ArrayList。

2 个答案:

答案 0 :(得分:2)

你的第二种方法是正确的。除非您正在修改其行为或添加新行为,否则不应扩展内置数据结构类。

即使您修改或添加新行为,您的域对象也不应该扩展它们。相反,创建一个单独的类,扩展Map或List并在域对象中使用新类,如第二个代码块中所示。

答案 1 :(得分:0)

你的方法肯定是错误的。
你应该使用组合而不是继承。如果没有正确完成,继承“打破”封装并与实现细节耦合。这意味着您应该只在您的控制下扩展类并为扩展而设计。否则你可能会遇到麻烦