boolean的switch/case请求

saf*_*ari 10 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};



}
Run Code Online (Sandbox Code Playgroud)

Thx提前帮助!

最好的问候野生动物园

use*_*421 12

如果你真的想要一个"性感的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);
}
Run Code Online (Sandbox Code Playgroud)

但我更愿意只用他自己的消息做两个不同的检查,消息被加入进行演示.(并且不确定这是否可以被认为是"性感的java方式",更像是"解决方法")


kin*_*nak 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
}
Run Code Online (Sandbox Code Playgroud)

  • Uggh ......任何认为这是"性感的java"的人都需要回到学校.你需要仔细阅读它,以确保它是正确的......这总是一个不好的迹象. (12认同)
  • @fge - 我不这么认为.如果测试和开关加上两个`| =`语句,这种方式执行2.如果测试,简单的方法(嵌套的ifs)是2.此外,99.9%的时间表现差异无关紧要. (2认同)

Ste*_*n C 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
    }
}
Run Code Online (Sandbox Code Playgroud)

在我看来,这使得这是最好的解决方案.

此外,我想用性感的java方式做到这一点,而不是成千上万的不同'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};
    ....
}
Run Code Online (Sandbox Code Playgroud)

可以简化为以下内容:

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

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


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

说真的,如果我是你的老板,你写这样的代码,我会成为联合国人留下深刻的印象.任何认为你聪明地编写模糊和不可维护代码的老板都是无能为力的.


cru*_*sam 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
  {

  }
}
Run Code Online (Sandbox Code Playgroud)


Vaa*_*ndu 5

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
    }
}
Run Code Online (Sandbox Code Playgroud)

或者

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;
  }
}
Run Code Online (Sandbox Code Playgroud)