【问题标题】:Code Explanation: Enum and Rendering代码说明:枚举和渲染
【发布时间】:2013-03-16 04:54:03
【问题描述】:

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

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

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

感谢您的所有帮助和解释!

【问题讨论】:

    标签: java enums render enum-map


    【解决方案1】:

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

    &lt;&gt; 是泛型声明的一部分,它只是将您声明的类型与您正在使用的泛型类相关联。对于Map,有两种类型,KeyValue,按照约定声明为EnumMap&lt;K,V&gt;

    所以当你说:

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

    您说您希望创建一个EnumMap,其中Map 键是StateMap 值是IRenderer。一旦你用你想要的类型声明了你的特定 EnumMap,Java 就会在 Map 上检索或设置值时负责转换。

    所以你可以说:

    IRenderer myRenderer = RENDERERS_MAP.get(myState);
    

    没有显式转换。

    【讨论】:

      【解决方案2】:

      1、EnumMap是一个Map,其key是一个Enum;

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

      3,在Java中是泛型类型,类似于C++中的模板,表示具体的Type将在运行时决定,

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

      【讨论】:

      • 泛型用于类型安全,由编译器强制执行。
      • 是的,本例中强制V为IRenderer,具体类型由Runtime决定。
      • IMO,这里的具体类型是IRenderer,它是在编译时决定的。在 Java 中,由于类型擦除,泛型在运行时不可用。
      • @BheshGurung 什么是 IRenderer
      • 在泛型术语中,它被称为实际类型参数。 EnumMap&lt;K extends Enum&lt;K&gt;,V&gt; 是类的声明方式,KV 是正式的类型参数。
      【解决方案3】:

      EnumMap 是用于枚举类型键的专用 Map 实现。枚举映射中的所有键都必须来自明确或隐式指定的单个枚举类型。这里的枚举是状态。

      现在,在这一行

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

      您创建一个 EnumMap 类型的对象,其中 State Enum 用作键。它包含在 中,因为 State 也可以用任何其他 Enum 替换。 表明该类型是通用的。您可以使用任何其他枚举来代替 State。

      接下来,

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

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2014-05-01
      相关资源
      最近更新 更多