2013-03-16 5 views
0

그래서이 코드 조각을 보았고 초보자 였기 때문에 코드를 실제로 이해하지 못했습니다. 누군가 코드를 설명 할 수 있는지 궁금합니다. 감사! ":"코드 설명 : 열거 형 및 렌더링

private static final EnumMap<State, IRenderer> RENDERERS_MAP; 
    static { 
    RENDERERS_MAP= new EnumMap<State, IRenderer>(State.class); 

    for (State state : State.values()) { 
     RENDERERS_MAP.put(state, getRender()); 
    } 
} 

주로 내가 초보자로서 내가 "<>"를 사용한 적이 있기 때문에 대한 설명을 필요로 코드 ^이 코드 조각입니다. 또한 EnumMap이 무엇인지 잘 모르겠습니다. 이 부분은 자세하게 설명 할 수있는 것이 바람직합니다. IRenderer는 무엇입니까?

편집 : 나는 또한 싶습니다 무엇 <>과 : 그래서이라고 나는 인터넷에 그것을 검색하고 그들을 읽을 수 있습니다. 링크도 환영합니다.

void render() { 
    Renderer currentRenderer = RENDERERS_MAP.get(currentState); 
    if (ren != null) { 
     currentRenderer.render(); 
    } 
} 

이 코드는 화면에 코드를 렌더링한다고 생각합니다.

public enum State { 
    START_MENU() { 
     @Override 
     public Renderer getRenderer() { 
      return new StartMenuRenderer(); 
     } 
    }, 
    PLAYER_ONE_MENU() { 
     @Override 
     public Renderer getRenderer() { 
      return new PlayerOneRenderer(); 
     } 
    }, 
    PLAYER_TWO_MENU() { 
     @Override 
     public Renderer getRenderer() { 
      return new PlayerTwoRenderer(); 
     } 
    }, 
    WIN_SCREEN() { 
     @Override 
     public Renderer getRenderer() { 
      return null; //TODO: implement body 
     } 
    }, 
    LOSE_SCREEN() { 
     @Override 
     public Renderer getRenderer() { 
      return null; //TODO: implement body 
     } 
    }, 
    PLAY_SCREEN() { 
     @Override 
     public Renderer getRenderer() { 
      return null; //TODO: implement body 
     } 
    }; 

    public abstract Renderer getRenderer(); 
} 

이것은 게임의 모든 상태를 구성하는 데 사용되는 enum 상태입니다.

모든 도움과 설명에 감사드립니다.

답변

2

주로 내가 초보자로서 내가 "<>"를 사용한 적이 있기 때문에에 대해 설명 필요 코드 ^이 코드 조각입니다. 또한 나는 EnumMap이 무엇인지 알지 못한다. 가급적이 전체는 으로 자세하게 설명 할 수 있습니다.

<>은 제네릭 선언의 일부이며, 선언 한 형식을 사용중인 제네릭 클래스에 연결하기 만하면됩니다. Map를 들어, 당신이 말하는 그래서 규칙에 따라 EnumMap<K,V>

로 선언되는 두 가지 유형의 KeyValue,이 있습니다 :

RENDERERS_MAP= new EnumMap<State, IRenderer>(State.class); 

당신은 당신이 EnumMap을 만들 것인지를 말하는 어디에 Map 키는 State이고 Map 값은 IRenderer입니다. 특정 형식 인 EnumMap을 원하는 형식으로 선언하면 Java는 Map에서 값을 검색하거나 설정할 때 캐스팅을 처리합니다.

그래서 당신은 말할 수 :

IRenderer myRenderer = RENDERERS_MAP.get(myState); 

을 명시 적으로 캐스팅없이.

2

1, EnumMap은 키가 Enum 인 Map입니다.

2 (State state : State.values ​​()) ...는 State enum의 모든 항목을 반복하는 편리한 형식입니다.

3

, <>은 C++에서 템플릿과 같은 자바의 제네릭 형식이며, 그것은 특정 유형이 런타임에

4 descided된다는 것을 의미합니다, 코드의 마지막 조각은 State pattern 다음과 같습니다 다른 국가, 다른 구현을 ":"

+0

Generics는 컴파일러에서 적용되는 유형 안전을위한 것입니다. –

+0

예,이 예에서는 V가 IRenderer가되도록 강제 실행됩니다. 특정 유형은 런타임에 소멸됩니다. – BlackJoker

+0

IMO, 특정 유형은 'IRenderer'이며 컴파일시 결정됩니다. Java에서는 유형 지우기로 인해 런타임에 제네릭을 사용할 수 없습니다. –

1

EnumMap은 enum 유형 키와 함께 사용하기위한 특수화 된 맵 구현입니다. enum 맵의 모든 키는 명시 적 또는 암시 적으로 지정된 단일 enum 유형에서 가져와야합니다. 여기서 Enum은 State입니다. 이 라인

RENDERERS_MAP= new EnumMap<State, IRenderer>(State.class); 

에서 지금

는, 당신은 국가 열거가 키로서 사용되는 타입 EnumMap는의 객체를 생성합니다. State는 다른 Enum으로 대체 될 수 있기 때문에 <에 포함되어 있습니다. <> 해당 유형이 일반이라고 제안합니다. State 대신에 다른 enum을 사용할 수 있습니다. EnumMap는 우리가 순차적으로 배열 요소를 반복대로 하나씩 모든 값

다음 루프 용

for (State state : State.values()) { 
     RENDERERS_MAP.put(state, getRender()); 
    } 

는 반복 사용된다. ":"은 여러 언어로 반복되는 데 사용됩니다. Java foreach 루프 구문의 일부입니다. 이 루프에서 키와 값은 put 메소드를 사용하여 RENDERERS_MAP의 각 색인에 지정됩니다.

+0

IRenderer 란 무엇입니까? – Exikle

+0

IRenderer는 모든 렌더러에 대한 공통 인터페이스입니다. 렌더러와 관련된 모든 세부 정보는 다음 링크를 참조하십시오. http://docs.oracle.com/javaee/5/api/javax/faces/render/Renderer.html –