我正在寻找实现三值逻辑的最佳方法。
我用Google搜索并发现了三种不同的方法:
将null
变量的Boolean
值用作未定义
此变体对我来说很危险,因为它可能会意外地导致NullPointerException
使用Optional<Boolean>
类型
这种变体仍然有点危险。为了避免NoSuchElementException
,你应该使用这样的结构:
Optional<Boolean> amIRight = Optional.empty();
if (Optional.of(true).equals(amIRight ) {
doSome();
}
对我来说这看起来太罗嗦了
实施自己的枚举
最后一个变种似乎是最好的。几乎安全,非常简单,不成功。但我还没有在广泛传播的java libriaries中找到任何这样的枚举,比如Apache,Google Guava等等。对我来说这看起来很奇怪,每个人都避免了更简单和最安全的实现。
可能是我遗漏了一些东西,并且有充分的理由不实施三值逻辑枚举。
答案 0 :(得分:3)
如果enum适合你,那就去吧 不要使用那个布尔值,它是丑陋的并且破坏了可读性......我也无法想象如果你希望以后支持4个值会有多可怕......
其他警告/建议:
您确定只使用3个值吗? 在许多情况下,设计往往会发生变化,而且枚举将不再足够 使用封装enum(或int)的类可以提供更好的灵活性 但是,您可以稍后从枚举更改为类。
在我的节目中,我广泛使用枚举 你不应该太在意流行的图书馆做什么,只要选择最适合你的工作!
关于非常有趣的假设:
......有充分理由不实施三值逻辑枚举。 ...
假设我是Java语言设计师
你要求3-logic enum
我接受你的建议。
然后,Mr.2D
询问&#34;我们有3-logic enum
。为什么不提供4-logic enum
来支持+x -x +y -y
?&#34;
我给他他想要的东西。
之后,Mr.LoveFive
Mr.ObsessiveSick
.....我认为你明白了。
必须有一个阈值(何时停止),并且与2-enum(布尔值)相比,对3-enum的需求相对非常低。
答案 1 :(得分:2)
我同意enums是迄今为止最安全,最好的解决方案。也许枚举在Apache这样的项目中没有被广泛使用,因为枚举在Java中相对较新(我认为它们出现在Java 1.5中)。
答案 2 :(得分:0)
如果你想要3值逻辑,你不再谈论简单的真/假条件,你在谈论状态机。可以说,状态机是编程中最强大的范例之一。如果您不熟悉自动机理论,请查阅。