【问题标题】:Java - Check for empty String without if statementJava - 在没有 if 语句的情况下检查空字符串
【发布时间】:2012-01-28 01:28:58
【问题描述】:

我有一个带有三个文本框的简单 JFrame:名字、姓氏和电子邮件地址。按下添加按钮后,详细信息将添加到数组列表中。目前我有一组 if 语句来检查用户是否在文本框中输入了一些内容,如下所示:

private void addPersonButtonActionPerformed(java.awt.event.ActionEvent evt) {
    String firstName = firstNameTextField.getText();
    String lastName = lastNameTextField.getText();
    String emailAddress = emailTextField.getText();

    if (firstName.equals("")) {
        System.out.println("First Name is missing");
    } else if (lastName.equals("")) {
        System.out.println("Last Name is missing");
    } else if (emailAddress.equals("")) {
        System.out.println("E-Mail address is missing");
    } else if (!Email.isValid(emailAddress)) {
        System.out.println("E-Mail address is invalid");
    } else {
        personArrayList.add(new Person(firstName, lastName, emailAddress));
        System.out.println("Person added!");
    }
}

但是,我发现 if 语句块太长会使代码难以阅读;它也不会提醒用户多个文本字段为空。有没有更有效的方法来做到这一点?

提前致谢!

【问题讨论】:

  • 只有一点:你应该使用"".equals(yourstring) 而不是yourstring.equals(""),如果yourstring 由于某种原因附加为空,则不会抛出NPE
  • @fge 是的 yoda 编程.. 阅读起来很糟糕,而且真的很适合隐藏错误。如果getText() 突然开始返回空值,最好获得一个很好的例外。

标签: java string if-statement performance


【解决方案1】:

更有效率?没有。

更具可读性?是的——不同类型的效率。

为每个字段或字段类型创建类似isValid() 的方法。这些将包含简单的验证,如空白检查、正则表达式等,偶尔还会包含其他特定于域的逻辑。

有很多方法可以分解和/或抽象此功能,大致相当于:

private void addPersonButtonActionPerformed(java.awt.event.ActionEvent evt) {
    String firstName = firstNameTextField.getText();
    String lastName = lastNameTextField.getText();
    String emailAddress = emailTextField.getText();

    if (   isNameValid(firstName, "First name")
        && isNameValid(lastName, "Last name")
        && isEmailValid(emailAddress, "Email address")) {
        personArrayList.add(new Person(firstName, lastName, emailAddress));
        System.out.println("Person added!");
    }
}

我们的想法是保持主线代码简洁明了,以适合您的个人风格、您正在使用的库等方式。除了滚动您自己的库之外,还有现有的库可以将其包装起来。

如果您有许多这样的“表单”,那么抽象表单本身及其验证可能是有意义的;如果它只是一个,那么可能没有令人信服的理由比上述类似的东西更进一步。

