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