【问题标题】:How to initialize List<E> in empty class constructor?如何在空类构造函数中初始化 List<E>?
【发布时间】:2011-02-22 09:33:59
【问题描述】:

以下代码显然不起作用,因为List&lt;E&gt; 是抽象的:

public class MyList {
    private List<E> list;

    public MyList() {
        this.list = new List<E>();
    }
}

如果我需要将list 变量设置为LinkedListArrayList(取决于我的需要),如何使用空构造函数初始化MyList 类?

【问题讨论】:

  • 列表未标记为最终列表。是否必须在ctor中初始化?
  • 是的,需要在构造函数中初始化。
  • 实用工厂类是否可以接受?从 cmets 我得到的印象是您希望实现类型可配置,并且建议使用 MyList 使用的工厂。
  • 我真的不知道那是什么,去调查...
  • 也许你需要弄清楚你需要什么,我们会找到如何得到它。我们知道您需要一份清单。但是为什么有时你需要一个 Linked 而其他人需要一个 ArrayList?如果你想添加很多项目,也许 Linked 是可以的,当它完成后你想要转换它......尝试找到你的类将具有的实际行为......

标签: java list arraylist abstract-class linked-list


【解决方案1】:
boolean shouldThisBeAnArrayList=true; // Set to false to use LinkedList
if(shouldThisBeAnArrayList) {
   this.list = new ArrayList<E>();

}
else {
   this.list=new LinkedList<E>();
}

【讨论】:

  • 就像我在另一条评论中所说的那样,这会破坏“空构造函数”的目的,不是吗?我的意思是,我需要以某种方式传递shouldThisBeAnArrayList 的值...
【解决方案2】:

我不确定这是否是你要问的......

public class MyList {
    private List<E> list;

    public MyList() {
        if (myNeeds)
            this.list = new LinkedList<E>();
        else
            this.list = new ArrayList<E>();
    }
}

【讨论】:

  • 有点...我想过这样的解决方案,但我在这里问,因为我想也许有更好的方法,不知何故。这不需要myNeeds 在构造函数中作为参数传递吗?这会破坏“空构造函数”的目的。
  • 那么,对象如何知道要使用哪种类型?它要么需要传递给构造函数,要么通过环境可用(例如一些单例类)。
【解决方案3】:

我认为您可以执行以下操作:

public class MyList<T> {
    private List<T> list;

    public MyList() {
        this.list = new ArrayList<T>();
    }
}

【讨论】:

  • 当我需要 LinkedList 而不是 ArrayList 时,这将如何工作?
  • @Nazgulled 你想在哪里配置列表类型?每个对象还是在某些启动属性文件中?
【解决方案4】:

您需要确定默认情况下的“您的需求”是什么 - LinkedList 或 ArrayList。如果你不能——比如说,如果需求根据对象生命周期内发生的事情而改变,那么列表也需要改变。

【讨论】:

  • 然后将其保留为空并按需创建,或者不使用默认构造函数。
【解决方案5】:

对于您想要实现的目标,有更好的选择:

  • 创建一个基类(抽象?)并覆盖它两次,一次用于 ArrayList,一次用于 LinkedList
  • 向您的类注入适当的列表(依赖注入)

【讨论】:

【解决方案6】:

List 是一个接口,因此无法构造。只能构造所述接口的实现(例如 ArrayList)。此外,您需要在构造时知道类型(E)。

这应该可行:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class MyList<E> {
    private List<E> list;

    public MyList(boolean linked) {
        if (linked) {
            list = new LinkedList<E>();
        } else {
            list = new ArrayList<E>();
        }
    }
}

【讨论】:

  • 这次有人建议我,但就像我说的那样,这不是违背了“空构造函数”的目的吗?但也许没有其他办法......:|
  • 你可以默认构造一个 LinkedList 并有一个方法 setListType 来构造一个新的 ArrayList 并将数据从 LinkedList 复制到其中。
【解决方案7】:

为什么不使用受保护的(可能还有abstract 方法),例如:

public abstract class MyList<T> {

    protected final List<T> list;

    public MyList() {
        list = createList();
    }

    public MyList(boolean preferLinked) {
        list = preferLinked? new LinkedList<T>() : new ArrayList<T>();
    }

    // Allows client code which subclasses from MyList to override the
    // default behaviour

    protected List<T> createList() {
        return new ArrayList<T>();
    }
}

【讨论】:

    【解决方案8】:

    据我了解,您不能只使用一个空的构造函数,因为您的模型中有一个决策节点,当您需要在列表的类型之间进行选择时,您必须以任何方式告诉程序哪种类型列表将。 在我看来,这似乎是最好的解决方案:

    public class MyList {
        private List<E> list;
    
        public MyList() {
            this.list = new LinkedList<E>();
        }
    
        //an overload for another type,
        public MyList(bool INeedArray) {
          if (INeedArray)
            this.list = new ArrayList<E>();
        }
    }
    

    【讨论】:

      【解决方案9】:
      public class MyList<T> {
          private List<T> list = new ArrayList<T>();
      }
      

      这是我在类中使用的东西。我在定义它自己的私有变量时已经初始化了很长时间。

      【讨论】:

        猜你喜欢
        • 2021-08-23
        • 1970-01-01
        • 2021-11-06
        • 1970-01-01
        • 1970-01-01
        • 2019-07-31
        • 1970-01-01
        • 2018-09-25
        • 2023-03-08
        相关资源
        最近更新 更多