Использование TreeMap в качестве свойства в классе объекта Person

Это неправильная практика писать мой код следующим образом? Я хочу иметь возможность сохранять электронную почту в своем личном классе, которая также содержит тип электронной почты (рабочий, личный и т. Д.). Я решил использовать TreeMap для этого. Я знаю, что это хорошая практика, чтобы все ваши переменные были приватными и использовали методы getter и setters для манипулирования ими, но неправильно ли манипулировать моим TreeSet, напрямую используя методы TreeSet, а не мои собственные в моем классе Person? Другими словами, действительно ли это приемлемый способ сделать это? Код, кажется, работает нормально.

public class Person {
  private String firstName;
  private String lastName;
  private String note;
  TreeMap<String, String> phoneNum = new TreeMap<String, String>();

  // Assume constructor method contains firstName & lastName and there are
  // getters and setters for both
}

public class MainDriver {
  public static void main(String[] args) {
    Person p1 = new Person("John", "Smith");

    p1.phoneNum.put("jsmith@gmail.com", "School");
    p1.phoneNum.put("jsmith19@gmail.com", "Personal");

    Person p2 = new Person("Sam", "Johnson");

    p2.phoneNum.put("samjohn@gmail.com", "Personal");
    p2.phoneNum.put("samjohnson", "Work");

    System.out.println(p1.phoneNum);
    System.out.println(p2.phoneNum);
  }
}

Output:
{jbillingham@gmail.com=Personal, jebillingham3@gmail.com=School}
{samsamyoussef=Work, samyou@gmail.com=Personal}

2 ответа

Решение

Это не страшно, но включает зависть к функциям (запах кода, при котором объекты напрямую используют поля других объектов).

Проблема в том, что вы хотите включить только добавление адресов электронной почты в Person, но вы на самом деле выставляете все операции TreeMap, Методы как ceilingKey, tailMap а также remove, Для ограничения операций, которые могут быть выполнены, вы должны полностью инкапсулировать поле и предоставить явные методы.

Обычно ArrayList используется, но я думаю, причина, по которой вы используете TreeMap если вы хотите, чтобы у каждого адреса электронной почты или номера телефона (ключа) был один контактный тип (лучше использовать enum).

Например, у вас не может быть jbillingham@gmail.com для личного, школьного.

А также, лучше сделать phoneNum как личное и добавить addContact/ removeContact методы для человека класса.

Другие вопросы по тегам