Использование 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
методы для человека класса.