【问题标题】:How to declare an ArrayList? [duplicate]如何声明一个 ArrayList? [复制]
【发布时间】:2012-06-15 11:45:36
【问题描述】:

可能重复:
Why should the interface for a Java class be prefered?

我对 java 比较陌生,我刚刚开始使用集合框架。 在ArrayList 上,我遇到了人们声明它的两种方式。例如声明ArrayListStrings :

List<String> l = new ArrayList<String>();

ArrayList<String> al = new ArrayList<String>();

我应该使用这两者中的哪一个,它们之间有什么区别?

我知道调用的实际方法是在运行时决定的,因此调用的方法都将属于 ArrayList 类,但第一个声明仍然限制了可以调用的方法。

我听说,第一种方法称为“对接口进行编码”。任何方法都将使用变量l 调用,因此只能调用List 接口提供的方法,而在第二个示例中,我们不仅可以调用List 提供的所有方法,还可以调用Object 提供的所有方法类也(如finalize()wait() 等)。那么为什么人们甚至首先使用第一个声明呢?

【问题讨论】:

  • 您仍然可以使用l 实例访问Object 类方法。
  • @PrinceJohnWesley: 我怎么能因为l 是一个接口的引用并且接口不属于Object 类的层次结构?
  • 每个对象都是Object 类型。 List&lt;T&gt;Object 的子类型
  • 但是List 是一个接口,我已经读到接口不属于类层次结构,那么如果它甚至不扩展它怎么能成为Object 的子类型呢? ?
  • 重点是你仍然可以通过它们各自的类实现的接口之一来引用对象。因此,当您说“List l”时,您的意思是“实现 List 的某个类或其他类的对象”。然后你可以在'l'上调用接口List的任何方法。你也可以调用 Object 上的任何公共方法——因为你可以(Object 是一个特殊的类)。

标签: java collections


【解决方案1】:

您应该始终使用尽可能少的特定接口。如果存在更合适的实现,这使得替换替代实现变得更容易。例如,采用List 的方法不关心列表是链表还是数组列表。您可以选择更合适的一个。

【讨论】:

  • 所以使用第一种方法的唯一原因是我们可以将它作为参数传递给更广泛的方法?即使它限制了可以从自身调用的方法?
  • ArrayList 上只有少数方法不在 List 上,您不太可能想调用它们。当我说“尽可能少的特定接口”时,我的意思是“使用一个接口,该接口包含您想要调用的所有方法,仅此而已”。
  • @SurenderThakran 是的,限制方法通常被视为一件好事。只允许访问哪些数据和方法是必要的。这降低了复杂性,从长远来看,减少了维护时间和错误。就个人而言,上下文菜单中也弹出了更少的方法;我不会在设计决策中非常重视这一点,但这是一个不错的好处:)
  • @sjr 我本来想请你澄清一下“最不具体的可能”,但你打败了我。您的说明是(恕我直言)在接口方面阐明最佳实践的完美方式。
  • 你们能否也对我在问题下方的 cmets 中提出的问题有所了解?
【解决方案2】:

我个人推荐使用List&lt;String&gt; l = new ArrayList&lt;String&gt;();

原因是您通常不需要知道您正在使用 ArrayList。您只需要像列表一样运行的东西。 ArrayList 上有很多人们不需要访问的行为。考虑“确保容量”。他们不需要那个 - 他们只需要 List 操作。作为一般规则,您希望在“需要知道”的基础上限制数据和功能的公开,并且您列表的用户不需要知道(默认情况下)您使用了什么实现。

显然,例如,如果他们确实需要知道您使用的是 ArrayList 而不是 LinkedList,那么您可能希望使用 ArrayList 引用而不是 List 引用。但对于大多数用途而言,这不是必需的。

【讨论】:

  • 是的,但使用List 也限制了可以从中调用的方法,正如我在问题中提到的那样。那么在List 之外提供的方法是否没有那么重要,以至于我们选择忽略它们进行封装?
  • 正确 - 查看我对 sjr 的回答的回复。
猜你喜欢
  • 2014-03-08
  • 2016-01-13
  • 2016-07-19
  • 2021-02-21
  • 1970-01-01
  • 2023-03-19
  • 2015-08-10
  • 2020-12-30
  • 1970-01-01
相关资源
最近更新 更多