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> myEnumMap、2つの(不自然な)列挙型で満たすこの方法がどのように呼び出され、どのように機能するかをGoogleで見つけることはできませんか?

質問の絞り込み: だから、セミコロンの前のnew EnumMap<K,V>(SomeEnum.class){{ /* initialization code */ }};二重中括弧に注意してください。その二重中括弧は何ですか?{{ }};

4

2 に答える 2

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);
    }
};

private final 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 に答える
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 に答える