0

我们有构建EnumMap<K,V>实例的习惯,如下EnumMapExample.java例所示:

package test;

import java.util.EnumMap;

public class EnumMapExample {

    enum TestEnum {SOME_VALUE, SOME_OTHER_VALUE}

    private final EnumMap<TestEnum, String> myEnumMap = new EnumMap<TestEnum, String>(TestEnum.class) {
        {
            // How is this construct called?
            put(TestEnum.SOME_VALUE, "someValue");
            put(TestEnum.SOME_OTHER_VALUE, "someOtherValue");
        }
    };

    public void printMyEnumMap() {
        for (final TestEnum key : myEnumMap.keySet()) {
            final String value = myEnumMap.get(key);
            System.out.println("myEnumMap key: " + key + " has value " + value);
        }
    }

    public static void main(final String[] args) {
        new EnumMapExample().printMyEnumMap();
    }
}

可能是一个快速回答的问题,但我无法为我的谷歌找到这种填充private final EnumMap<TestEnum, String> myEnumMap2 个(人为的)枚举类型的方法是如何调用的以及它是如何工作的?

问题细化:所以我叫注意分号前的new EnumMap<K,V>(SomeEnum.class){{ /* initialization code */ }};双花括号。那个双括号是什么东西?{{ }};

4

2 回答 2

1

这等效于以下构造

static class MyEnumMap extends EnumMap<TestEnum, String> {

    // initialization block
    {
        put(TestEnum.SOME_VALUE, "someValue");
        put(TestEnum.SOME_OTHER_VALUE, "someOtherValue");
    }

    public MyEnumMap(Class<TestEnum> keyType) {
        super(keyType);
    }

}

private final EnumMap<TestEnum, String> myEnumMap = new MyEnumMap(TestEnum.class);

因此在初始化过程中将条目添加到 MyEnumMap 实例

于 2014-04-30T03:08:18.630 回答
1

编辑:刚刚意识到您可能一直在寻找双括号初始化。

双括号初始化通过创建原始类的匿名子类并使用初始化块来更改类来工作。所以代码的工作方式如下:

static final EnumMapAnonSubclass<TestEnum, String> extends EnumMap<TestEnum, String> { // outer braces
    { // inner braces
    put(TestEnum.SOME_VALUE, "someValue");
    put(TestEnum.SOME_OTHER_VALUE, "someOtherValue");
    }
    // Implicitly created constructor
    EnumMapAnonSubclass(Class<? extends TestEnum> clazz) {
        super(clazz);
    }
};

私有最终 EnumMap myEnumMap = new EnumMapAnonSubclass(TestEnum.class)

如果您只想创建EnumMap,那么您已经拥有了所需的一切。

private final EnumMap<TestEnum, String> myEnumMap = new EnumMap<TestEnum, String>(TestEnum.class);

是您创建地图所​​需的一切。

如果您想在创建对象时使用一些值初始化地图,您可以使用初始化块 ( http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html ) 或调用的方法对象的构造函数。

因此,如果您想创建地图并在其中粘贴东西,您的代码将如下所示:

// Create the EnumMap
private final EnumMap<TestEnum, String> myEnumMap = new EnumMap<TestEnum, String>(TestEnum.class);
// Use an initialization block to put some values in it when an instance of EnumMapExample is created
{
    put(TestEnum.SOME_VALUE, "someValue");
    put(TestEnum.SOME_OTHER_VALUE, "someOtherValue");
}
于 2014-04-30T03:00:07.320 回答