2010-05-21 15 views
4

下面的代码显然是行不通的,因为List<E>是抽象:如何在空的类构造函数中初始化列表<E>?

public class MyList { 
    private List<E> list; 

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

我怎么能初始化MyList类一个空的构造,如果我需要list变量是一个LinkedListArrayList根据我的需要?

+0

列表未标记为最终。它是否必须在ctor中初始化? – 2010-05-21 14:31:39

+0

是的,它需要在构造函数中初始化。 – 2010-05-21 14:34:55

+0

实用工厂类是否可以接受?从评论中我得到的印象是你想要实现类型是可配置的,并建议MyList使用的Factory。 – extraneon 2010-05-21 14:45:34

回答

2

有你想要达到什么更好的选择:

  • 为ArrayList的创建一个基类(?抽象)和覆盖它两次,一次和一个用于LinkedList的
  • 注入相应的列表您的班级(依赖注入)
+0

我几个小时前就有一个问题,有人推荐我这个解决方案,而不是看看:http://stackoverflow.com/questions/2881684/help-with-abstract-class-in-java-with-private-可变类型的听 – 2010-05-21 14:33:07

1
boolean shouldThisBeAnArrayList=true; // Set to false to use LinkedList 
if(shouldThisBeAnArrayList) { 
    this.list = new ArrayList<E>(); 

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

就像我在另一条评论中所说的那样,这会打败“空构造者”的目的不是吗?我的意思是,我需要以某种方式传递'shouldThisBeAnArrayList'的值... – 2010-05-21 14:30:39

7

我不知道这是否是你问...

public class MyList { 
    private List<E> list; 

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

......我虽然有这样的解决方案,但我在这里问过,因为我想也许有一种更好的方式,不知何故。不需要'myNeeds'作为参数传递给构造函数吗?这将打败“空构造者”的目的。 – 2010-05-21 14:29:46

+0

那么,对象会如何知道使用哪种类型呢?它可能需要传递给构造函数,或者可以通过环境使用(例如某些单例类)。 – Thomas 2010-05-21 15:01:35

+0

这就是为什么我在SO上发布问题的原因...... – 2010-05-21 15:12:30

0

我想你可以做到以下几点:

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

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

当我需要'LinkedList'而不是'ArrayList'时,这将如何工作? – 2010-05-21 14:35:32

+0

@Nazgulled你想在哪里配置列表类型?每个对象或可能在一些启动属性文件? – extraneon 2010-05-21 14:47:48

+0

我需要它是每个对象... – 2010-05-21 14:50:12

1

您需要确定默认情况下“你的需求”是什么 - LinkedList或ArrayList。如果你不能说 - 如果需要改变取决于在对象的生命周期中发生的事情,那么列表也需要改变。

+0

不能有一个默认的情况... – 2010-05-21 14:33:33

+1

然后让它为空并按需创建它,或者没有默认构造函数。 – 2010-05-21 14:47:36

1

列表是一个接口,因此无法构建。只能构建所述接口的实现(例如,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>(); 
     } 
    } 
} 
+0

这次有人建议我说,但就像我说的那样,这是不是打败了“空构造者”的目的?但也许没有其他方式......:| – 2010-05-21 14:36:50

+0

你可以构造一个默认的LinkedList,并有一个setListType方法来构造一个新的ArrayList,并将数据从LinkedList复制到它。 – 2010-05-21 15:10:20

2

为什么不使用受保护的(也可能是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>(); 
    } 
} 
0

据我所知,你不能只使用一个空的构造,因为你有在你的模型中一个决策节点,当你需要在列表类型中进行选择时,所以你必须告诉程序什么样的列表。 这似乎是在我看来,最好的解决办法:

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>(); 
    } 
} 
0
public class MyList<T> { 
    private List<T> list = new ArrayList<T>(); 
} 

这是我在课堂上使用。我有很长一段初始化什么我可以定义私有变量它的自我的时候。

相关问题