定义true,false,unset状态的最佳方法

如果您需要知道未设置布尔值的位置(例如,如果该未设置的值应从父值inheritance),Java布尔基元(以及其他语言中的等效项)显然是不够的。

实现这一目标的最佳做法是什么? 定义一个新的简单类,它能够表达所有三种状态或使用Java Boolean类并使用null来指示未设置状态?

Boolean a = true; Boolean b = false; Boolean c = null; 

我会用那个。 这是最直接的。

另一种方法是使用枚举。 也许这更好更快,因为不需要拳击:

 public enum ThreeState { TRUE, FALSE, TRALSE }; 

第一个优点是你的类的用户不需要关心你的三态布尔值。 他们仍然可以传递false 。 如果你不喜欢null ,因为它在这里说的含义相当少,你仍然可以创建一个public static final Boolean tralse = null; 在你的class上。

虽然不是特定于Java,但在这种情况下我自己的偏好是定义一个ThreeState类或枚举并使用它 – 就像你提到的那样,一个True,一个False和一个Undefined(或者是Default,或者是Unset,作为你的特定领域)术语命令)。 与使用null表示未设置/未定义相比,它感觉更好,更自然,更自我记录。

在Java 8中,还有Optional选项:

 public static final Optional TRI_TRUE = Optional.of(true); public static final Optional TRI_FALSE = Optional.of(false); public static final Optional TRI_UNKNOWN = Optional.empty(); 

作为奖励,您将获得所有这些地图消费方法。

可以为空的布尔获得我的投票

使用空值来表示某事物的状态是糟糕的设计。 这是不合情理的,难以维护。 如果没有显式设置任何内容,我宁愿让State对象具有默认状态。 例如:

 if(state == null) { doSomething(); } 

这并没有告诉我任何关于预期状态的信息。 更像这样的东西使它更清晰。

 if(state.awaitingSet()) { doSomething(); } 

更不用说可扩展性了。 当你需要第四个州时会发生什么?

这取决于。 在这里你提到如果它必须从父值inheritance它的值,它将被取消。 你有某种数据层次结构吗? 像这样的东西:

 Parent a { boolean val = true; boolean val2 = false; } Child b { boolean val = false; //here val2 should be unset! } 

在这种情况下,如果可能的话,我会说只是不在子代码中包含val2,并且你的查询逻辑是这样的,如果它没有找到变量,它会在父母中搜索该值。

我只需使用值为0,1,2的int(整数)并在程序中处理。

要添加到@voho,Optional还可以很好地使用lambda,从而使结构更加清晰:

 public class Node { private Node parent; private Optional 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); } } 

但是,它仍然没有明显好于布尔值和空检查:

 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; } } 

在Parent类中,将boolean启动为null,并在子类中构建一个方法来检查是否已设置布尔值

在父类中

 private Boolean a = null; public void setA(Boolean a) { this.a = a; } public Boolean getA() { return a; } 

在儿童class

 if (a == true) { dothis; } else if (a == false) { dothat; } else { assert false : "Boolean a has not been set"; } 

确保断言已打开。 断言仅适用于开发周期和测试周期,它们不适用于运行时exception。

java.lang.Boolean为你做这个。 有静态常量Boolean.TRUE,Boolean.False。

private Boolean myBoolean;

应该是你需要的全部内容。注意Boolean.TRUE将通过等价测试但不同于“true”(自动装箱为TRUE)。