Java“远程”初始化变量

时间:2017-03-10 13:45:07

标签: java pointers initialization

我需要初始化我在数组中收到的一些变量,如(例子):

private Map<Long, Object> var1 = null;
private Map<Long, Object> var2 = null;
private Map<Long, Object> var3 = null;
private List<Map<Long, Object>> vars = Arrays.asList(var1, var2, var3);

我想知道我是否可以这样做:

private void initializeVars() {
    var1 = new HashMap<Long, Object>();
    var2 = new HashMap<Long, Object>();
    var3 = new HashMap<Long, Object>();
}

但是有这样的事情:

private void initializeVars() {
    for (Map<Long,Object> var : vars) {
        var = new HashMap<Long, Object>();
    }
}

上面的代码不起作用,因为我只是将数组位置的指针从'var#'更改为新的HashMap,但我想要做的是访问'var#'并更改其指针。

3 个答案:

答案 0 :(得分:0)

我想到的只有解决方案是将它打包成另一个轻量级对象,例如MyMapMyMap将实际地图保存在内部,然后您可以初始化该地图,如下所示:

private MyMap<Long, Object> var1 = new MyMap<>();
private MyMap<Long, Object> var2 = new MyMap<>();
private MyMap<Long, Object> var3 = new MyMap<>();
private List<MyMap<Long, Object>> vars = Arrays.asList(var1, var2, var3);

private void initializeVars() {
    for (MyMap<Long,Object> var : vars) {
        var.setInnerMap(new HashMap<Long, Object>());
    }
}

它既丑陋又不好,但我现在没有看到任何不同的方式。在Java中你当然不可能用你的方式尝试。

答案 1 :(得分:0)

首先,您只会收到null的列表,因此这可能只是一个int countVar = 3,这将是相同的。

但是如果你想使用这个列表。

private void initializeVars() {
    for (int i = 0; i < list.size(); ++i) {
        list.add(new HashMap<Long, Object>());
    }
}

但当然,var[1|2|3]仍然是空的。

如果你想能够做逻辑,你需要一个包装器。请参阅Whatz answer了解

答案 2 :(得分:0)

你能得到的最接近的东西,适用于Java 8:

private Map<Long, Object> var1 = null;
private Map<Long, Object> var2 = null;
private Map<Long, Object> var3 = null;
private List<Consumer<Map<Long, Object>>> writers
        = Arrays.asList(m -> var1=m, m -> var2=m, m -> var3=m);

private void initializeVars() {
    for(Consumer<Map<Long,Object>> c: writers) {
        c.accept(new HashMap<>());
    }
}

此处没有字段引用,因为字段引用可以在两个方向上工作。在这里,我们只有Consumer封装了为变量赋值的操作。对于初始化过程,这就足够了。