Java - проверка на пустую строку без оператора if - PullRequest
3 голосов
/ 26 декабря 2011

У меня есть простой 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 ]

7 голосов
/ 26 декабря 2011

Более эффективно? Нет.

Более читабельно? Да - эффективность другого рода.

Создайте что-то вроде 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 голосов
/ 26 декабря 2011

Небольшое изменение, которое может помочь:

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!");
    }
}
1 голос
/ 26 декабря 2011

Вы можете создать класс под названием 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 голосов
/ 31 октября 2013
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 .. 
}
0 голосов
/ 27 декабря 2011

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

Мне нравится использовать шаблон стратегии с регистром по умолчанию.

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

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

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

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

0 голосов
/ 26 декабря 2011

Полностью согласен с Биньямином Шаретом и Дейвом.

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

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

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

0 голосов
/ 26 декабря 2011

Создайте пару подклассов, расширяющих InputVerifier , которые реализуют основные правила проверки, и присоедините их к текстовым полям.Второй конструктор верификатора может взять текст предупреждения, и вы готовы к работе.

Вы также можете создать составной верификатор, который имеет несколько экземпляров ваших правил и требует, чтобы все они были истиннымиполе для прохождения.например, объединить что-то вроде непустых и только-буквенно-цифровых.В этом случае составной конструктор может взять текст предупреждения и инициализировать текст подправил после их добавления.

0 голосов
/ 26 декабря 2011

Как заметил @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!!")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...