Лучший способ проверки полей в JAVA - PullRequest
1 голос
/ 14 апреля 2020

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

Пример ввода:

String firstName = "Alex";
String surname = "Smith";
int numberOfGuests = 3;
int numberOfPets = 2;
String email = "alexSmith@gmail.com";

Проверка:

final int GUEST_MIN = 1;
int guestMax = 4;
final int PETS_MIN = 0;
int petsMax = 4;
boolean presenceCheck = false;
boolean rangeCheck = false;
boolean formatCheck = false;

//Presence Check
if(!(firstName.isEmpty() || surname.isEmpty() || email.isEmpty()))
{
    presenceCheck = true;
}
System.out.println(presenceCheck);

//RangeCheck
if(!(numberOfGuests < GUEST_MIN || numberOfGuests > guestMax || numberOfPets < PETS_MIN || numberOfPets > petsMax))
{
    rangeCheck = true;
}
System.out.println(rangeCheck);

//Format Check
if(email.contains("@"))
{
    formatCheck = true;
}
System.out.println(formatCheck);

Я планирую добавить к этому, и мне было интересно, есть ли способ избежать многих строчек if if.

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Есть некоторые проблемы с вашей проверкой.

Что если строка null? Что это за строка " "?

Для presenceCheck лучше написать функцию:

public static boolean empty(List<String> strings) {
    // Null-safe, short-circuit evaluation.
    // .trim() removes the whitespace from front and back
    // if anyString is null or empty or space, it will return true, else false
    return strings.stream().anyMatch(s -> s == null || s.trim().isEmpty());
}

Затем вы можете вызвать ее как:

presenceCheck = empty(Arrays.asList(firstName, lastName, email);

Нет лучшего решения для вашего диапазона. За исключением удаления, например:

rangeCheck = (!(numberOfGuests < GUEST_MIN || numberOfGuests > guestMax || numberOfPets < PETS_MIN || numberOfPets > petsMax));

Недостаточно просто проверить @ в электронной почте, вы должны сделать что-то вроде:

public static final Pattern VALID_EMAIL_ADDRESS_REGEX = 
    Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE);

public static boolean validateEmail(String emailStr) {
    return VALID_EMAIL_ADDRESS_REGEX.matcher(emailStr).find();
}

formatCheck = validateEmail(email);
0 голосов
/ 14 апреля 2020

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

presenceCheck = (!(firstName.isEmpty() || surname.isEmpty() || email.isEmpty()));

rangeCheck = (!(numberOfGuests < GUEST_MIN || numberOfGuests > guestMax || numberOfPets < PETS_MIN || numberOfPets > petsMax));

formatCheck = (email.contains("@"));

Если вы хотите sh, чтобы использовать троичный оператор для большей ясности, используйте, как показано ниже.

    presenceCheck = (!(firstName.isEmpty() || surname.isEmpty() || email.isEmpty())) ? true:false; 
    rangeCheck = (!(numberOfGuests < GUEST_MIN || numberOfGuests > guestMax || numberOfPets < PETS_MIN || numberOfPets > petsMax)) ? true : false; 
formatCheck = (email.contains("@"))? true :false;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...