Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用三值逻辑变量的最佳方法_Java - Fatal编程技术网

Java 使用三值逻辑变量的最佳方法

Java 使用三值逻辑变量的最佳方法,java,Java,我正在寻找实现三值逻辑的最佳方法 我在谷歌上搜索发现了三种不同的方法: 使用null值作为未定义的Boolean变量 这个变体对我来说很危险,因为它可能意外地导致NullPointerException 使用可选类型 这种变体仍然有点危险。要避免NoTouchElementException,应使用如下结构: Optional<Boolean> amIRight = Optional.empty(); if (Optional.of(true).equals(amIRight ) {

我正在寻找实现三值逻辑的最佳方法

我在谷歌上搜索发现了三种不同的方法:

  • 使用
    null
    值作为未定义的
    Boolean
    变量

    这个变体对我来说很危险,因为它可能意外地导致
    NullPointerException

  • 使用
    可选
    类型

    这种变体仍然有点危险。要避免
    NoTouchElementException
    ,应使用如下结构:

    Optional<Boolean> amIRight = Optional.empty();
    if (Optional.of(true).equals(amIRight ) {
        doSome();
    }
    
    Optional amIRight=Optional.empty();
    if(可选).of(真).equals(右){
    doSome();
    }
    
    这对我来说太罗嗦了

  • 实现您自己的枚举

    最后一个变体似乎是最好的。几乎是安全的,在未定义方面非常简单。但我在广泛传播的java库(如Apache、Google Guava等)中没有找到任何这样的枚举。对我来说,这看起来很奇怪,每个人都避免使用最简单、最安全的实现

    可能是我遗漏了什么,并且有严重的理由不实现三值逻辑枚举


  • 我同意enum是迄今为止解决您的问题的最安全和最好的解决方案。可能enum在Apache这样的项目中没有广泛使用,因为enum在Java中相对较新(我认为它们是在Java 1.5中出现的)。

    如果enum适合您,那么就使用它。
    不要使用那个布尔值,它很难看并且破坏了可读性…我也无法想象如果你想让它在以后支持4个值会有多可怕

    其他注意事项/建议:

    您确定只使用3个值吗?
    在许多情况下,设计往往会发生变化,枚举将不再足够。
    使用封装enum(或int)的类可以提供更好的灵活性。
    但是,您可以稍后从枚举更改为类

    在我的程序中,我广泛使用enum。
    你不应该太在意流行的图书馆做什么,只要选择最适合你的

    关于非常有趣的假设:

    …有充分的理由不实现三值逻辑枚举

    假设我是Java语言设计师。
    您需要一个
    3逻辑枚举

    我接受你的建议

    然后,
    Mr.2D
    询问“我们有
    3-logic enum
    。为什么不提供
    4-logic enum
    来支持
    +x-x+y-y
    ?”
    我给他想要的

    在那之后,
    LoveFive先生
    强迫症先生
    …我想你明白了


    必须有一个阈值(何时停止),与2-enum(布尔值)相比,3-enum的需求相对较低.

    如果你想要三值逻辑,你不再谈论简单的真/假条件,你谈论的是状态机。可以说,状态机是编程中最强大的范例之一。如果你不熟悉自动机理论,请查阅。

    使用枚举。1.枚举仍然可以是
    null
    ,因此它不是与仅使用
    Boolean
    不同,2.对于
    Optional
    使用
    someOptional.orElse(false)
    比您当前的“解决方案”更短、更容易阅读。@MarkrotVeel Null不是重点。重点是布尔值不应该是。@MarkrotVeel是的,它可以,但我几乎无法想象会这样做的enybody。我也很难想象enybody会期望某个方法可以将Null作为布尔结果返回。@MarkrotVeel你的someOptional.orElse(false)不是我想要的,因为我需要一个可以帮助我比较值的解决方案。我需要知道值是正确的还是错误的。(新的?不是真的,Java 1.5是从2004年开始的)“相对的”新的。我仍然遇到许多最初在Java 1.5之前编写的Java API,并且没有花时间/精力切换到使用Enum。好的,也许我调用Enum new显示了我的年龄。我从1.2天开始使用Java:)