【问题标题】:Interface List - java [duplicate]接口列表 - java [重复]
【发布时间】:2011-03-02 17:34:35
【问题描述】:

可能的重复:
What does it mean to program to a interface?
Interface List - java

你好。我被要求在几个类中使用接口列表。我的老师说这是为了让将来更容易交换一个实现。我被要求尽可能用 List 替换 ArrayList,但我仍然不完全确定这意味着什么。我想我了解什么是界面,但不确定如何进行更改。

因此,例如,这是我应该使用 List 修改所有 ArrayList 位的类的第一部分。任何帮助表示赞赏

public class Simulator
 {
// Constants representing configuration information for the simulation.
// The default width for the grid.
private static final int DEFAULT_WIDTH = 70;
// The default depth of the grid.
private static final int DEFAULT_DEPTH = 40;

// List of animals in the field.
private ArrayList<Animal> animals;

【问题讨论】:

标签: java


【解决方案1】:

我怀疑您已被要求将 ArrayList 变量、参数等的任何 声明 替换为相应的 List 类型...但不是 实例化 .例如,如果你有

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

您可以将其替换为

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

构造函数调用仍然引用ArrayList,因为你不能直接实例化一个接口——但是该变量是接口类型来声明“我只使用这个接口中的东西;我不需要任何 ArrayList - 特定成员。”

【讨论】:

    【解决方案2】:

    这只是意味着你应该改变

    private ArrayList<Animal> animals;
    

    private List<Animal> animals;
    

    public void myMethod(ArrayList<Animal> someList) { ... }
    

    public void myMethod(List<Animal> someList) { ... }
    

    等等


    理由如下:如果您需要List,请要求List(而不是ArrayList)。然后你的方法更通用,因为它们适用于ArrayListLinkedList 或其他任何东西。

    如果您在可能的任何地方都有List&lt;Animal&gt;,则可以将ArrayList&lt;Animal&gt; 更改为LinkedList&lt;Animal&gt;,只需将要实例化的实际类型替换为new

    【讨论】:

      【解决方案3】:

      抢劫,

      接口提供了一个抽象层,您可以使用它来切换未来的实现。 想象一下:

      您可以使用 Kerberos 接口编写安全/身份验证系统,但也可以直接使用 Microsoft 的 Active Directory API 来执行相同的操作。 使用 API 更容易(当然,如果您已经知道的话)。但这会阻止您从 AD 更改为提供 Kerberos 接口的另一个解决方案。

      到目前为止一切顺利吗?

      这就是你的老师告诉你使用界面的原因。 List 是任何通用项目列表的接口。它可以通过多种方式实现,包括您自己的一种(他/她可能会要求作为另一个练习)。

      在你的代码中你所需要的只是改变

      private ArrayList<Animal> animals;
      

      private List<Animal> animals;
      

      由于 ArrayList 是 List 接口的一个实现,如果您使用 ArrayList,您会与此实现过度耦合,并且在不久的将来您可能需要更改为另一个实现(例如,为了安全起见,一个只读实现或使用内部哈希图来提高性能的混合实现,或者出于某种原因而不是仅使用内存的实现可以从内存交换到磁盘,反之亦然)。

      【讨论】:

      • +1 用于实际提供接口的解释以及另一个示例,这是问题中更重要的部分。
      【解决方案4】:

      你应该把它改成private List&lt;Animal&gt; animals.

      但是由于 List 是一个接口(因此没有任何构造函数),你不能拥有animals = new List&lt;Animal&gt;();

      您仍然应该使用private List&lt;Animal&gt; animals = new ArrayList&lt;Animal&gt;();

      【讨论】:

        猜你喜欢
        • 2014-11-30
        • 1970-01-01
        • 1970-01-01
        • 2018-01-16
        • 2012-11-27
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        相关资源
        最近更新 更多