![](/img/trans.png)
[英]Should I explicitly implement an interface when I already extend a class that implements it?
[英]Should i implement List interface or extend ArrayList class in Java
我正在開發一個應用程序,在該應用程序中,我需要作為背景來監視用戶在特定對象上的活動,稍后在可視化它們時,需要根據用戶使用它們的順序對它們進行排序(最后使用的對象必須在對象上可視化例如,網格的第一行。)
因此,如果我有一個Arraylist,我要在其中存儲用戶要處理的對象以添加上次使用的對象,則需要檢查它是否已經在列表中,然后將其移動到第一個位置。 如果對象不存在,我只需將其添加到列表的第一個位置。
因此,我不想做所有這些步驟,而是要列出上面介紹的邏輯,以列出自己的列表。
最后,我的問題是(希望這不是基於觀點的)哪種方案更好:
提前10倍。
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.