簡體   English   中英

如何將空值添加到ConcurrentHashMap

[英]How to add null values to ConcurrentHashMap

我有一個ConcurrentHashMap ,它從不同的線程調用以將值放入其中。 我必須插入空值,但ConcurrentHashMap不允許null值。 有沒有辦法在Java中執行此操作或替代選項?

而不是使用沒有語義意義並且通常被認為是反模式的 null ,而是將這種“缺席”概念表示為反映您的意圖並迫使呼叫者正確解釋它的具體類型。

一個常見的解決方案是使用Optional (對於pre-Java 8,使用Guava的Optional )來表示缺少值。

因此,您的地圖將具有ConcurrentHashMap<Key, Optional<Value>>類型ConcurrentHashMap<Key, Optional<Value>>


另一種選擇是代表無論你打算通過意味着null更直接地在你的地圖存儲類型,例如,如果null的解釋是:“這曾經存在,但不再是”你可以創建一個類結構,像這樣:

public abstract class Resource {
  public abstract void doSomething();
  public abstract ClosedResource close();
}

public class ActiveResource extends Resource {
  public void doSomething() { ... }
  public ClosedResource close() { ... }
}

public class ClosedResource extends Resource {
  public void doSomething() { /* nothing to do */ }
  public ClosedResource close() { return this; }
}

然后只需要一個ConcurrentHashMap<Key, Resource> 兩種方法都有優缺點,具體取決於您的確切需求,但兩者都比在地圖中放置null值更客觀。


您可能還可以簡單地避免添加null s - 如果您無法為null創建明確的語義含義,這與僅僅缺少(如上所述)不同,只需在地圖中使用缺席來表達您關心的內容而不是區分缺席和現在但null案件。

一個簡單的答案是“如果值為null,請不要嘗試添加它”。

另一個答案是從.NET獲取一個頁面並引入一個Nullable。 您的值將是Nullable的一個實例。

public class Nullable<T> {
    private final T obj;
    public Nullable(T t) {
        obj = t;
    }

    public T get() {
        return obj
    }
}

您可以使用null值成功創建Nullable實例。 您可以使用get()獲取值。

---這是答案的舊版本---

首先,為什么需要放一個空鍵? 這似乎是您設計中的一個問題。

話雖這么說,你可以使用一個替身為null。 說你的鑰匙是KeyLikeThing。 通常,KeyLikeThing具有影響其散列和等於屬性的屬性。 您可以在您的世界中將KeyLikeThing的實例設為null。 當您的客戶端想要放置null時,它使用KeyLikeThing的實例。

public class KeyLikeThing {
    public static final KeyLikeThing NULL = new KeyLikeThing();

    // Other KeyLikeThing related stuff.
}

public class Storage<T> {
    private ConcurrentHashMap m = new ConcurrentHashMap();

    public T put(KeyLikeThing k, T val) {
        KeyLikeThing kl = k == null ? KeyLikeThing.NULL : k;
        return m.put(kl, val);
    }
}

暫無
暫無

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

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