【问题标题】:Can you extend ArrayList in Java?你可以在 Java 中扩展 ArrayList 吗?
【发布时间】:2011-06-14 07:56:30
【问题描述】:

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

【问题讨论】:

  • @Rakesh Juyal 是的,我确实尝试过,但遇到了一些问题。所以我只是在确定。

标签: java arraylist extend


【解决方案1】:

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

public class ProductCollection{

    ArrayList<Product> products;

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

【讨论】:

    【解决方案2】:

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

    大多数时候,这对任何人都不是好主意。想象一下,您添加了一些功能并获得ExtList1 extends ArrayList。你的一所大学增加了不同的独立功能,所以你有ExtList2 extends ArrayList。现在你同时想要它们,但你不走运。

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

    这些都是委托获胜的情况。 someone has created the base already 的时候不用再啰嗦了。


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

    【讨论】:

      【解决方案3】:

      正如许多其他人所说,是的,您可以扩展类ArrayList,但这不是您通常应该做的事情;这在 Java 中不被认为是好的做法。

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

      因此,如果他们有一个类 Person 并且他们需要一个人员列表,他们将创建一个类 PersonList 来扩展 C# 等效的 ArrayList&lt;Person&gt;。

      如果您需要Person 对象的列表,Java 中的常见习惯用法只是使用ArrayList&lt;Person&gt;,而不是为此创建特定的子类。

      我建议你坚持常用的 Java 做事方式,不要创建自己的 ArrayList 或其他集合类的子类。

      【讨论】:

      • 你好。既然您建议不要覆盖该类,那么当将项目添加到列表时,我将如何获取回调?
      • @Sipty 对于这样的事情,你真的想添加新功能而不是仅仅使用特定类型参数(如我上面的描述),在我看来创建一个子类是合法的.
      • @Sipty Overriding 是一个选项,但想象一下你的大学添加了不同的独立功能,所以你有ExtList1 extends ArrayList 和ExtList2 extends ArrayList。现在你同时想要它们,但你不走运。或者您需要具有不同基本列表实现的相同功能(可能是LinkedList,尽管使用它几乎总是错误的)。这些都是委托获胜的情况。 someone has created the base already 的时候不用再啰嗦了。
      【解决方案4】:

      是的,你可以。

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

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

      【讨论】:

      • 当然要重命名它比 ArrayList 更棒的东西。 -> 列表 l = new MySuperAwesomeSandwichMakingConstantTimeLookupSwissArmyList();
      • 对不起,我太笨了,但是 E 是什么意思?
      • @IchHabsDrauf 创建 ArrayList 时,需要指定列表将保存的类型。例如“新的 ArrayList()”。因此 E 是类型的占位符(在本例中是字符串)。这称为“通用类型”。如果您创建 MyArrayList 的实例,您将这样做:new MyArrayList()。这会将“String”类型传递给 ArrayList 的泛型类型,从而创建 ArrayList. 的父级
      【解决方案5】:

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

      但最佳做法是委托而不是扩展。 见:Decorator pattern

      【讨论】:

      • 嗯...不是最佳实践在所有情况下都使用委托而不是继承。您应该根据具体情况做出决定。
      【解决方案6】:

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

      【讨论】:

      • 你可以扩展任何在 Java 中不是 final 的类。但该类还需要至少有一个公共构造函数。
      猜你喜欢
      • 2010-10-21
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 2011-09-27
      相关资源
      最近更新 更多