2011-12-26 2 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!"); 
    } 
} 

Однако, я считаю, имеющие длинные блоки, если заявления делает код трудным для чтения; он также не будет предупреждать пользователя о том, что несколько текстовых полей пустые. Есть ли более эффективный способ сделать это?

Заранее благодарен!

+0

Только один момент: вы должны сделать ' "" .equals (yourstring)' вместо 'yourstring.equals ("") ', это позволит не бросить NPE, если' yourstring' дописывает быть пустым по тем или иным причинам – fge

+0

@fge Программирование Yeah yoda .. ужасно читать и отлично скрывать ошибки на самом деле. Если 'getText()' внезапно начинает возвращать нуль, вероятно, неплохо получить хорошее исключение. – Voo

ответ

7

Более эффективный? №

Более читаемый? Yep – КПД другого типа.

Создайте что-нибудь вроде метода 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

Как Ньютон отметил @ Dave: это только для удобства понимания. Производительность не влияет.

Сделать метод полезности:

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 и Dave.

Если вы хотите уменьшить количество операторов «if» в своем коде, вы можете использовать трехмерный оператор.

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

Это позволит повысить читабельность вашего кода, если вы хотите.

1

Вы можете создать класс под названием 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); 
} 

Этот подход позволяет обрабатывать несколько ошибок довольно легко.

0

Мне нравятся многие ответы. Пожалуйста, позвольте мне включить мой лакомый кусочек.

Мне нравится использовать strategy pattern со стандартным чехлом.

Вы можете по умолчанию выполнить свою реализацию, чтобы искать пустые строки и все, что вы можете себе представить.

Вы можете назвать это «MyStringUtils». Вы можете передать ему объекты, которые расширяют поведение так, как вы могли бы использовать «MyStringUtils» в других местах.

Я бы взял снимок кода сверху и вставлял их в этот код.

Счастливый помощник по кодированию.

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