【讨论】:

    【解决方案2】:

    只是一点点改变可能会有所帮助:

    private void addPersonButtonActionPerformed(java.awt.event.ActionEvent evt) {
        String firstName = firstNameTextField.getText();
        String lastName = lastNameTextField.getText();
        String emailAddress = emailTextField.getText();
        boolean valid = true;
    
        if (firstName.equals("")) {
            System.out.println("First Name is missing");
            valid = false;
        }  
        if (lastName.equals("")) {
            System.out.println("Last Name is missing");
            valid = false;
        } 
        if (emailAddress.equals("")) {
            System.out.println("E-Mail address is missing");
            valid = false;
        } 
        if (!Email.isValid(emailAddress)) {
            System.out.println("E-Mail address is invalid");
            valid = false;
        } 
        if(valid) {
            personArrayList.add(new Person(firstName, lastName, emailAddress));
            System.out.println("Person added!");
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以创建一个名为 Validations(或类似)的类,它内部有一个错误消息列表。每个 Validations 方法都会进行检查并返回相同的 Validations 对象,以便于链接。最后一个方法返回列表。比如:

      public class Validations {
          private List<String> errors = new ArrayList<String>();
      
          Validations notEmpty(String fieldDescription, String value) {
              if (value.length() == 0)
                  errors.add(fieldDescription + " can't be empty");
              return this;
          }
      
          List<String> errors() {
              return errors;
          }
      }
      

      然后在使用中:

      List<String> errors = new Validations()
          .notEmpty("first name", firstNameTextField.value())
          .notEmpty("last name", lastNameTextField.value())
          .errors();
      if (!errors.isEmpty()) {
          System.out.println(errors);
      }
      

      这种方法让您可以轻松处理多个错误。

      【讨论】:

        【解决方案4】:

        正如@Dave Newton 所说:这只是出于可读性的原因。性能不受影响。

        制作一个实用方法:

        private boolean checkNotEmpty(String value, String messageIfEmpty) {
           if (value.equals(""))
              System.out.println(messageIfEmpty);
        }
        

        所以你可以这样写:

        checkNotEmpty(firstNameTextField.getText(), "First name is missing");
        checkNotEmpty(lastNameTextField.getText(), "Last name is missing");
        

        等等……

        你甚至可以像 JUnit 一样编写一些其他方法:

        checkTrue(boolean value, String messageIfNotTrue) {...}
        

        所以你可以写出奇怪的条件,比如:

        checkTrue(textbox.getValue().length() % 2 == 0, "The number of chars is not even!!")
        

        【讨论】:

          【解决方案5】:

          创建几个扩展 InputVerifier 的子类,实现基本的验证规则,并将 附加到您的文本字段。验证器的第二个构造函数可以获取警告文本,然后您就可以开始了。

          您还可以创建一个复合验证器,该验证器具有多个规则实例,并且要求所有这些实例都为真,该字段才能通过。例如结合诸如非空和仅字母数字之类的东西。在这种情况下,复合构造函数可以获取警告文本,并在添加子规则时初始化它们的文本。

          【讨论】:

            【解决方案6】:

            完全同意 Binyamin Sharet 和 Dave 的观点。

            如果你想减少代码中“if”语句的数量,可以使用三元运算符。

                String firstName= "";
                String b;
                b = firstName.equals("") ? "First Name is missing" : "Present" ;
                System.out.println(b);
            

            如果您愿意,这将增加代码的可读性。

            【讨论】:

              【解决方案7】:

              我喜欢很多答案。 请允许我把我的花絮扔进去。

              我喜欢在默认情况下使用strategy pattern

              您可以将您的实现默认为查找空字符串以及您可能喜欢的任何其他内容。

              你可以称它为“MyStringUtils”。 您可以将扩展行为的对象传递给它,就像在其他地方使用“MyStringUtils”一样。

              我会从上面获取代码片段并将它们嵌入到这个代码工具中。

              编码愉快。

              【讨论】:

                【解决方案8】:
                public String validate(JTextField... fields) {
                    StringBuilder builder = new StringBuilder();
                    for (JTextField s : fields) {
                        if (s.getText() == null || "".equals(s.getText())) {
                            builder.append(s.getName() + " is missing\n");
                        }
                    }
                    return builder.toString();
                }
                
                
                private void addPersonButtonActionPerformed(java.awt.event.ActionEvent evt) {
                    String message = validate(firstNameTextField,lastNameTextField,emailTextField);
                    if(message.isEmpty()) // addperson...
                    else // print message .. 
                }
                

                【讨论】:

                  【解决方案9】:

                  你可以尝试使用 isEmpty

                  private void addPersonButtonActionPerformed(java.awt.event.ActionEvent evt) {
                  String firstName = firstNameTextField.getText();
                  String lastName = lastNameTextField.getText();
                  String emailAddress = emailTextField.getText();
                  
                  if (firstName.isEmpty()) {
                      System.out.println("First Name is missing");
                  } else if (lastName.equals()) {
                      System.out.println("Last Name is missing");
                  } else if (emailAddress.isEmpty("")) {
                      System.out.println("E-Mail address is missing");
                  } else if (!Email.isValid(emailAddress)) {
                      System.out.println("E-Mail address is invalid");
                  } else {
                      personArrayList.add(new Person(firstName, lastName, emailAddress));
                      System.out.println("Person added!");
                  }
                  }
                  

                  【讨论】:

                  • 很高兴能解释一下您的回答与其他回答有何不同和/或更好。另外,这看起来不对lastName.equals()emailAddress.isEmpty("")
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-12-02
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-08-28
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多