这可能是一个不好的做法,但是我无法为我的问题找到更好的解决方案。所以我有这张 map

// Map<state, Map<transition, Map<property, value>>>
private Map<String, Map<String, Map<String, String>>> properties;

我想初始化它,这样我就不会得到NullPointerException
properties.get("a").get("b").get("c");

我尝试了这个,但是我没有工作(很明显)
properties = new HashMap<String, Map<String, Map<String,String>>>();

我尝试过的其他东西没有编译。

另外,如果您对如何避免使用此嵌套 map 有任何想法,我将不胜感激。

最佳答案

您需要将 map 放在 map 中。字面上地:

properties = new HashMap<String, Map<String, Map<String,String>>>();
properties.put("a", new HashMap<String, Map<String,String>>());
properites.get("a").put("b", new HashMap<String,String>());

如果您的目标是没有NPE的延迟初始化,则必须创建自己的 map :
private static abstract class MyMap<K, V> extends HashMap<K, V> {
    @Override
    public V get(Object key) {
        V val = super.get(key);
        if (val == null && key instanceof K) {
            put((K)key, val = create());
        }
        return val;
    }

    protected abstract V create();
}


public void initialize() {
    properties = new MyMap<String, Map<String, Map<String, String>>>() {
        @Override
        protected Map<String, Map<String, String>> create() {
            return new MyMap<String, Map<String, String>>() {
                @Override
                protected Map<String, String> create() {
                    return new HashMap<String, String>();
                }
            };
        }
    };

}

关于java - 如何适本地延迟初始化Map of Map的Map?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9063641/

10-10 18:27
查看更多