boolean的switch / case请求

时间:2012-01-13 12:21:26

标签: java android boolean switch-statement

我正在尝试创建一个方法来检查Login(用户名和密码)是否至少包含6个字符。

要意识到我创建了这个方法public void checkLoginData(final String username, final String password)。在那个方法中,我创建了booleans(用户和pass),我可以创建4个不同的布尔链:

  • user:true pass:true
  • user:false pass:true
  • user:false pass:false
  • user:true pass:false

现在我想为每个人做一个转换/案例请求,但我不明白如何实现......

如果你问为什么我需要切换,我只是认为我需要它,因为我想为这4个布尔链中的每一个做,它会/显示不同的东西。另外,我想以性感的方式做到这一点,而不是数以千计的不同'ifs':P,请帮忙!

以下是该方法的代码:

public void checkLoginData(final String username, final String password){

    boolean user, pass;

    if (username.length() < 6){
        user = false;
    }else {
        user = true;
    }

    if (password.length() < 6){
        pass = false;
    }else {
        pass = true;
    }

    boolean[] logindaten = {user, pass};



}

Thx提前获得帮助!

最好的问候野生动物园

8 个答案:

答案 0 :(得分:11)

如果你真的想要一个“性感的java方式”(但这取决于你所理解的那样)你可以做类似的事情(需要Java 7):

boolean user, pass;

switch (user + "-" + pass) {
    case "false-false":
        ...
    case "false-true":
        ...
    case "true-false":
        ...
    case "true-true":
        ...
    default:
        throw new RuntimeException(
            "something strange happening here, user: " + user + ",pass: " + pass);
}

但是我更愿意只使用他自己的消息进行2次不同的检查,将消息加入进行演示。 (并且不确定这是否可以被认为是“性感的java方式”,更像是“解决方法”)

答案 1 :(得分:9)

您无法仅在整数类型上切换boolean[]。要将布尔值转换为int,您可以为2个布尔值使用位掩码,例如:

int val = 0;
if (user) val |= 0x1;
if (pass) val |= 0x2;

switch (val) {
case 0: // Both too short
case 1: // User Ok, pass too short
case 2: // User too short, pass ok
case 3: // Both Ok
}

答案 2 :(得分:8)

基本上没有比这更简单的方法,并且没有办法以明显更少的代码行完成。

if (username.length() < 6){
    if (password.length() < 6){
        // do case 1
    } else {
        // do case 2
    }
} else {
    if (password.length() < 6){
        // do case 3
    } else {
        // do case 4
    }
}

在我看来,这是最好的解决方案。

  

此外,我想以性感的方式做到这一点,而不是数以千计的不同'ifs'

如果用“sexy-java-way”表示“聪明”或“模糊”,那么还有其他方法可以做到。但它们肯定不会使代码更易于阅读/更易于维护。

顺便说一下,上面只涉及3 ...那是正确的三个 ... if陈述。


然而你的(最终)具体例子是:

public void checkLoginData(final String username, final String password){
    boolean user, pass;
    if (username.length() < 6){
        user = false;
    }else {
        user = true;
    }
    if (password.length() < 6){
        pass = false;
    }else {
        pass = true;
    }
    boolean[] logindaten = {user, pass};
    ....
}

可以简化为以下内容:

public void checkLoginData(final String username, final String password){
    boolean user = username.length() >= 6;
    boolean pass = password.length() >= 6;
    boolean[] logindaten = {user, pass};
    ....
}

请注意,这里可以进行简化,因为操作(假设开关中的“case”)可以重构为简单的布尔赋值,并且测试实际上彼此独立。一般来说,你不能这样做......


  

...但是我想让它更能让我的老板印象深刻;)

说真的,如果我是你的老板并且你编写了这样的代码,我会对 UN - 印象深刻。任何认为你聪明地编写模糊和不可维护代码的老板都是无能为力的。

答案 3 :(得分:8)

猜猜我会用枚举来解决它:

public class LoginController
{
  private void login( String username, String password )
  {
    LoginState state = determineLoginState( username, password );

    switch ( state )
    {
      case LOGIN_OK:
        //Do Something
        break;
      case USERNAME_FALSE:
        //Do Something
        break;
      case PASSWORD_FALSE:
        //Do Something
        break;
      case BOTH_FALSE:
        //Do Something
        break;
    }

  }

  private LoginState determineLoginState( String username, String password )
  {
    final boolean checkUsername = checkUsername( username );
    final boolean checkPassword = checkPassword( password );

    if ( checkUsername && checkPassword )
      return LoginState.LOGIN_OK;

    if ( !checkUsername && checkPassword )
      return LoginState.USERNAME_FALSE;

    if ( checkUsername && !checkPassword )
      return LoginState.PASSWORD_FALSE;

    if ( !checkUsername && !checkPassword )
      return LoginState.BOTH_FALSE;

    throw new AuthenticationException();
  }

  protected boolean checkUsername( String username )
  {
    return username.length() > 6;
  }

  protected boolean checkPassword( String password )
  {
    return password.length() > 6;
  }

  private enum LoginState
  {
    LOGIN_OK, USERNAME_FALSE, PASSWORD_FALSE, BOTH_FALSE;
  }

  public class AuthenticationException extends RuntimeException
  {

  }
}

答案 4 :(得分:3)

if (user) {
    if (pass) {
        // user = true, pass = true
    } else {
        // user = true, pass = false
    }
} else {
    if (pass) {
        // user = false, pass = true
    } else {
        // user = false, pass = false
    }
}

或者

int case = user ? (pass ? 1 : 2) : (pass ? 3: 4);

switch (case) {  
  case 1:
    System.out.println(" user = true, pass = true ");
    break;
  case 2:
    System.out.println(" user = true, pass = false ");
    break;
  case 3:
    System.out.println(" user = false, pass = true ");
    break;
  case 4:
    System.out.println(" user = false, pass = false ");
    break;
  }
}

答案 5 :(得分:0)

您可以执行以下操作,然后每种情况分别为1,2或3,依此类推。

switch((route.isComplete()?1:(route.getAuthentic()?2:(route.hasRoute()?3:0)))) {...}

答案 6 :(得分:0)

使用java12,您可以在switch-case中使用表达式,并提供Bool类型(https://blog.codefx.org/java/switch-expressions/)。

答案 7 :(得分:0)

private static boolean checkCharOf_(String userName){

  return userName.length() >= 6;

}

private static boolean checkCharOf_(String password){

  return password.length() >= 6;

}

private static boolean checkCharOf_And_(String userName, String password){

  return userName.length() >= 6 && password.length() >= 6;

}