2010-05-21 56 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>(); 
} 

這是我在課堂上使用。我有很長一段初始化什麼我可以定義私有變量它的自我的時候。

相關問題