2011-12-26 45 views
3

我有一个简单的JFrame有三个文本框:名字,姓氏和电子邮件地址。一旦按下添加按钮,细节就被添加到数组列表中。目前,我有一组的,如果检查语句,如果用户输入在文本框中的东西如下图所示:Java - 检查空字符串,如果没有语句

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

在此先感谢!

+0

只差一分:你应该做' “” .equals(yourstring)',而不是'yourstring.equals( “”)',它将使如果'yourstring'追加为空不抛出NPE出于某种原因 – fge 2011-12-26 16:02:46

+0

@fge是啊yoda编程..可怕的阅读和伟大的隐藏错误真的。如果'getText()'突然开始返回null,那么得到一个很好的例外可能是个好主意。 – Voo 2011-12-26 16:26:50

回答

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

这样做是为了保持主线代码干净简洁,在与适合的方式你的个人风格,你正在使用的库等等。除了自己翻译,还有现有的库来包装它。

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

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!"); 
    } 
} 
0

正如@戴夫牛顿指出:这只是可读性原因。性能不受影响。

做一个实用的方法:

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!!") 
0

创建几个子类的扩展InputVerifier实现基本验证规则,并连接到你的文本字段。验证者的第二个构造函数可以接受警告文本,然后就可以开始了。

您还可以创建一个复合验证,有你的规则的几个实例,并要求对所有这些是真实的领域通过。例如结合诸如非空字符和唯一字母数字之类的东西。在这种情况下,组合构造函数可以接受警告文本,并在添加子规则文本时初始化它们。

0

完全同意Binyamin Sharet和戴夫。

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

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

这将增加您的代码的可读性,如果你想。

1

您可以创建一个名为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); 
} 

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

0

我喜欢很多答案。 请允许我丢掉我的珍闻。

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

你可以默认你的实现来查找空字符串和任何你可能喜欢的东西。

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

我想从上面的代码剪辑并将它们嵌入到此代码util中。

快乐的编码伴侣。

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