我有一个班级:
public class SomeClass {
private Map<Long, Boolean> longToBooleanMap = new HashMap<Long, Boolean>();
public Map<Long, Boolean> getLongToBooleanMap () {
return longToBooleanMap ;
}
public void setLongToBooleanMap (Map<Long, Boolean> longToBooleanMap ) {
this.longToBooleanMap = longToBooleanMap ;
}
}
我想确保我的地图不会包含空值的条目。我尝试了什么:
javax.validation.constraints.NotNull
@NotNull
private Map<Long, Boolean> longToBooleanMap = new HashMap<Long, Boolean>();
这是验证Map本身,而不是值。有没有办法做到这一点?
答案 0 :(得分:0)
如果您希望使用javax.validation.constraints
验证对象,那么简单的方法是创建一个验证它的方法,如果所有值都不为null则返回true,如果有空值则返回false,那么您需要用@AssertTrue
注释它,如果为false,验证将不会通过。
@AssertTrue(message="There is a value which is null")
public boolean hasNotNullValues(){
for (Map.Entry<Long, Boolean> entry : longToBooleanMap.entrySet()) {
for (Map.Entry<Long, Boolean> entry : longToBooleanMap.entrySet()) {
if(null == entry.getValue())
return false
}
return true;
}
}
否则,一种检查你无法添加空值的密钥对的方法将封装在一个控制它的方法中,如下一个:
public Map<Long, Boolean> putLongToBooleanMap (Long key, Boolean value) {
if(value != null)
longToBooleanMap.put(key, value);
else
//TODO do what you want (for example: throw an exception..)
}
然后,如果您希望确定无法添加带空值的地图,则可以删除getter方法和setter方法:getLongToBooleanMap
和setLongToBooleanMap
。如果您选择这样做,则需要创建其他util方法,例如remove key-value
。
答案 1 :(得分:-1)
除了Pau's answer,你真的想要使用HashMap,你可以像这样覆盖你的地图(或者很容易地创建一个单独的类):
final Map<Long, Boolean> longToBooleanMap = new HashMap<Long, Boolean>() {
@Override
public Boolean put(Long key, Boolean value) {
if(value != null) {
return super.put(key, value);
} else {
throw new NullPointerException("This map cannot contain null values");
}
}
/*
* TODO: Overwrite methods: putAll, replace, replaceAll, ...
*/
};
但请注意您需要覆盖许多将项目添加到地图中的方法。只提一些:put,putAll,putIfAbsent,replace,replaceAll,merge。
答案 2 :(得分:-2)
您可以使用ConcurrentHashMap。此实现不允许具有null键和空值。