[英]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.