【问题标题】:switch / case request with boolean带布尔值的开关/案例请求
【发布时间】:2012-02-09 15:39:03
【问题描述】:

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

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

  • 用户:真实通过:真实
  • 用户:假通过:真
  • 用户:假通过:假
  • 用户:真通过:假

现在我想为他们每个人做一个 switch/case 请求,但我不知道如何实现...

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



}

感谢您的提前帮助!

最好的问候狩猎

【问题讨论】:

  • 这里需要切换什么?你想达到什么目标?
  • 我需要每一个布尔链,它做不同的事情。因此,我想用开关来做到这一点。但我不让它工作
  • 考虑为每种情况使用一个枚举来确定您当前的状态,而不是两个双精度。这样你就可以轻松使用 switch/case 了。
  • 不如把它发布为 awnser,因为我不明白你的意思,抱歉
  • 刚刚添加了一个使用枚举的示例。

标签: java android boolean switch-statement


【解决方案1】:
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;
  }
}

【讨论】:

  • @safari 如果您只有 4 种组合,第一种就可以了。用switch也试过了,看看吧。
  • @4ndrew 我只是简单地回答了这个问题!
【解决方案2】:

你不能切换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
}

【讨论】:

  • Uggh ...任何认为这是“性感Java”的人都需要回到学校。你需要仔细阅读它以确保它是正确的......这总是一个不好的迹象。
  • 嗯,这只是一种使用开关的方法。我个人会使用 if / else if 链来实现它
  • @StephenC 它可能并不性感,但它是一种快速可靠的方法......当然,你可以使用枚举,但这更快。
  • @fge - 我不这么认为。这种方式执行 2 个 if 测试和一个 switch 加上两个 |= 语句。简单的方法(嵌套 ifs)是 2 if 测试。此外,在 99.9% 的情况下,性能差异是无关紧要的。
  • 只是为了补充:可以使用一些常量而不是值,会提高可读性
【解决方案3】:

基本上没有比这更简单的方法了,也没有办法用明显更少的代码行来做到这一点。

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

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

我还想以一种性感的 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};
    ....
}

可以简化为:

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

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


...但我更喜欢用它来打动我的老板;)

说真的,如果我是你的老板并且你写了这样的代码,我会UN-印象深刻。任何认为你在编写晦涩难懂的代码方面很聪明的老板都是一头雾水。

【讨论】:

  • 是的,我知道我以前也有过这种情况,但我更喜欢用它来打动我的老板;)因为我还在学习所有这些 java 和 android 的东西!反正!谢谢你! +1。因为你的有趣评论:P
【解决方案4】:

猜猜我会如何用枚举解决它:

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
  {

  }
}

【讨论】:

  • 我用了另一种方式。谢谢你的帮助!
【解决方案5】:

如果你真的想要一个“性感的 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 方式”,更像是一种“解决方法”)

【讨论】:

  • 我想我理解为什么位掩码更好,但我认为这种方法更具可读性并且更容易更新。
  • 我明白你想要做什么,但在我看来,这有点反模式,从逻辑结论中抛出一个字符串,然后打开它在任何代码库中都是代码异味我会努力的。到目前为止,我更喜欢连续的 if 语句。
  • @AlfredoGallegos 你读过(理解)全部答案了吗?主要是“......我宁愿只做 2 次不同的检查......”这部分 - 这几乎和你喜欢的一样,不是吗?而括号中的最后一句话应该很清楚我对那个解决方案的看法......(差不多5年前......)
  • 是的,OP 希望为用户和密码的每个可能的布尔组合运行不同的代码段。我知道这是一个旧答案,但我认为从两个布尔值中连接一个字符串以在 switch 语句中使用并不是最好的想法(我也很谨慎地在 OOP 语言中使用它)。我的意思是,它确实有效,但它不会与未来的重构配合得很好,我们应该尝试推动 OP(或将来阅读此内容的人)坚持更可维护的模式。将来有人可能会看到这种情况,并且最终会出现在某些应用程序中,我们应该避免这种情况。
  • @AleksandrKhomenko 肯定更好。但"-" 没有常数?,{很难相信我写了那个答案,但那是 2012 年} [:-)
【解决方案6】:

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

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

【讨论】:

    【解决方案7】:

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

    【讨论】:

      【解决方案8】:
      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;
      
      }
      

      【讨论】:

      • 请尝试始终使用编辑器顶部提供的按钮来格式化您的代码。您可以选择代码然后点击该按钮
      猜你喜欢
      • 2013-05-15
      • 2012-12-11
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多