代码之家  ›  专栏  ›  技术社区  ›  OakvilleWork

使用布尔对象

  •  3
  • OakvilleWork  · 技术社区  · 15 年前

    为了达到我想要的结果,我遇到了一些问题。基本上,我想做的是有一个布尔对象,它允许我有3个选择,如果一个邮寄者是旧的,我希望它被设置为假(意思是不包含“mapq.cmd”和“add coid.cmd”文件)

    如果邮件程序是新的,我希望它设置为true(如果是新的,它将在目录中包含“mapq.cmd”和“add coid.cmd”文件),如果它不是旧的或新的邮件程序(意味着不是邮件程序),那么我希望它为空。

    这就是我所拥有的,我希望放置一个elseif而不是else,并在其中执行else来设置空值,这意味着上面没有空值,然后我希望返回布尔值。 示例中使用了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;
        }
    }
    
    4 回复  |  直到 13 年前
        1
  •  6
  •   Alan Geleynse buhbang    15 年前

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

    如果您坚持使用Boolean,请使用大写B版本而不是小写B。大写B Boolean是一个对象,可以设置为空,并执行您所描述的操作。小写B布尔值是一个基元,不能设置为空。

    但是,有一种更好的方法,当它设计为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;
    }
    
        2
  •  1
  •   duffymo    15 年前

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

    当然,布尔值是二进制的——只是对或错。

    如果你想要三元逻辑,用你自己的类型包装它。

        3
  •  1
  •   user359996    13 年前

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

    第一种选择是 使用布尔值并将其设置为真、假或空 . 这有一些好处:

    1. 假设您首先检查以确保值不为空,则可以直接在布尔表达式中使用它。
    2. 这是一个有点争议的观点,但空值与“所有可能的值”之间的距离并不太远。( 这是一个合理的模型。 许多意见不一致 .
    3. 简洁的。

    然而,有些人,不管合理与否,期望一个布尔值要么是真的要么是假的,并且不考虑空的可能性,这可以 容易导致错误 .

    第二种选择是 使用枚举 :

    1. 没有误用的真正风险,因为空不是一个选项,但是…
    2. 你失去了布尔语义 .
    3. 根据你所做的建模,它可能是,也可能不是 审美 引入自定义枚举。

    第三种——也是推荐的——选择是 使用可选的布尔值 Google's excellent Guava library :

    1. 这是一个很普通的图书馆。
    2. 这是自我记录。
    3. 它有 well-defined semantics .
    4. 空不是问题。
    5. 布尔语义 只是一个 得到 离开。
    6. 在上面的第一个选项中转换为/从基于空的模型转换为 very concise 而且容易阅读。
        4
  •  -1
  •   Shamik    15 年前

    使用布尔值-基本布尔值上的包装对象。这样,您可以将引用设置为空、真或假。