[英]Why does Set.add not return an object?
為什么Set.add()不返回您要添加的對象,或者如果該對象已經存在於集合中,則該對象等於要添加的對象?
我可以有一個具有兩個屬性的對象,但是hashcode()/equals()
方法中只考慮了其中一個屬性(然后將我不考慮的屬性用於hashcode()/equals()
。
一個簡單的答案是Set擴展了Collection接口,但這並不令人滿意。 那么問題是為什么Set
沒有附加的方法來實現我想要的功能,例如: set.addObject()
。
我知道我可以使用Map.getOrDefault ,但是接下來我需要指定Map的兩個參數。
一個簡單的答案是Set擴展了Collection接口,但這並不令人滿意
是否滿意,這就是為什么add
返回一個boolean
而不是Set
已經存在的Object
的答案。 Collection.add
返回一個布爾值,以指示基礎集合是否已更改。
通常,要記住表示“已經在集合中”不是不添加元素的唯一原因,您會返回什么表示未添加元素?
為什么沒有addObject
方法的問題是非常獨立的,並且是基於意見的: 您可能認為它很有用,但API設計器要么:
認為這可能有用,但隨后無法修改接口以添加新方法,因為這會破壞Set
現有實現。
既然接口可以具有默認方法實現,顯然這是有可能的。 但是,我們又回到了上面的另外兩個原因。
實際上,我回想起上面所說的“不是集合中的唯一原因”就是“已經在集合中”。
如果此集合由於調用而更改,則返回true。 (如果此集合不允許重復並且已經包含指定的元素,則返回false。)
因此,好的,這應該是唯一的原因。 但是,然后您必須想知道,為什么對於List
返回剛剛添加的元素,它為什么有用。
確實會很好。
一個簡單的用例是cache ,因此不使用重復的實例:
當前,必須按以下方式實施:
class Shared<T>
private final Map<T, T> map = new HashMap<>();
public T share(T obj) {
T old = map.get(obj);
if (old == null) {
map.put(obj, obj);
old = obj;
}
return old;
}
}
但是當Set.addObject將返回舊對象時或添加null時:
private final Set<T> set = new HashSet<>();
public T share(T obj) {
return set.addObject(obj);
}
具有所有可用操作的Set的代數完整性確實缺少該功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.