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

时间:2008-11-24 17:11:18

标签: java boolean

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

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

10 个答案:

答案 0 :(得分:42)

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

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

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

public enum ThreeState {
    TRUE,
    FALSE,
    TRALSE
};

第一个优点是你的类的用户不需要关心你的三态布尔值。他们仍然可以通过truefalse。如果你不喜欢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)不同。