在我的 java 编码中,我经常以几个Map<String,Map<String,foo>>
or结尾Map<String,List<String>>
,然后我很难记住哪个 String 是哪个键。//Map<capabiltyId,Map<groupId,foo>>
我用or评论声明//Map<groupId,List<capabilityId>
,但这不是最好的解决方案。如果 String 不是最终的,我会创建新的类CapabilityId extends String
和GroupId extends String
,但我不能。有没有更好的方法来跟踪哪个是关键,也许让编译器强制执行它?
7 回答
如果需要,将字符串包装在包装类中:
class GroupId implements Comparable {
private String groupId;
public GroupId (String groupId) {
this.groupId = groupId;
}
...
}
Map<GroupId, List<CapabilityId>> m = ...
可以包含一个名为“id”的字段,而不是CapabilityId
extend ;那么您可以定义为,并且您可以通过您的关键类上的a 获取各个 ID 字段。String
CapabilityId
String
Map
Map<CapabilityId, Map<GroupId, Foo>>
getId()
我不确定我自己会不会这样做,但如果我这样做了,这可能就是我会做的。
abstract GenericId
您可以通过拥有一个具有 id 字段和getId()
方法的类来限制混乱,并拥有CapabilityId
并GroupId
继承它。
创建一个ID
可以子类化的类,它由一个String
字段和实现equals()
以及hashCode()
使用该字段组成。
我会将它们全部放在一个类中,并使用合理的字段/方法/参数名称。
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..
}
这样,您可以在方法/参数名称中看到它期望/返回的内容。
有很多方法可以继续这个(一些已经提到):
- 作为@Roman,将通用类型包装在更具体的类型中,这样可以提供更强的类型。强打字好,IMO。
- 作为@nanda,使用更具体的集合类型。Java 库在这方面有点差。这取决于你对依赖的感觉。
- 作为@BalusC,将所有 icky 的东西移到一个 icky 类中。并没有真正消除问题,但它确实包含它(就像在捉鬼敢死队中一样)。
Map<String,Map<String,foo>>
看起来很像您有一个复合键,即包含两个部分的键。因此,引入一个不可变的复合键类,即代表两个组件值对象的值对象。
而不是Map<String,List<String>>
你应该使用 Google Guava / Google Collection 中的 Multimap
添加到其他答案:
把它包起来。
这不仅是解决您的问题的方法,而且总体上是一个好主意,即避免使用简单的参数。您的代码将获得可读性、完整性和可维护性。你可以给它添加各种漂亮的属性,例如声明它@Immutable。正如您发现的那样,这种方式更好地记住和控制。您拥有该课程,并且可以随心所欲地使用它。