Как получить один конкретный атрибут из класса с несколькими атрибутами - PullRequest
0 голосов
/ 22 января 2020
public  class Person {
String name;
int year;
int month;
int day;
String email;
String phonenr;

public Person(String name, int year, int month, int day, String email, String phonenr) {
    this.name = name;
    this.year = year;
    this.month = month;
    this.day = day;
    this.email = email;
    this.phonenr = phonenr;
}

У меня есть этот объект. Я хочу получить доступ к атрибуту электронной почты только в другом классе, чтобы я мог проверить, является ли электронная почта действительной, используя assert в тестовой директории. Как получить доступ только к атрибуту электронной почты от Person из другого класса, чтобы использовать его позже для проверки электронной почты?

Это класс, к которому я хочу получить доступ к атрибуту электронной почты.

public class PersonValidator {
public static boolean email(String email){
    Person onePerson = new Person();
    return false;
}

}

Это тестовый класс для проверки правильности электронной почты:

class PersonRegisterTest {

@Test
void checkValidEmail() {
 assertTrue(PersonValidator.email("adrianJames@oslomet.no"));
 assertTrue(PersonValidator.email("example@example.com"));
 assertTrue(PersonValidator.email("example.example@yahoo.com"));

}

Ответы [ 4 ]

1 голос
/ 22 января 2020

Хорошей практикой в ​​Java является создание всех полей private и создание «методов получения и установки», то есть функций для получения и установки значений. Например:

public class Person {

    private String email;

    public void setEmail(String email) {
        this.email = email;
    }

    public String getEmail() {
        return this.email;
    }
}

Этот способ имеет несколько преимуществ:

  • Если вы решите, что хотите изменить значения, допустимые в поле, вы можно сделать это с помощью метода setter. Например, если вы хотите установить минимальную длину писем, вы можете указать в своем методе if (email.length() < 10) return;, чтобы письма не короче 10 символов

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

  • Многие инструменты и платформы ожидают, что объекты Java будут в этом формате. Известные примеры включают Jackson для сериализации JSON и Spring / Spring Boot для разработки веб-приложений, а также многие другие.

PS, если вы устали писать геттеры и сеттеры :

  1. Проверьте, есть ли в вашей IDE способ их автоматической генерации (большинство из них это делают)
  2. Просмотрите библиотеку с именем Lombok, она предоставляет аннотацию @Data, которая может генерировать эти методы автоматически во время компиляции. (https://projectlombok.org/)
0 голосов
/ 22 января 2020

В вашем случае я бы сделал 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».

0 голосов
/ 22 января 2020

Сначала добавьте к вам геттеры объект / класс Person и сделайте внутреннее состояние объекта доступным только через геттеры:

public class Person {
    private final long id;
    private final String name;
    private final String email;

    public Person(long id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    public String getEmail() {
        return email;
    }

    // Other 2 getters
}

Затем создайте валидатор, который может проверять формат адреса электронной почты или лучше использовать библиотека (например, https://commons.apache.org/proper/commons-validator/) для этого:

public final class EmailValidator {

    private EmailValidator() { }

    public static boolean isValidEmail(String email) {
        // check if valid email and return true or fale
    }
}

Позвоните в валидатор, получив адрес электронной почты от нового человека, позвонив получателю. Валидатор не должен иметь никакого легального узла объекта Person.

public static void main(String[] args) {
    Person newPerson = new Person(1L, "test user", "valid@hotmail.com");

    if (EmailValidator.isValidEmail(newPerson.getEmail())) {
        System.out.println("Valid email address");
    } else {
        System.out.println("Invalid email address");
    }
}
0 голосов
/ 22 января 2020

Лучше хранить ваши члены / переменные данных внутри класса Person как частные, и вы можете добавить метод getters и setters, к которому вы можете обращаться извне класса и с помощью которого вы можете обращаться к членам / переменным данных вашего класса. , Вы можете сделать что-то вроде:

public  class Person {
String name;
int year;
int month;
int day;
String email;
String phonenr;

public Person(String name, int year, int month, int day, String email, String phonenr) {
    this.name = name;
    this.year = year;
    this.month = month;
    this.day = day;
    this.email = email;
    this.phonenr = phonenr;
}

   public String getEmail()
   {
      return this.email;
   }
}
...