在我的java编码中,我经常会遇到几个Map<String,Map<String,foo>>
或Map<String,List<String>>
,然后我无法记住哪个String是哪个键。我使用//Map<capabiltyId,Map<groupId,foo>>
或//Map<groupId,List<capabilityId>
对声明发表评论,但这不是最好的解决方案。如果String不是最终的,我会创建新的类CapabilityId extends String
和GroupId extends String
,但我不能。有没有更好的方法来跟踪哪个是关键,可能让编译器强制执行它?
答案 0 :(得分:9)
如果需要,请在包装类中包装字符串:
class GroupId implements Comparable {
private String groupId;
public GroupId (String groupId) {
this.groupId = groupId;
}
...
}
Map<GroupId, List<CapabilityId>> m = ...
答案 1 :(得分:7)
CapabilityId
可以包含名为“id”的String
字段,而不是CapabilityId
扩展String
。然后,您的Map
可以定义为Map<CapabilityId, Map<GroupId, Foo>>
,您可以通过关键类的getId()
获取各个ID字段。
我不确定自己会这样做,但如果我这样做,这可能就是我要做的。
您可以通过使用带有ID字段和abstract GenericId
方法的getId()
类来限制混乱,并让CapabilityId
和GroupId
继承。
答案 2 :(得分:3)
创建一个ID
类,您可以将其子类化,该类包含String
字段以及使用该字段的equals()
和hashCode()
的实现。
答案 3 :(得分:2)
我会把它全部放在单个类中,并使用合理的字段/方法/参数名称。
public class GroupCapabilities {
private Map<String, Map<String, Group>> groupCapabilities;
public void addGroup(String capabilityId, Group group) {
Map<String, Group> groups = groupCapabilities.get(capabilityId);
if (groups = null) {
groups = new HashMap<String, Group>();
groupCapabilities.put(capabilityId, group);
}
groups.put(group.getId(), group);
}
public Map<String, Group> getGroups(String capabilityId) {
return groupCapabilities.get(capabilityId);
}
public Group getGroup(String capabilityId, String groupId) {
Map<String, Group> groups = groupCapabilities.get(capabilityId);
return (groups != null) ? groups.get(groupId) : null;
}
// Etc..
}
通过这种方式,您可以在方法/参数名称中看到它所期望/返回的内容。
答案 4 :(得分:1)
有很多方法可以解决这个问题(一些已经提到过):
Map<String,Map<String,foo>>
看起来非常像你有一个复合键,即一个由两部分组成的键。因此,引入一个不可变的复合键类,它是一个表示两个组件值对象的值对象。答案 5 :(得分:0)
而不是Map<String,List<String>>
您应该使用Google Guava / Google Collection中的Multimap
答案 6 :(得分:0)
添加其他答案:
包裹它。
这不仅仅是解决问题的方法,而是一般的好主意,即避免简单 参数。您的代码将获得可读性,理智性和可维护性。 你可以添加各种不错的属性,例如声明它@Immutable。当你发现这种方式时,记住和控制会更好。你拥有这门课程,可以随心所欲地做任何事情。