簡體   English   中英

如何測試 Java 集合是否支持添加操作?

[英]How can I test whether a Java collection supports the add operation?

在 Java 中, Collection是否支持add取決於具體的 class。 假設我有如下代碼:

List<String> otherNames = getOthers();
names.add(myName);

如果底層 List 不支持,第二行將引發UnsupportedOperationException ,一個常見的例子是Collections.emptyList()

當然,我們可以創建一個新列表來保存內容,但我想知道有沒有辦法測試列表?

add的實現存在。 只是它的實現拋出了異常。 這意味着知道的唯一方法是嘗試捕獲該異常。 EmptyList.add的實現是這樣的:

public void add(E var1) {
  throw new UnsupportedOperationException();
}

使用反射來查看是否存在add方法不會告訴您您想知道什么,因為它是一個完全有效的方法。 相反,您需要調用它並像這樣捕獲異常:

try {
  otherNames.add(myName);
} catch (UnsupportedOperationException e) {
  // whatever you want in this case (create a copy into a Vector, etc)
  overflowList.add(myName);
}

例如,您可以有一個Vector (在我的示例中稱為overflowList ),您可以將無法添加到實際列表中的任何內容添加到最后並處理它們。

如果你想確保它是可變的,你總是可以防御性地復制列表。

List<String> otherNames = new ArrayList<>(getOthers());
names.add(myName);

如果您的列表真的很大,或者是緊密循環的一部分,那么您可以編寫一個在提交副本之前檢查列表類型的方法,這樣您就不會不必要地復制已經可變的列表。

static <T> List<T> copyIfMaybeImmutable(List<T> list) {
    //expand condition as required, e.g. CopyOnWriteArrayList
    if (!(otherNames instanceof ArrayList) && !(otherNames instanceof LinkedList)) {
        return new ArrayList<>(list);
    }
    return list;
}

(不可能全面,因為許多方法會使用匿名或私有 List 實現,但通過支持常見情況仍然可以獲得性能)

使用喜歡

List<String> otherNames = copyIfMaybeImmutable(getOthers());

暫無
暫無

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

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