В вашем случае я бы сделал Person.email закрытым пакетом, чтобы он мог оставаться как есть, и поместил класс PersonValidator в тот же пакет, где у вас есть класс Person.
Это сделает вас возможность передавать весь объект Person в метод валидатора, например:
public static boolean email(Person person) {
String email = person.email;
return false;
}
Но это очень изолированный и плохо спроектированный. Кроме того, существует множество способов вызова методов из одного класса в другом. Например, создайте метод isEmailValid
в классе Person и где вы можете напрямую использовать переменную email
при вызове PersonValidator.email(email)
.
Многие из этих необычных подходов, скорее всего, лишают законной силы SOLID, чистый код и некоторые другие принципы (например, слишком тесно связанные классы).
Как и другие заявленные ответы, гораздо лучше сохранять поля объектов хорошо инкапсулированными (т. Е. Используя private
модификатор доступа), а затем обращаться к ним с помощью get/set
методов.
Затем независимо от того, сначала вы создаете объект Person ( например, проанализируйте список Person из файла и затем подтвердите, если они имеют правильный адрес электронной почты или получают параметры запроса от чего-то, например, HTTP-запрос для нового человека), вы можете вызвать PersonValidator.email(personObject.getEmail()
или PersonValidator.email(emailParam)
.
Пакет хранения класса PersonValidator зависит только на конвенции вашего проекта.
Наличие в объекте методов "getters / setters", т. Е. getEmail() setEmail(String email) getName() setName(String name)
, является распространенным и хорошим соглашением для правильной разработки кода.
Рекомендуется применять такие методы, когда это применимо.
Просто для дальнейшего чтения:
Использование метода getlib для поля электронной почты в классе Person в c не должно аннулировать какие-либо стандарты кодирования (даже YAGNI - вам это не нужно) потому что в будущем может быть много вариантов использования (например, отображение его для человека / клиента, использующего вашу программу).
Упомянутый термин инкапсуляции в коротких словах означает сохранение внутренней реализации объекта внутри него, то есть не делает его видимым для других классов.
Существуют ситуации, когда объект изменяет свои внутренние поля с помощью своих методы, которые не являются "установочными", но текущее значение поля всегда должно быть доступно с помощью метода getField()
.
«Не переоценивайте, но помните о будущем росте» (я, вероятно, никого не цитирую: P).
Дальнейший вариант использования может заключаться в проверке большего числа членов поля объекта Person, что может привести к:
class PersonValidator {
public static boolean validatePerson(Person person) {
return validEmail(person.getEmail()) &&
//other validators when needed &&
validPhone(person.getPhonenr());
}
//very hard to validate
//most likely if has just a numbers (replacing "-" before)
//and only a length check (at least 3 without country code)
public static boolean validPhone(String phone) {
return false; //
}
public static boolean validEmail(String email) {
return false;
}
}
Опять же, как указано в других ответах, гораздо лучше попробовать поискать существующие библиотеки валидаторов, чем писать новую - REALLY, REALLY .
Существуют разные длины и форматы телефонных номеров (в основном зависят от страны), проверьте это .
Самый короткий действительный адрес электронной почты может быть a@a
или " "@a
, но эти являются локальными адресами электронной почты. Проверьте эту вики или эту github gist , чтобы увидеть некоторые странные действительные примеры.
И название, это зависит от страны l aws, и они, вероятно, могут принять Первые имена, такие как «A» или «Ben11» и самая странная фамилия в Польше - «Cyps Albo Zyps».