你能用Java扩展ArrayList吗?

时间:2011-01-24 06:18:01

标签: java arraylist extend

是否可以创建一个扩展ArrayList的子类?如果是这样,怎么样?

6 个答案:

答案 0 :(得分:20)

是的,你可以。

public class MyArrayList<E> extends ArrayList<E>
{
}

但是,我不确定你为什么要这样做。

答案 1 :(得分:16)

您可以在Java中扩展任何非 final 的类。话虽如此,如果没有 true is-a 关系,你应该避免继承。考虑用于重用的组合。阅读Liskov substitution principle

答案 2 :(得分:9)

正如许多其他人所说,是的,你可以扩展课程ArrayList,但这不是你通常应该做的事情;它不被认为是Java的好习惯。

我主要是一名Java程序员,但过去几个月我一直在研究C#代码。如果你需要一个特定类型的集合,我觉得扩展标准集合类似乎是C#中常见的习惯用法(我实际上不知道它是否是一般的常用成语 - 至少编写代码的人是我'我一直在这样做。)

因此,如果他们有一个类Person并且他们需要一个人员列表,他们就会创建一个类PersonList,它扩展了与ArrayList<Person>相当的C#。

如果您需要ArrayList<Person>个对象的列表而不是为此创建特定的子类,Java中的常用习惯就是使用Person

我建议你坚持使用常见的Java方式,而不是创建自己的ArrayList子类或其他集合类。

答案 3 :(得分:2)

ArrayList不是最终类,它提供了公共构造函数,因此从技术上讲它可以扩展。

但最佳做法是委托而不是延伸。 请参阅:Decorator pattern

答案 4 :(得分:0)

试一试。这个类不是最终的,它的构造函数是公共的,所以你可以。但是,初学者可能不是一个好主意。

大多数时候,任何人都不是个好主意。想象一下,您添加了一些功能并获得ExtList1 extends ArrayList。您的大学添加了不同的独立功能,因此您拥有ExtList2 extends ArrayList。现在你想要他们两个,你运气不好。

或者您需要具有不同基本列表实现的相同功能(可能是LinkedList,尽管使用它几乎总是错误的)。再次,运气不好。

这些都是授权获胜的情况。在someone has created the base already时,它不需要更详细。


我只会继承ArrayList,如果有充分理由做到这一点。根据适当的JMH基准,可能还有一些非常极端的性能要求。

答案 5 :(得分:0)

正如其他人所说,扩展java lang数据结构是一个非常糟糕的主意。 但是,如果您想要在集合类中隔离某些逻辑,我建议使用以下解决方案:

public class ProductCollection{

    ArrayList<Product> products;

    public Product getByCode(String code) {
       // ... your logic goes here.
    }
}