关于Spring Webflow 2.4.1.RELEASE。
的JavaDoc for AttributeMap包含(String attributeName,Class requiredType)状态:
"此地图中是否存在具有提供名称的属性,是否为指定所需类型的值?"
但是,如果密钥存在但值为null,则认为这是可接受的,并且不会抛出IllegalArgumentException。
同样,JavaDoc for get(String attributeName,V defaultValue)状态
"获取属性值,如果未找到任何值,则返回默认值。"
但是,如果密钥存在但值为null,则不使用默认值。
这可以用例如
进行测试MutableAttributeMap<Object> flowScope = new LocalAttributeMap<Object>();
flowScope.put("key", null);
assertFalse(flowScope.contains("key", Boolean.class));
assertTrue((boolean) flowScope.get("key", Boolean.TRUE));
assertTrue(flowScope.getBoolean("key", Boolean.TRUE));
所有这些最终都会通过MapAccessor中的代码来处理null
public <T> T assertKeyValueInstanceOf(Object key, Object value, Class<T> requiredType) {
Assert.notNull(requiredType, "The required type to assert is required");
if(value != null && !requiredType.isInstance(value)) {
throw new IllegalArgumentException("Map key \'" + key + "\' has value [" + value + "] that is not of expected type [" + requiredType + "], instead it is of type [" + value.getClass().getName() + "]");
} else {
return value;
}
}
似乎如果JavaDoc是正确的,那么代码是错误的,反之亦然。
应该&#34; null&#34;传递&#34; requiredType&#34;测试特定类型?
应该&#34; null&#34;被视为&#34;价值&#34;在考虑是否应用默认值时?
如果处理的代码与JavaDoc建议的方式无效,那么我将能够做得更清洁:
if(getFlowScope().contains(key, Boolean.class)){
return getFlowScope().getBoolean(key);
}
return false;
实际上,为了安全地访问flowScope属性,允许键不存在,null和错误类型,我必须这样做:
try {
Boolean value = getFlowScope().getBoolean(key);
return value == null ? false : value;
}catch(IllegalArgumentException e){
return false;
}
对于flowcope属性的类型安全和零安全检索,是否有更清晰的替代方法?