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

Tom*_*tin 24 java boolean

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

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

Joh*_*itb 44

Boolean a = true;
Boolean b = false;
Boolean c = null;
Run Code Online (Sandbox Code Playgroud)

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

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

public enum ThreeState {
    TRUE,
    FALSE,
    TRALSE
};
Run Code Online (Sandbox Code Playgroud)

第一个优点是你的类的用户不需要关心你的三态布尔值.他们还可以通过truefalse.如果你不喜欢它null,因为它在这里讲的含义相当少,你仍然可以public static final Boolean tralse = null;在课堂上创作.

  • 每日WTF网站称第3个值应命名为"FILE_NOT_FOUND".请参阅:http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx (13认同)
  • 我自己去布尔.整个TRUE,FALSE,FILE_NOT_FOUND/TRALSE只是在寻找麻烦. (2认同)

voh*_*oho 13

在Java 8中,还有Optional选项:

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();
Run Code Online (Sandbox Code Playgroud)

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


Joh*_*udy 10

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


Chr*_*son 9

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


Hat*_*es_ 6

使用空值表示事物的状态是不良的设计。它没有描述性,很难维护。如果没有明确设置状态对象,我宁愿使用默认状态的State对象。例如:

if(state == null) {
    doSomething();
}
Run Code Online (Sandbox Code Playgroud)

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

if(state.awaitingSet()) {
    doSomething();
}
Run Code Online (Sandbox Code Playgroud)

更不用说可扩展了。当您需要第四种状态时会发生什么?