2011-06-29 119 views
5

我有一些問題抓住了一些東西 - 我可能會做這個完全錯誤的。擴展ArrayList和創建新的方法

我想創建延伸的ArrayList,但有幾個方法,這增加了功能的類(至少對我開發的項目。)

方法之一是findById(INT ID),其搜索每個ArrayList對象以進行特定的id匹配。到目前爲止它的工作,但它不會讓我做for (Item i : this) { i.getId(); }

我不明白爲什麼?

全碼:

public class CustomArrayList<Item> extends ArrayList<Item> { 

    // declare singleton instance 
    protected static CustomArrayList instance; 

    // private constructor 
    private CustomArrayList(){ 
     // do nothing 
    } 

    // get instance of class - singleton 
    public static CustomArrayList getInstance(){ 
     if (instance == null){ 
      instance = new CustomArrayList(); 
     } 
     return instance; 
    } 

    public Item findById(int id){ 
     Item item = null; 
     for (Item i : this) { 
      if (i.getId() == id) { 
         // something 
     } 
     } 
     return item; 
    } 
    public void printList(){ 
     String print = ""; 
     for (Item i : this) { 
      print += i.toString() + "\n"; 
     } 
     System.out.println(print); 
    } 
} 

回答

7

變化

public class CustomArrayList<Item> extends ArrayList<Item> { 

public class CustomArrayList extends ArrayList<Item> { 

我懷疑Item是要在清單上存儲類的名字。在CustomArrayList之後加入<Item>即表示您正在引入類型參數,該參數會影響此類。


隨着<Item>參數,你的代碼是等於

public class CustomArrayList<T> extends ArrayList<T> { 
    // ... 
     for (T i : this) { i.getId(); } 
    // ... 
} 

這顯然並不總是可行的,因爲T可以指任何類型的。

+0

真棒。這是恰當的語法,還是我試圖做別的?非常感謝!快速回復。 – Cody

+1

這可能是您的方案的正確語法。更新了答案以解釋原因。 – aioobe

+1

謝謝!這解釋得非常好。 – Cody

2

什麼是getId()?據推測這是一些類的一種方法,但我們不知道其中類。

如果你實際上有一個叫做Item的課程,並且有getId()的方法,這個方法就是一個列表,你只需要阻止你的類是泛型的。因此,而不是這樣的:

public class CustomArrayList<Item> extends ArrayList<Item> { 

你想:

public class CustomArrayList extends ArrayList<Item> { 

目前你的類中,Item並不是指一類叫做項目,它指的是被稱爲Item一個類型參數

現在個人:

  • 我不會避免造成單身,除非你真的要
  • 如果有必要,我會避免在你的方式創建它們(這是不是線程-safe)
  • 我不會擴大ArrayList<>,除非我真的不得不,寧願組成了繼承
+0

我正在創建一個單身人士,因爲我只能擁有一個單身人士。我知道我創建它的方式不是線程安全的 - 我需要有一個「鎖定方法」,對嗎?什麼aioobe發佈解決了我的問題,但我仍然有興趣創建一個線程安全的單身人士。 – Cody

+1

在Java 1.5+中創建單例的首選方法是使用Enum。看到這個問題的例子:http://stackoverflow.com/questions/70689/efficient-way-to-implement-singleton-pattern-in-java – aioobe