下面的代碼顯然是行不通的,因爲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