下面的代码显然是行不通的,因为List<E>
是抽象:如何在空的类构造函数中初始化列表<E>?
public class MyList {
private List<E> list;
public MyList() {
this.list = new List<E>();
}
}
我怎么能初始化MyList
类一个空的构造,如果我需要list
变量是一个LinkedList
或ArrayList
根据我的需要?
下面的代码显然是行不通的,因为List<E>
是抽象:如何在空的类构造函数中初始化列表<E>?
public class MyList {
private List<E> list;
public MyList() {
this.list = new List<E>();
}
}
我怎么能初始化MyList
类一个空的构造,如果我需要list
变量是一个LinkedList
或ArrayList
根据我的需要?
有你想要达到什么更好的选择:
我几个小时前就有一个问题,有人推荐我这个解决方案,而不是看看:http://stackoverflow.com/questions/2881684/help-with-abstract-class-in-java-with-private-可变类型的听 – 2010-05-21 14:33:07
boolean shouldThisBeAnArrayList=true; // Set to false to use LinkedList
if(shouldThisBeAnArrayList) {
this.list = new ArrayList<E>();
}
else {
this.list=new LinkedList<E>();
}
就像我在另一条评论中所说的那样,这会打败“空构造者”的目的不是吗?我的意思是,我需要以某种方式传递'shouldThisBeAnArrayList'的值... – 2010-05-21 14:30:39
我不知道这是否是你问...
public class MyList {
private List<E> list;
public MyList() {
if (myNeeds)
this.list = new LinkedList<E>();
else
this.list = new ArrayList<E>();
}
}
......我虽然有这样的解决方案,但我在这里问过,因为我想也许有一种更好的方式,不知何故。不需要'myNeeds'作为参数传递给构造函数吗?这将打败“空构造者”的目的。 – 2010-05-21 14:29:46
那么,对象会如何知道使用哪种类型呢?它可能需要传递给构造函数,或者可以通过环境使用(例如某些单例类)。 – Thomas 2010-05-21 15:01:35
这就是为什么我在SO上发布问题的原因...... – 2010-05-21 15:12:30
我想你可以做到以下几点:
public class MyList<T> {
private List<T> list;
public MyList() {
this.list = new ArrayList<T>();
}
}
当我需要'LinkedList'而不是'ArrayList'时,这将如何工作? – 2010-05-21 14:35:32
@Nazgulled你想在哪里配置列表类型?每个对象或可能在一些启动属性文件? – extraneon 2010-05-21 14:47:48
我需要它是每个对象... – 2010-05-21 14:50:12
您需要确定默认情况下“你的需求”是什么 - LinkedList或ArrayList。如果你不能说 - 如果需要改变取决于在对象的生命周期中发生的事情,那么列表也需要改变。
不能有一个默认的情况... – 2010-05-21 14:33:33
然后让它为空并按需创建它,或者没有默认构造函数。 – 2010-05-21 14:47:36
列表是一个接口,因此无法构建。只能构建所述接口的实现(例如,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>();
}
}
}
这次有人建议我说,但就像我说的那样,这是不是打败了“空构造者”的目的?但也许没有其他方式......:| – 2010-05-21 14:36:50
你可以构造一个默认的LinkedList,并有一个setListType方法来构造一个新的ArrayList,并将数据从LinkedList复制到它。 – 2010-05-21 15:10:20
为什么不使用受保护的(也可能是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>();
}
}
据我所知,你不能只使用一个空的构造,因为你有在你的模型中一个决策节点,当你需要在列表类型中进行选择时,所以你必须告诉程序什么样的列表。 这似乎是在我看来,最好的解决办法:
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>();
}
}
public class MyList<T> {
private List<T> list = new ArrayList<T>();
}
这是我在课堂上使用。我有很长一段初始化什么我可以定义私有变量它的自我的时候。
列表未标记为最终。它是否必须在ctor中初始化? – 2010-05-21 14:31:39
是的,它需要在构造函数中初始化。 – 2010-05-21 14:34:55
实用工厂类是否可以接受?从评论中我得到的印象是你想要实现类型是可配置的,并建议MyList使用的Factory。 – extraneon 2010-05-21 14:45:34