这个Java EnumSet初始化构造如何工作?

时间:2014-04-30 02:52:06

标签: java enumset

我们习惯于构建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();
    }
}

可能是一个快速回答的问题,但我不能为我的Google找到这样的方法来填充private final EnumMap<TestEnum, String> myEnumMap和2(人为设定的)枚举类型,以及它是如何工作的?

问题改进:我正在调用new EnumMap<K,V>(SomeEnum.class){{ /* initialization code */ }};请注意分号{{ }}之前的双花括号;。双重支撑的是什么?

2 个答案:

答案 0 :(得分: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");
}

答案 1 :(得分: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实例