Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带布尔值的开关/案例请求_Java_Android_Boolean_Switch Statement - Fatal编程技术网

Java 带布尔值的开关/案例请求

Java 带布尔值的开关/案例请求,java,android,boolean,switch-statement,Java,Android,Boolean,Switch Statement,我正在尝试创建一个方法来检查登录名(用户名和密码)是否至少有6个字符 为了认识到我创建了这个方法public void checkloginda(最终字符串用户名,最终字符串密码)。在该方法中,我创建了布尔(user和pass),通过这些布尔,我可以创建4个不同的布尔链: 用户:true传递:true 用户:假通过:真 用户:false通过:false 用户:true通过:false 现在,我想为它们中的每一个做一个切换/案例请求,但我不知道如何实现 如果你问我为什么需要这个开关,我想我需要

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

为了认识到我创建了这个方法
public void checkloginda(最终字符串用户名,最终字符串密码)
。在该方法中,我创建了布尔(user和pass),通过这些布尔,我可以创建4个不同的布尔链:

  • 用户:true传递:true
  • 用户:假通过:真
  • 用户:false通过:false
  • 用户:true通过:false
现在,我想为它们中的每一个做一个切换/案例请求,但我不知道如何实现

如果你问我为什么需要这个开关,我想我需要它,因为我想对这4个布尔链中的每一个都做,它确实/显示了一些不同的东西。另外,我想用一种性感的java方式来做这件事,而不是使用大量不同的“如果”: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};



}
public void checkLoginData(最终字符串用户名、最终字符串密码){
布尔用户,通过;
if(username.length()<6){
用户=假;
}否则{
user=true;
}
if(password.length()<6){
通过=错误;
}否则{
通过=正确;
}
布尔[]登录数据={user,pass};
}

谢谢您的帮助

向萨法里致敬

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
    }
}


不能切换
布尔[]
,只能切换整数类型。要将布尔值转换为整数,可以对这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
}

基本上没有比这更简单的方法了,也没有方法用更少的代码行来完成

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
    }
}
可以简化为以下内容:

public void checkLoginData(final String username, final String password){
    boolean user = username.length() >= 6;
    boolean pass = password.length() >= 6;
    boolean[] logindaten = {user, pass};
    ....
}
请注意,这里可以进行简化,因为操作(假设开关中的“cases”)可以重构为简单的布尔赋值,并且测试实际上彼此独立。一般来说,你不能这么做


。。。但我更希望能给老板留下深刻印象;)


说真的,如果我是你的老板,而你编写了这样的代码,我会对你印象深刻。任何认为你在编写晦涩难懂、无法维护的代码方面很聪明的老板都是无知的。

我想这就是我用枚举解决问题的方法:

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
  {

  }
}
如果您真的想要一种“性感的java方式”(但这取决于您的理解),您可以做一些类似的事情(需要java 7):


但我更愿意只对每个人自己的消息进行两次不同的检查,将消息合并以进行表示。(不确定这是否可以被视为“性感java方式”,更像是一种“变通方法”)

您可以这样做,然后每个案例都是1、2或3,等等

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

使用java12,您可以在switch case中使用表达式,并提供
Bool
type()

private静态布尔checkCharOf(字符串用户名){
返回userName.length()>=6;
}
私有静态布尔checkCharOf_389;(字符串密码){
返回密码。长度()>=6;
}

私有静态布尔checkCharOf_和_(字符串用户名、字符串密码){
返回userName.length()>=6和password.length()>=6;
}


您需要在这里切换什么?你想实现什么?我需要每个布尔链都有不同的功能。正因为如此,我想用开关来做这个。但我不明白它的工作原理。请考虑对每种情况使用枚举来确定当前的状态,而不是两个双精度。因此,您可以轻松地使用switch/case。而不是将其作为awnser发布,因为我不明白您的意思,所以,sorry只添加了一个使用枚举的示例。@safari如果您只有4个组合,第一个就可以了。尝试使用相同的开关,检查它。@4ndrew我只是简单地回答了这个问题!是的,我知道我以前也有过这样的经历,但我想让它更能打动我的老板;)因为我还在学习java和android的东西!无论如何Thx人+1.因为你有趣的评论:帕格。。。任何认为这是“性感java”的人都需要回到学校。你需要仔细阅读,以确保它是正确的。。。这总是一个不好的迹象。好吧,这只是一种使用开关的方法。我个人会使用if/else if来实现它chain@StephenC它可能不性感,但它是一个快速和可靠的方式做到这一点。。。当然,您可以使用枚举,但这更快。@fge-我不这么认为。这种方法执行2个if测试和一个开关加上两个
|=
语句。简单的方法(嵌套ifs)是2 if测试。此外,99.9%的时间性能差异是不相关的。只是补充:可以使用一些常量而不是值,这将提高可读性我用另一种方法来做。谢谢你的帮助!我想我理解为什么位掩码更好,但我认为这种方法可读性更高,更容易更新。我知道你想做什么,但在我看来,这是一种反模式,从逻辑结论中抛出一个字符串,然后打开它,这将是我工作的任何代码库中的一种代码味道。到目前为止,我更喜欢连续的if语句。@AlfredoGallegos你读过(理解)整个答案了吗?主要是“我只想做两个不同的检查…”-这几乎和你想要的完全一样,不是吗?括号中的最后一句应该非常清楚我对这个解决方案的看法。。。(大约5年前…)是的,OP希望为用户和过程的每个可能的布尔组合运行不同的代码段。我知道这是一个老生常谈的答案,但我认为将两个布尔值的字符串串联起来用于switch语句(我在OOP语言中也很谨慎)并不是最好的主意。我的意思是,它确实可以工作,但它在未来的重构中不会起到很好的作用,我们应该努力推动OP(或者将来读到这篇文章的人)坚持使用更易于维护的模式。将来可能会有人看到这一点,它最终会出现在某些应用程序中,我们应该避免这种情况。@Aleksa
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
  {

  }
}
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);
}
switch((route.isComplete()?1:(route.getAuthentic()?2:(route.hasRoute()?3:0)))) {...}