代码说明:枚举和渲染

时间:2013-03-16 04:54:04

标签: java enums render enum-map

所以我遇到了这段代码并且是初学者,我并不真正理解代码。我想知道是否有人可以向我解释代码。谢谢!

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

主要是这段代码^代码,我需要一个解释,因为作为一个初学者,我从来没有使用过“&lt;&gt;”和“:”。我也不确定EnumMap是什么。优选地,可以详细解释这一个。什么是IRenderer?

修改 我也想要&lt;&gt;和:被叫,所以我可以在互联网上搜索并阅读它们。也欢迎链接:)

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

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

感谢您的帮助和解释!

3 个答案:

答案 0 :(得分:2)

1,EnumMap是一个Map,其键是Enum;

2,for(State state:State.values())...是迭代State枚举中所有项目的一种方便形式;

3,&LT;&GT;是Java中的泛型类型,就像C ++中的模板一样,它意味着特定的Type将在运行时被描述,

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

答案 1 :(得分:2)

  

主要是这段代码^代码我需要解释   因为作为初学者,我从未使用过“&lt;&gt;”和“:”。我也不是   确定EnumMap是什么。优选地,可以完整地解释这一个   细节。

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

所以当你说:

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

您说要创建EnumMap Map密钥为StateMap值为IRenderer的{​​{1}}。一旦您使用所需类型声明特定EnumMap,Java就会在Map上检索或设置值时负责投射。

所以你可以说:

IRenderer myRenderer = RENDERERS_MAP.get(myState);

没有明确施法。

答案 2 :(得分:1)

EnumMap是一个专门用于枚举类型键的Map实现。枚举映射中的所有键必须来自显式或隐式指定的单个枚举类型。这里的Enum是国家。

现在,在这一行

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

您创建一个EnumMap类型的对象,其中State Enum用作键。它包含在&lt;&gt;中。因为国家也可以被任何其他枚举取代。 &LT;&GT;建议该类型是Generic。您可以使用任何其他枚举代替State。

接下来,

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

这个For循环用于逐个迭代所有EnumMap值,就像我们逐个迭代数组元素一样。 “:”用于在许多语言中进行迭代。它是Java foreach循环语法的一部分。在此循环中,使用put方法为RENDERERS_MAP的每个索引分配键和值。