簡體   English   中英

我應該在Java中實現List接口還是擴展ArrayList類?

[英]Should i implement List interface or extend ArrayList class in Java

我正在開發一個應用程序,在該應用程序中,我需要作為背景來監視用戶在特定對象上的活動,稍后在可視化它們時,需要根據用戶使用它們的順序對它們進行排序(最后使用的對象必須在對象上可視化例如,網格的第一行。)

因此,如果我有一個Arraylist,我要在其中存儲用戶要處理的對象以添加上次使用的對象,則需要檢查它是否已經在列表中,然后將其移動到第一個位置。 如果對象不存在,我只需將其添加到列表的第一個位置。

因此,我不想做所有這些步驟,而是要列出上面介紹的邏輯,以列出自己的列表。

最后,我的問題是(希望這不是基於觀點的)哪種方案更好:

  1. 實現列表界面
  2. 擴展ArrayList類並覆蓋ADD方法

提前10倍。

  1. 創建一個包含ArrayList並處理所有其他功能的類。

即,相對於繼承,它更喜歡組合(在這種情況下,是實現接口)。 也可以讓該類針對相關情況實現List ,並將(相關)操作直接定向到內部的ArrayList

還要注意,如果不需要List (或者可以使用Map適當替換它), LinkedHashMap支持插入順序(默認)和訪問順序(用於迭代)。

我認為LinkedHashMap已經accessOrder您的需要-可以按插入或最后訪問的順序保留元素(這由構造函數之一中的參數accessOrder確定)。

https://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashMap.html

編輯

我沒有足夠的聲譽來發表評論,所以在這里輸入:您實際上不需要地圖,因此Venkatesh的LinkedHashSet建議更好。

您可以執行以下操作:

<T> void update(Set<T> set, T value) {
        set.remove(value);
        set.add(value);
}

接着

    LinkedHashSet<String> set = new LinkedHashSet<>();
    update(set, "a");
    update(set, "b");
    update(set, "c");
    update(set, "a");

    Iterator<String> it = new LinkedList<String>(set).descendingIterator();

    while (it.hasNext()) {
        System.out.println(it.next());
    }

輸出:

a
c
b

因此,我不想做所有這些步驟,而是要列出自己的列表,上面列出的邏輯將可用。

我將嘗試重構您的設計參數(如果可以),以便能夠使用現有的Java Collection Framework類(也許是鏈接的集合類型)。 作為Collections Framework的一部分,它們已經進行了優化和維護多年(因此效率可能已經接近最佳狀態),而您不必擔心自己維護它。

在您提供的兩個選項中,最簡單或最好的選擇都不是。

  • 聽起來您不能擴展AbstractList (作為實現List的一種方式),所以您將需要進行很多工作。

  • ArrayList類不是最終的,但沒有明確設計和記錄繼承。 由於繼承破壞了封裝,這可能會導致某些代碼易碎(在有效Java中,由J. Bloch撰寫的第二版中討論)。 此解決方案可能不是最佳方法。

在這些選項中,如果您不能重構設計以允許直接使用Collection類,則編寫一個將List (或其他Collection)封裝為實例字段的類,並為其添加檢測功能。 優先考慮組成而不是繼承。 這樣,您的解決方案將比基於繼承的解決方案更加健壯和易於維護。

您可以嘗試使用HashMap<Integer, TrackedObject> ,其中TrackedObject是您要跟蹤的對象的類。

當用戶使用對象時,請執行

void trackObject(TrackedObject object)
{
  int x = hashMap.size();
  hashMap.add(Integer.valueOf(x), object);
}

然后,當您想按使用順序讀出被跟蹤對象時:

TrackedObject[] getOrderedArray()
{
  TrackedObject[] array = new TrackedObject[hashMap.size()];
  for(int i = 0; i < hashMap.size(); i++)
  {
    array[i] = hashMap.get(Integer.valueOf(i));
  }
  return array;
}

LinkedHashSet在您的情況下也可能會有所幫助。 您可以繼續向其添加元素,這將使它們保持插入順序,並且僅保留唯一值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM