代码之家  ›  专栏  ›  技术社区  ›  Paul Tomblin

更好的爪哇藏品安全

  •  5
  • Paul Tomblin  · 技术社区  · 15 年前

    在我的Java代码中,我经常会遇到几个问题。 Map<String,Map<String,foo>> Map<String,List<String>> 然后我很难记住哪根弦是哪把钥匙。我对声明的评论是 //Map<capabiltyId,Map<groupId,foo>> //Map<groupId,List<capabilityId> ,但这不是最好的解决方案。如果string不是final,我会创建新的类 CapabilityId extends String GroupId extends String ,但我做不到。有没有更好的方法来跟踪哪个东西是密钥,也许让编译器强制它?

    7 回复  |  直到 15 年前
        1
  •  7
  •   Jim Kiley    15 年前

    而不是 CapabilityId 延伸 String , 可控能力 可能包括 名为“id”的字段;然后 Map 可以定义为 Map<CapabilityId, Map<GroupId, Foo>> ,您可以通过 getId() 在你的重点课上。

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

    你可以用一个 abstract GenericId 使用ID字段和 () 方法,并且 可控能力 GroupId 从中继承。

        2
  •  9
  •   Roman    15 年前

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

    class GroupId implements Comparable {
       private String groupId;
    
       public GroupId (String groupId) {
           this.groupId = groupId;
       }
       ...
    }
    
    Map<GroupId, List<CapabilityId>> m = ...
    
        3
  •  3
  •   Michael Borgwardt    15 年前

    创建一个 ID 类的子类,该类包含 String 领域和实现 equals() hashCode() 使用那个字段。

        4
  •  2
  •   BalusC    15 年前

    我会把它们放在一个类中,并使用合理的字段/方法/参数名。

    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..
    }
    

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

        5
  •  1
  •   Tom Hawtin - tackline    15 年前

    有很多方法可以实现这一点(已经提到了一些方法):

    • 作为@roman,将通用类型包装成更具体的类型,这样可以提供更强的类型。打字很好,我。
    • 作为@nanda,使用更具体的集合类型。Java库在这个领域有点差。这取决于你对依赖的感觉。
    • 作为@balusc,把所有不好的东西放到一个不好的类中。并不能真正消除这个问题,但它确实包含了这个问题(就像在鬼怪中一样)。
    • Map<String,Map<String,foo>> 看起来很像你有一个组合键,也就是一个由两部分组成的键。因此,引入一个不可变的组合键类,即表示两个组件值对象的值对象。
        6
  •  0
  •   nanda    15 年前

    而不是 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

        7
  •  0
  •   openCage    15 年前

    添加到其他答案:

    把它包起来。

    这不仅是解决问题的办法,而且是一个好主意,即避免简单的 参数。您的代码将获得可读性、健全性和可维护性。 您可以向它添加各种好的属性,例如declare it@immutable。当你发现这是更好的记忆和控制方式。你拥有这门课,可以做任何你喜欢的事情。