2010-10-12 79 views
3

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

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

这就是我所拥有的,我想放置一个elseif而不是else,然后在里面设置空值,这意味着非上述值,然后我希望返回布尔值。 局部积聚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; 
    } 
} 

回答

5

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

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

然而,当它是专为2

不依赖于使用一个布尔值3点的值将enum,你可以定义你的类型,你是多么希望他们和到底有没有更好的办法尽可能多的你需要。这里是一个例子,你将如何使用它。

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; 
} 
+0

对不起,因为你可以告诉我是新来的java,这是我迄今为止。 – OakvilleWork 2010-10-12 19:36:04

+0

public class MailerType { private boolean isOldMailer(File mailerFolder){ File localBuildAndDeploy = new File(mailerFolder,“test/local-build-deploy.cmd”);如果(localBuildAndDeploy.exists()){ }返回true; } else if { return false; {else } } } – OakvilleWork 2010-10-12 19:36:52

+0

我更新了这个版本以处理您的代码。您只需填写每个值的确切条件即可。 – 2010-10-12 19:54:12

1

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

布尔是二元的,当然 - 只是真或假。

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

-1

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

+0

Shamik - 每个开发人员都希望布尔值为true或false。即使是自动拆箱的语言也会这样认为。非常不幸的是,null是一个技术上可能的价值。我绝不会在公共API中将其用作_expected_行为。 – extraneon 2010-10-12 19:58:20

+0

我同意这是丑陋的做法。 – Shamik 2010-10-12 20:40:43

1

(我会去三个常见的选项,然后建议第三个)。

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

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

然而,一些人来说,合理与否,期待一个布尔值来为真或假的,并没有考虑空可能性,它可以容易导致错误

第二个选项是使用枚举

  1. 滥用没有真正的风险,因为空是不是一种选择,但...
  2. 你失去的布尔语义
  3. 根据你的建模,它可能或不可能是审美引入自定义枚举。

第三 - 与建议 - 选择是使用可选<布尔>Google's excellent Guava library

  1. 这是一个很常见的库。
  2. 这是自我记录。
  3. 它有well-defined semantics
  4. 空不是问题。
  5. 布尔语义只是一个得到了。
  6. 在上面的第一个选项中转换为基于空值的模型是veryconcise且易于阅读。