使用TreeMap作为Person对象类中的属性

时间:2017-10-11 21:38:36

标签: java class treemap

将代码编写如下是错误的做法吗?我希望能够在我的人员类中存储一封电子邮件,其中还包含电子邮件类型(工作,个人等)。我决定使用TreeMap。我知道所有变量都是私有的并使用getter和setter来操作它们是一种好习惯,但是通过直接使用TreeSet方法而不是我自己的Person类来操作我的TreeSet是错误的吗?换句话说,这是一种有效的可接受的方式吗?代码似乎工作正常。

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 个答案:

答案 0 :(得分:5)

它不是可怕的,但它启用了功能羡慕(代码气味,即对象直接使用其他对象的字段)。

问题是您只希望启用向Person添加电子邮件地址,但实际上您公开了TreeMap的所有操作。像ceilingKeytailMapremove这样的方法。为了限制可以执行的操作,您应该完全封装字段并提供显式方法。

答案 1 :(得分:3)

通常会使用ArrayList,但我想您使用TreeMap的原因是您希望每封电子邮件或电话号码(密钥)都有一个ContactType(最好使用枚举)。

例如,对于Personal,School,你不能拥有jbillingham@gmail.com。

而且,最好将phoneNum设为私有,并将addContact/ removeContact方法添加到Person类中。