2014-04-30 36 views
0

우리는 다음과 같은 EnumMapExample.java의 예에서와 같이 EnumMap<K,V> 인스턴스를 구성하는 습관이 있습니다 가능성이이 Java EnumSet 초기화 구문은 어떻게 작동합니까?

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 (고안된) 열거 형을 호출하고 어떻게 작동합니까?

질문 정제 : 그래서 세미콜론 ; 전에 이중 중괄호 {{ }}new EnumMap<K,V>(SomeEnum.class){{ /* initialization code */ }}; 주를 호출하고 있습니다. 이중 괄호는 뭐지?

답변

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 = 새로운 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"); 
} 
+0

그 링크에 감사드립니다. "Initializer block"이라는 용어는 내가 찾고있는 것 같습니다. 'EnumMap'을 생성하는 것은 문제가 아니며, (이미 생성 된) 맵에 값을 추가하는 초기화 블록에 대해 궁금합니다. 질문에 대한 후속 질문 : 나는'새로운 EnumMap (SomeEnum.class) {{/ * initialization code * /}}'를 호출합니다. 세미콜론'; '앞에 이중 중괄호'{{}}'가 있습니다. 이중 괄호는 뭐지? – drvdijk

+0

그래, 나 지금 대답에 붙어있어 – awksp

+0

또한, 나중에 참조하기 위해 "이중 중괄호 초기화"라고합니다. 나는 그것이 얼마나 광범위하게 사용되고 있는지, 또는 그것을 사용하려고 시도하는 것이 얼마나 현명한 지 잘 모르겠다. 그러나 자바의 흥미로운 작은 코너이다. – awksp

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 인스턴스에 추가됨

+0

이 설명에 감사드립니다. 나는 다른 응답을 받아 들였습니다. 왜냐하면 그 이름은 "이중 중괄호 초기화 (double brace initialization)"라는 이름을 사용했기 때문에 제가 찾고 있던 용어였습니다. 어떤 암시 적 생성자 시그니처가 'more'가 맞습니까? 'public MyEnumMap (클래스 keyType)'또는'MyEnumMap (Class keyType)' – drvdijk