如何用2个布尔值确定不同的行为?

时间:2017-01-08 10:25:44

标签: java if-statement switch-statement

我有2个boolean个变量,例如:

boolean isWhite;
boolean isTall;

所以我想确定4种可能情况({(isWhite, isTall), (!isWhite, isTall), (isWhite, !isTall), (!isWhite, !isTall)})的不同行为。

1)与每次使用if/else相比,是否有更优雅实用的方法

if(isWhite) {
    if(isTall) {
        // Case 1
    }
    else {
        // Case 2
}
else {
    if(isTall) {
        // Case 3
    }
    else {
        // Case 4
}

2)是否做这样的事情有什么不同呢?

if (isWhite && isTall)
    // Case 1
if (isWhite && !isTall)
    // Case 2
if (!isWhite && isTall)
    // Case 3
if (!isWhite && !isTall)
    // Case 4

6 个答案:

答案 0 :(得分:6)

您的第二个解决方案更具可读性。但是你应该使用if-else而不仅仅是if语句。考虑第一种情况是否已经成立。还将计算其他3个if语句。如果使用if-else语句并且第一种情况为真,则只会跳过其他3条语句。

if (isWhite && isTall) {//case1}
else if (isWhite && !isTall) {//case2}
else if (!isWhite && isTall) {//case3}
else {//case4}

答案 1 :(得分:4)

我更喜欢第一个if / else安排,除非你可以使用enum说你的布尔是ab

enum Combination { 
   A_B, NA_B, A_NB, NA_NB;
}

其中NA_NB不是A,而不是B.

switch(comb) {
   case A_B:
         //
         break;
   // more cases
   case NA_NB:
         //
         break;
}

如果你有更多的布尔值,它会更好地扩展,它也可以使组合变得更加清晰。

这有助于完全删除if / else块。

enum Combination implements Actionable { 
   A_B {
      public void action(Arg arg) {
          // something
      }
  },
  NA_B {
      public void action(Arg arg) {
          // something
      }
  },
  A_NB {
      public void action(Arg arg) {
          // something
      }
  },
  NA_NB {
      public void action(Arg arg) {
          // something
      }
  };
}

现在,您只需拨打

,而不是if / else或开关
actionable.action(something);

您还可以轻松添加组合,可能是不属于原始库的自定义Actionable

答案 2 :(得分:2)

另一个替代方案是将它们转换为var temperature = "some text 565.34 °C other text".match(/(\d+|\d+\.\d+)\s*°C/)[1]*1; if (temperature > -273.15 && temperature < 1000) { console.log("valid temperature") } s(即0和1)并使用int语句来识别所有场景,例如:

switch

答案 3 :(得分:0)

另一种可能性是直接从布尔值计算你的caseNumber:

int caseNumber = 1 + (isWhite ? 0 : 2) + (isTall ? 0 : 1);

这是example

import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        System.out.println(getCaseNumber(true,true));
        System.out.println(getCaseNumber(true,false));
        System.out.println(getCaseNumber(false,true));
        System.out.println(getCaseNumber(false,false));
        switch(getCaseNumber(true,false)){
            case 1:
                System.out.println("Case 1!");
                break;
            case 2:
                System.out.println("Case 2!");
                break;
            case 3:
                System.out.println("Case 3!");
                break;
            case 4:
                System.out.println("Case 4!");
                break;              
        }
    }

    private static int getCaseNumber(boolean bool1, boolean bool2)
    {
        return 1 + (bool1 ? 0 : 2) + (bool2 ? 0 : 1);
    }
}

输出:

1
2
3
4
Case 2!

迭代所有可能性更容易,使用n布尔值可以更好地扩展,并且使用switch语句更容易使用。

1 +仅用于匹配您的案例定义,其中(true,true)Case 1

如果您希望在caseNumber0之间2**n-1,则可以将其删除。

答案 4 :(得分:0)

这是一种常见的模式,其中属性通过某些业务逻辑(在现实世界中建立)定义不同的情况。

这种控制流很难测试,验证,以跟踪来自的错误。

最好的方法是使其或多或少成为声明性列表。 也许远程类似:

{ false, false, (isWhite, isTall) -> { ... } },
{ false, true, (isWhite, isTall) -> { ... } },
{ true, false, (isWhite, isTall) -> { ... } },
{ true, true, (isWhite, isTall) -> { ... } },

(使用枚举更易读。)

通过这种方式,您可以创建插件(带案例的XML),更好地记录(处理程序类名称)。特别是这个声明性列表可以作为业务逻辑的规范,可由客户读取。因此,如果为拾取的处理程序提供以某种形式向用户显示的字符串ID +版本,那将是正常的。例如PDF格式的表单版本。

这意味着更改代码设计。但是在许多类似报道的例子中帮助了我。

答案 5 :(得分:0)

这个怎么样?与之前的答案类似,但在处理布尔值不具有相同值的两个实例时,我使用Func<List<T>> fillFirstList = () => Fill(() => default(T), MapSize[2]); Func<List<List<T>>> fillSecondList = () => Fill(fillFirstList, MapSize[1]); Map.AddRange(Fill(fillSecondList, MapSize[0])); 缩短了我的代码。

else if

为您节省一点打字:)