2013-03-16 86 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(); 
} 

这是用来组织游戏中所有状态的枚举状态。

谢谢你的帮助和解释!

回答

2

这主要是这一段代码^代码,我需要一个解释 有关,因为作为一个初学者我从来没有用过“<>”和“:”。另外,我不是 肯定EnumMap是什么。最好能详细解释这一个完整的 。

<>是泛型声明的一部分,只是将您声明的类型与您正在使用的泛型类关联起来。对于Map,有两种类型的KeyValue,其中按照惯例被声明为EnumMap<K,V>

所以,当你说:

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

你是说你想创建一个EnumMap其中Map密钥是State,而Map的值是IRenderer。一旦你用你想要的类型声明你的特定EnumMap,那么当在Map上检索或设置值时,Java会负责转换。

所以,你可以说:

IRenderer myRenderer = RENDERERS_MAP.get(myState); 

没有明确的铸造。

2

1,EnumMap是一个Map,其键是Enum; (State state:State.values())...是一种迭代State enum中所有项的方便形式;

3,<>是Java通用类型,如在C++中的模板,这意味着该特定类型将在运行时被descided,

4,代码的最后一块看起来像State pattern:不同的状态,不同的实施

+0

泛型是用于编译器强制执行的类型安全。 – 2013-03-16 05:07:15

+0

是的,在这个例子中,强制V是一个IRenderer,具体类型将在运行系统中被定位。 – BlackJoker 2013-03-16 05:09:22

+0

IMO,这里的具体类型是'IRenderer',它在编译时决定。在Java中,由于类型擦除,泛型在运行时不可用。 – 2013-03-16 05:13:11

1

EnumMap的是与枚举类型键一起使用的专用Map实现。枚举映射中的所有键必须来自明确或隐含指定的单个枚举类型。这里Enum是状态。

如今,在这条线

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

创建类型EnumMap的是:国家枚举被用作键的对象。它被包含在<>之内,因为State也可以被任何其他Enum取代。 <>建议该类型是通用。您可以使用任何其他枚举来代替州。

接着,

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

这对于循环用于迭代所有EnumMap的值一个接一个,正如我们迭代由一个阵列元件之一。 “:”用于以多种语言进行迭代。它是Java foreach循环语法的一部分。在此循环中使用put方法为RENDERERS_MAP的每个索引分配键和值。

+0

什么是IRenderer? – Exikle 2013-03-16 05:14:51

+0

IRenderer是所有渲染器的通用接口。有关渲染器的所有详细信息,请参阅以下链接:http://docs.oracle.com/javaee/5/api/javax/faces/render/Renderer.html – 2013-03-16 05:18:01