2017-10-11 83 views
2

將代碼編寫爲以下代碼是否是錯誤的做法?我希望能夠在我的人員類中存儲電子郵件,該電子郵件中還包含電子郵件類型(工作,個人等)。我決定爲此使用一個TreeMap。我知道所有變量都是私有的並且使用getter和setter來操作它們是一個好習慣,但是直接使用TreeSet方法而不是我自己的Person類來操作TreeSet是錯誤的嗎?換句話說,這是一個有效的可接受的方式嗎?代碼似乎工作正常。使用TreeMap作爲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("[email protected]", "School"); 
    p1.phoneNum.put("[email protected]", "Personal"); 

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

    p2.phoneNum.put("[email protected]", "Personal"); 
    p2.phoneNum.put("samjohnson", "Work"); 

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

Output: 
{[email protected]=Personal, [email protected]=School} 
{samsamyoussef=Work, [email protected]=Personal} 
+0

歡迎來到Stack Overflow!請[參觀](http://stackoverflow.com/tour)以查看網站的工作原理和問題,並相應地編輯您的問題。 –

回答

5

這不是可怕,但它使功能羨慕(代碼異味由此對象直接使用其他對象的字段)。

問題是,您只希望啓用向Person添加電子郵件地址,但您實際上公開了TreeMap的所有操作。像ceilingKey,tailMapremove的方法。爲了限制可以執行的操作,您應該完全封裝該字段並提供明確的方法。

3

通常ArrayList正在使用,但我想你使用TreeMap的原因是你想每個電子郵件或電話號碼(鍵)有一個ContactType(更好地使用枚舉)。

例如,你不能有個人,學校[email protected]

此外,最好將phoneNum設爲私有,並將addContact/ removeContact方法添加到年級Person類。

+0

嗨,我想知道,我將如何實現類似枚舉的ContactType?我是Java的新手,我似乎理解枚舉概念的要點,但在實現代碼時遇到了麻煩。謝謝! –

+1

肯定的: \t枚舉ContactTypes { \t \t學校, \t \t個人, \t \t工作 \t} \t \t公共類Person { \t \t TreeMap的<字符串,ContactTypes> PHONENUM =新TreeMap的<字符串, ContactTypes>(); \t \t} –