簡體   English   中英

為什么Set.add不返回對象?

[英]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現有實現。

    既然接口可以具有默認方法實現,顯然這是有可能的。 但是,我們又回到了上面的另外兩個原因。


實際上,我回想起上面所說的“不是集合中的唯一原因”就是“已經在集合中”。

根據Collection.add的Javadoc

如果此集合由於調用而更改,則返回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.

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