在Java中的嵌套映射中使用相同的itemID

时间:2017-10-06 14:45:21

标签: java collections

我正在对这些物体进行建模:
Visitor' is a general object that has长访客ID;
UserVisitorenum UserTypeDate startedAt
AddresseeUserenum AddresseeType {TO, CC, BCC}

多个Addressee个实例可能对应一个User,因此extend似乎不切实际。我将UserAddressee存储在Map<Long, T extends Visitor>中,并通过visitorID获取对象。它有效,但在几个地图中使用了相同的Long visitorID:每个AddresseeTypeallUsersallVisitors

在没有ID重复的情况下存储此类嵌套对象的常用方法是什么?

效率高还是有更好的方法:

class Visitor{ Long visitorID; /*some other data*/}
class User{ Visitor visitor; UserType type; /*some other data*/}

class MyModel{ 
    Map<Long, Visitor> visitorIDtoVisitorMap;
    Map<Long, User> visitorIDtoUserMap;
    Map<AddresseeType, Map<Long,User>> recipientsGroupedByAddresseeTypeMap;
    /* more code */
}

这些代码似乎违反了DRY原则。例如,visitorIDtoUserMap具有相同的Long visitorID作为键和值内的字段变量。

1 个答案:

答案 0 :(得分:0)

请描述您要找的内容。

  

多个收件人实例可以对应一个用户,因此扩展似乎不切实际。

这是真的。

使用AddresseeType和Users列表创建类似电子邮件的对象可能有效。

或者Addressee有一个用户对象的引用。

  

每个AddresseeType,allUsers,allVisitors

我不明白你的意思。 但是因为你也可以使用多个HashMap或HashSet:

  HashMap<Long, T extends Visitor> allVisitors;
  HashMap<Long, T extends Visitor> allUsers;
  HashSet<Long> addresseeTypeTO;

因此,如果使用了一个id,您可以轻松检查:

 allVisitors.containsKey(5465456);
 allUsers.containsKey(5465456);
 addresseeTypeTO.contains(5465456);  // getValue by using allVisitors.get(Long)

可以使用多个地图和集合,因为对象只存在一次,并且在每个地图中或只设置长值并存储对象的地址。