5

在我的 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 StringGroupId extends String,但我不能。有没有更好的方法来跟踪哪个是关键,也许让编译器强制执行它?

4

7 回答 7

9

如果需要,将字符串包装在包装类中:

class GroupId implements Comparable {
   private String groupId;

   public GroupId (String groupId) {
       this.groupId = groupId;
   }
   ...
}

Map<GroupId, List<CapabilityId>> m = ...
于 2010-03-25T13:59:28.060 回答
7

可以包含一个名为“id”的字段,而不是CapabilityIdextend ;那么您可以定义为,并且您可以通过您的关键类上的a 获取各个 ID 字段。StringCapabilityIdStringMapMap<CapabilityId, Map<GroupId, Foo>>getId()

我不确定我自己会不会这样做,但如果我这样做了,这可能就是我会做的。

abstract GenericId您可以通过拥有一个具有 id 字段和getId()方法的类来限制混乱,并拥有CapabilityIdGroupId继承它。

于 2010-03-25T14:00:51.643 回答
3

创建一个ID可以子类化的类,它由一个String字段和实现equals()以及hashCode()使用该字段组成。

于 2010-03-25T13:59:48.750 回答
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..
}

这样,您可以在方法/参数名称中看到它期望/返回的内容。

于 2010-03-25T14:13:22.720 回答
1

有很多方法可以继续这个(一些已经提到):

  • 作为@Roman,将通用类型包装在更具体的类型中,这样可以提供更强的类型。强打字好,IMO。
  • 作为@nanda,使用更具体的集合类型。Java 库在这方面有点差。这取决于你对依赖的感觉。
  • 作为@BalusC,将所有 icky 的东西移到一个 icky 类中。并没有真正消除问题,但它确实包含它(就像在捉鬼敢死队中一样)。
  • Map<String,Map<String,foo>>看起来很像您有一个复合键,即包含两个部分的键。因此,引入一个不可变的复合键类,即代表两个组件值对象的值对象。
于 2010-03-25T14:36:21.543 回答
0

而不是Map<String,List<String>>你应该使用 Google Guava / Google Collection 中的 Multimap

http://google-collections.googlecode.com/svn/trunk/javadoc/index.html?com/google/common/collect/Multimap.html

于 2010-03-25T14:05:37.310 回答
0

添加到其他答案:

把它包起来。

这不仅是解决您的问题的方法,而且总体上是一个好主意,即避免使用简单的参数。您的代码将获得可读性、完整性和可维护性。你可以给它添加各种漂亮的属性,例如声明它@Immutable。正如您发现的那样,这种方式更好地记住和控制。您拥有该课程,并且可以随心所欲地使用它。

于 2010-03-25T14:06:40.510 回答