我应该使用嵌套类来封装映射值吗

Should I use a nested class to encapsulate map values?

本文关键字:封装 映射 嵌套 我应该      更新时间:2023-10-16

我有一个带有映射的类(例如hashmap)。映射值包含不同的元素,这些元素可能具有不同的类型。我的问题是,如果使用相同密钥的不同映射,是否更好地实现;或者使用嵌套类来封装所有元素。

带有嵌套类的伪代码示例。

public class MyMap<T> {
    private class Element{
          int nElementA;
          int nElementB;
          double dbElementC;
    }
    private Map<T,Element> map = new HashMap<T,Element>();
    public int getElementA(T key) {return map.get(key).nElementA;}
    public int getElementB(T key) {return map.get(key).nElementB;}
    public double getElementC(T key) {return map.get(key).nElementC;}
}

具有多个映射的伪代码示例。

public class MyMap<T> {
    private Map<T,Integer> mapA = new HashMap<T,Integer>();
    private Map<T,Integer> mapB = new HashMap<T,Integer>();
    private Map<T,Double> mapC = new HashMap<T,Double>();
    public int getElementA(T key) {return mapA.get(key);}
    public int getElementB(T key) {return mapB.get(key);}
    public double getElementC(T key) {return mapC.get(key);}
}

我认为嵌套类(尤其是私有类)可能会对未来的代码维护产生负面影响。但是,如果使用多个具有相同键的贴图,我会觉得这是在浪费资源。我还有其他办法可以重复使用地图键吗?

当问题出现时,我正在用Java进行编码,但我对C++的解决方案也很感兴趣。

主要区别不是获取元素,而是放置它们。如果元素彼此相关,例如NameAgeSex,则封装更好。

然而,如果它们完全不同——我认为不是——你可以使用不同的地图。

我的建议是不要让这门课是私人的。单线

map.put(Integer, new Element("John", 51, "Male"));

比好

map1.put(Integer, "John");
map2.put(Integer, 51);
map3.put(Integer, "Male");

这是一个设计决策,只有在三个元素可以封装在一个类下的情况下才使用嵌套类解决方案。在设计类时要考虑"高内聚性"