【问题标题】:using Boolean Object使用布尔对象
【发布时间】:2011-04-24 12:09:02
【问题描述】:

我在尝试获得我想要的结果时遇到了问题。基本上我想要做的是有一个布尔对象,它允许我有 3 个选择,如果邮件是旧的,我希望它设置为 false(意思不包含“mapQ.cmd”和“add-coid.cmd” "文件)

如果邮件是新的,我希望它设置为 true(如果它是新的,它将在目录中包含“mapQ.cmd”和“add-coid.cmd”文件),如果它既不是旧的,也不是新的邮件程序(意思是不是邮件程序)然后我希望它为空。

这就是我所拥有的,我想放置一个 elseif 而不是 else,并在其中执行一个 else 来设置 null 值,这意味着非上述内容,然后我希望返回布尔值。 示例中使用了 local-build-deploy.cmd,但我希望使用上述文件名

private boolean isOldMailer(File mailerFolder) {
    File localBuildAndDeploy = new File(mailerFolder,"test/local-build-deploy.cmd");
    if (localBuildAndDeploy.exists()) {
        return true;
    } else {
        return false;
    }
}

【问题讨论】:

    标签: java netbeans if-statement boolean


    【解决方案1】:

    有两种方法可以做到这一点。

    如果您坚持使用布尔值,请使用大写的 B 版本而不是小写的 b。 Capital B Boolean 是一个对象,可以设置为 null 并按照您的描述进行操作。小写 b boolean 是一个基本类型,不能设置为 null。

    但是,有一种更好的方法,当它被设计为 2 时,它不依赖于对 3 值使用布尔值。

    使用枚举,您可以按照自己的需要定义类型,并且可以根据需要使用任意数量的类型。这是一个示例以及您将如何使用它。

    public enum Status { NEW, OLD, NEITHER }
    
    private Status isOldMailer(File mailerFolder) {
        File localBuildAndDeploy = new File(mailerFolder,"test/local-build-deploy.cmd");
        if (localBuildAndDeploy.exists())
            return Status.NEW;
        else if (/*Something else*/)
            return Status.OLD
        else
            return Status.NEITHER;
    }
    

    【讨论】:

    • 很抱歉,您可以告诉我我是 java 新手,这就是我目前所拥有的。
    • public class MailerType { private boolean isOldMailer(File mailerFolder) { File localBuildAndDeploy = new File(mailerFolder,"test/local-build-deploy.cmd"); if (localBuildAndDeploy.exists()) { return true; } else if { 返回 false; {其他}}}
    • 我更新了它以使用您拥有的代码。您只需要为每个值填写您的确切条件。
    • 太棒了!!谢谢你这么快的回复。我缺少括号和所有东西,讨厌这些东西。理论上 enum 消耗的内存比布尔值少吗?
    • +1 用于提及枚举。在 API 中使用布尔值作为三态变量是邪恶的(并且会让未来的维护者感到困惑)。
    【解决方案2】:

    这是三元逻辑,不是二元逻辑。它通常用于关系数据库中。

    布尔值当然是二进制的——只有真或假。

    如果您想要三元逻辑,请将其包装在您自己的类型中。

    【讨论】:

      【解决方案3】:

      (我将介绍三个常用选项,然后建议第三个)。

      第一个选项是使用布尔值并将其设置为 true、false 或 null。这有几个好处:

      1. 假设您首先检查以确保该值不为空,您可以直接在布尔表达式中使用它。
      2. 这是一个有点争议的观点,但 null 确实与“没有任何可能的值”相差不远(既不是真也不是假),所以它是一个合理的模型。 很多人不同意
      3. 简洁。

      然而,有些人,无论是否合理,都期望布尔值是真或假,并且不考虑空可能性,这可能很容易导致错误

      第二个选项是使用枚举

      1. 没有真正的误用风险,因为 null 不是一个选项,但是...
      2. 你失去了布尔语义
      3. 根据您要建模的内容,引入自定义枚举可能美观

      第三个——也是推荐的——选项是使用来自Google's excellent Guava library的可选

      1. 这是一个很常见的库。
      2. 它是自我记录的。
      3. 它有well-defined semantics
      4. Null 不是问题。
      5. 布尔语义只是get
      6. 在上面的第一个选项中转换为/从基于 null 的模型是 very concise 并且易于阅读。

      【讨论】:

        【解决方案4】:

        使用布尔值 - 原始布尔值的包装对象。这样,您可以将引用设置为 null 或 true 或 false。

        【讨论】:

        • Shamik - 每个开发人员都希望布尔值是真或假。即使是自动拆箱的语言也假设了这一点。不幸的是,null 在技术上是一个可能的值。我永远不会将其用作公共 API 中的预期行为。
        • 我同意这是一种丑陋的做法。
        猜你喜欢
        • 2019-06-10
        • 1970-01-01
        • 1970-01-01
        • 2011-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-08
        • 1970-01-01
        相关资源
        最近更新 更多