如果您需要知道未设置布尔值的位置(例如,如果该未设置值应从父值继承),则Java布尔基元(以及其他语言中的等效项)显然不是足够的。
实现这一目标的最佳做法是什么?定义一个新的简单类,它能够表达所有三种状态或使用Java Boolean类并使用null来指示未设置状态?
答案 0 :(得分:42)
Boolean a = true;
Boolean b = false;
Boolean c = null;
我会用那个。这是最直接的。
另一种方法是使用枚举。也许这更好更快,因为不需要拳击:
public enum ThreeState {
TRUE,
FALSE,
TRALSE
};
第一个优点是你的类的用户不需要关心你的三态布尔值。他们仍然可以通过true
和false
。如果你不喜欢null
,因为它在这里很少说明它的意思,你仍然可以在课堂上创建一个public static final Boolean tralse = null;
。
答案 1 :(得分:12)
在Java 8中,还有可选选项:
public static final Optional<Boolean> TRI_TRUE = Optional.of(true);
public static final Optional<Boolean> TRI_FALSE = Optional.of(false);
public static final Optional<Boolean> TRI_UNKNOWN = Optional.empty();
作为奖励,您将获得所有地图和消费方法。
答案 2 :(得分:10)
虽然不是特定于Java的,但在这种情况下我自己的偏好是定义一个ThreeState类或枚举并使用它 - 就像你提到的那样,一个True,一个False和一个Undefined(或者是Default,或者是Unset,作为你的特定领域术语(d)。与使用null
表示未设置/未定义相比,感觉更好,更自然,更自我记录。
答案 3 :(得分:8)
@Nullable Boolean
获得了我的投票。
答案 4 :(得分:4)
使用空值来表示某事物的状态是糟糕的设计。这是不合情理的,难以维护。如果没有明确设置任何内容,我宁愿让State对象具有默认状态。例如:
if(state == null) {
doSomething();
}
这并没有告诉我任何关于预期状态的信息。更像这样的东西使它更清晰。
if(state.awaitingSet()) {
doSomething();
}
更不用说可扩展性了。当您需要第四个状态时会发生什么?
答案 5 :(得分:1)
这取决于。在这里你提到如果它必须从父值继承它的值,它将被取消。你有某种数据层次结构吗?像这样:
Parent a {
boolean val = true;
boolean val2 = false;
}
Child b {
boolean val = false;
//here val2 should be unset!
}
在这种情况下,如果可能的话,我只是说在Child中不包含val2,并且你的查找逻辑是这样的,如果它没有找到变量,它会在父项中搜索该值。
答案 6 :(得分:1)
我只需使用值为0,1,2的int(整数)并在程序中处理。
答案 7 :(得分:0)
要添加到@ voho,Optional也可以很好地与lambda配合使用,从而使结构更简洁:
public class Node {
private Node parent;
private Optional<Boolean> something = Optional.empty();
public boolean isSomething() {
return something.orElseGet(() -> {
if (parent != null)
return parent.isSomething();
return false;
});
}
public void setSomething(boolean v) {
this.something = Optional.of(v);
}
}
但是,它仍然显然不比布尔值和null检查好多少>
public class Node {
private Node parent;
private Boolean something;
public boolean isSomething() {
if (something != null)
return something;
if (parent != null)
return parent.isSomething();
return false;
}
public void setSomething(boolean v) {
this.something = v;
}
}
答案 8 :(得分:-1)
在Parent类中,将boolean启动为null,并在子类中构建一个方法来检查布尔值是否已设置
在父类
中private Boolean a = null;
public void setA(Boolean a) {
this.a = a;
}
public Boolean getA() {
return a;
}
在儿童班
if (a == true)
{
dothis;
}
else if (a == false)
{
dothat;
}
else
{
assert false : "Boolean a has not been set";
}
确保断言已打开。断言仅适用于开发周期和测试周期,它们不适用于运行时异常。
答案 9 :(得分:-3)
java.lang.Boolean为你做这件事。有静态常量Boolean.TRUE,Boolean.False。
private Boolean myBoolean;
应该是您所需要的全部内容。注意Boolean.TRUE将通过等价测试,但与“true”(自动装箱为TRUE)不同。