2011-12-26 44 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 .. 
}