Java - 检查没有if语句的空String

时间:2011-12-26 15:54:02

标签: java string if-statement performance

我有一个简单的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语句的长块会使代码难以阅读;它也不会提醒用户多个文本字段为空。有没有更有效的方法呢?

提前致谢!

8 个答案:

答案 0 :(得分:7)

效率更高?否。

更具可读性?是的 - 效率不同。

为每个字段或字段类型创建类似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!");
    }
}

我们的想法是保持主线代码的清晰和简洁,以符合您的个人风格,您正在使用的库等方式。除了自己编辑之外,还有现有的库来包装它。

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

答案 1 :(得分: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!");
    }
}

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

正如@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!!")

答案 4 :(得分:0)

创建一些扩展InputVerifier实现基本验证规则的子类,并将其附加到文本字段。验证者的第二个构造函数可以获取警告文本,您已准备就绪。

您还可以创建一个复合验证程序,它具有多个规则实例,并且要求所有这些实例都为true以便字段传递。例如结合非空和只有字母数字的东西。在这种情况下,复合构造函数可以获取警告文本,并在添加子规则文本时对其进行初始化。

答案 5 :(得分:0)

完全同意Binyamin Sharet和Dave。

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

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

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

答案 6 :(得分:0)

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

我喜欢将strategy pattern与默认情况一起使用。

您可以默认您的实现以查找空字符串以及您可能想要的任何其他内容。

你可以称之为“MyStringUtils”。 您可以传递扩展行为的对象,以便在其他地方使用“MyStringUtils”。

我从上面获取代码片段并将它们嵌入到此代码util中。

快乐的编码伴侣。

答案 7 :(得分:0)

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