java.lang.Boolean非常适合处理三元逻辑,因为它可以完全具有三种状态:Boolean.TRUE(就是这种情况),Boolean.FALSE(事实并非如此)和null(我们不要我不知道是什么情况。使用switch语句处理这个是一个很好的设计,例如。在这个构造函数中:
public class URN {
private String value = null;
public URN (String value, Boolean mode){
switch (mode){
case TRUE:
if(!isValidURN(value))
throw new MalformedURLException("The string could not be parsed.");
this.value = value;
break;
case FALSE:
this.value = value.concat(checkByteFor(value));
break;
case null:
if(isValidURN(value))
this.value = value;
else
this.value = value.concat(checkByteFor(value));
break;
}
return;
}
不幸的是,Java不允许这样做,抱怨“无法打开布尔值类型的值”。实现此结果会产生混淆的控制流和unnice代码:
public URN (String value, Boolean mode){
Boolean valid = null;
if (!Boolean.FALSE.equals(mode)){
valid = isValidURN(value);
if (Boolean.TRUE.equals(mode) && !valid)
throw new MalformedURLException("The string could not be parsed.");
if(Boolean.TRUE.equals(valid)) {
this.value = value;
return;
} }
this.value = value.concat(checkByteFor(value));
}
执行它的好方法需要实现一个枚举类(在现实生活中,比这个例子更复杂,因为必须重写.equals()以便Trinary.NULL.equals(null)变为真)和转换:
private enum Trinary {TRUE, FALSE, NULL};
public URN (String value, Boolean toConvert, String x){
Trinary mode;
if(toConvert == null)
mode = Trinary.NULL;
else
mode = toConvert.equals(Boolean.TRUE) ? Trinary.TRUE : Trinary.FALSE;
switch (mode){
case TRUE:
if(!isValidURN(value)) throw new MalformedURLException("The string could not be parsed.");
this.value = value;
break;
case FALSE:
this.value = value.concat(checkByteFor(value));
break;
case NULL:
if(isValidURN(value))
this.value = value;
else
this.value = value.concat(checkByteFor(value));
break;
}
return;
}
在我看来,这是更好的解决方案,但是转换的原始方法大小的另一半只是转换是烦人的,而在现实生活中你必须关心具有相同语义的两个不同的空值。有没有更好的方法呢?
答案 0 :(得分:6)
使用null对象传达这样的信息并不是最佳选择。请记住,您不能对null对象执行任何方法调用,这也意味着如果您将来想要调用任何.getClass,.equals,.compare等,则必须重写代码。
你最好的选择绝对是使用enum选项。
enum Ternary {TRUE,FALSE,UNKNOWN}
您可以进一步扩展类以获得获取此类对象的方法
public Ternary getByValue(Boolean o) {
if(o == null)
return UNKNOWN;
if(o)
return TRUE;
return FALSE;
}
答案 1 :(得分:2)
我同意,如果没有提及,那令人讨厌的交换机确实支持null
或将其视为default
。
注意:Trinary可以是NULL
或null
,这可能会造成混淆。
而不是使用true,false和null。我建议为模式使用有意义的名称。例如使用VALIDATING,CONCATENATING,MIXED或其他更合适的东西。
最简单的解决方案是
public URN (String value, Boolean mode){
if (mode == null) {
this.value = isValidURN(value) ? values : value.concat(checkByteFor(value));
} else if (mode) {
if(!isValidURN(value))
throw new MalformedURLException("The string could not be parsed.");
this.value = value;
} else {
this.value = value.concat(checkByteFor(value));
}
return;
}
BTW与TRUE
相比可能令人困惑。
Boolean b = new Boolean(true);
if (b == Boolean.TRUE) // is false !!!