如果您需要知道未设置布尔值的位置(例如,如果该未设置值应从父值继承),则Java布尔基元(以及其他语言中的等效项)显然是不够的.
实现这一目标的最佳做法是什么?定义一个新的简单类,它能够表达所有三种状态或使用Java Boolean类并使用null来指示未设置状态?
Boolean a = true; Boolean b = false; Boolean c = null;
我会用那个.这是最直接的.
另一种方法是使用枚举.也许这更好更快,因为不需要拳击:
public enum ThreeState { TRUE, FALSE, TRALSE };
第一个优点是你的类的用户不需要关心你的三态布尔值.他们还可以通过true
和false
.如果你不喜欢它null
,因为它在这里讲的含义相当少,你仍然可以public static final Boolean tralse = null;
在课堂上创作.
在Java 8中,还有Optional选项:
public static final OptionalTRI_TRUE = Optional.of(true); public static final Optional TRI_FALSE = Optional.of(false); public static final Optional TRI_UNKNOWN = Optional.empty();
作为奖励,您将获得所有这些地图和消费方法.
虽然不是特定于Java的,但在这种情况下我自己的偏好是定义一个ThreeState类或枚举并使用它 - 就像你提到的那样,一个True,一个False和一个Undefined(或者是Default,或者是Unset,作为你的特定领域)术语命令).感觉更好,更自然,更自我记录,而不是代表未设置/未定义null
.
可以为空的布尔获得我的投票
使用空值表示事物的状态是不良的设计。它没有描述性,很难维护。如果没有明确设置状态对象,我宁愿使用默认状态的State对象。例如:
if(state == null) { doSomething(); }
这没有告诉我有关预期状态的任何信息。像这样的东西更加清晰。
if(state.awaitingSet()) { doSomething(); }
更不用说可扩展了。当您需要第四种状态时会发生什么?