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

これは、ゲーム内のすべての状態を整理するために使用されている列挙型の状態です。

たくさんのご協力とご説明ありがとうございました!

4

3 に答える 3

2

1,EnumMap は、キーが Enum である Map です。

2, for(State state : State.values())... は、State enum のすべての項目を反復する便利な形式です。

3,<> は C++ のテンプレートのような Java のジェネリック型です。特定の型が実行時に決定されることを意味します。

4、コードの最後の部分は状態パターンのように見え ます:異なる状態、異なる実装

于 2013-03-16T04:59:48.907 に答える
2

初心者として「<>」と「:」を使用したことがないため、説明が必要なのは主にこのコード ^ コードです。また、EnumMap が何であるかもわかりません。できれば、これは詳細に説明できます。

これ<>はジェネリック宣言の一部であり、宣言した型を使用しているジェネリック クラスに関連付けるだけです。aには、と theMapの 2 つの型があり、慣例により次のように宣言されます。KeyValueEnumMap<K,V>

だからあなたが言うとき:

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

キーが で、値がEnumMapであるを作成したいと言っています。目的の型で特定のものを宣言すると、Java は、.MapStateMapIRendererEnumMapMap

したがって、次のように言えます。

IRenderer myRenderer = RENDERERS_MAP.get(myState);

明示的にキャストせずに。

于 2013-03-16T05:04:54.040 に答える
1

EnumMap は、列挙型キーで使用するための特別な Map 実装です。列挙型マップ内のすべてのキーは、明示的または暗黙的に指定された単一の列挙型から取得する必要があります。ここで Enum は State です。

さて、この行で

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

State Enum がキーとして使用されるタイプ EnumMap のオブジェクトを作成します。State は他の Enum でも置き換えることができるため、<> で囲みます。<> そのタイプがジェネリックであることを示唆しています。State の代わりに他の列挙型を使用できます。

次、

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

この For ループは、配列要素を 1 つずつ反復するのと同じように、すべての EnumMap 値を 1 つずつ反復するために使用されます。":" は、多くの言語で繰り返しに使用されます。Java foreach ループの構文の一部です。このループでは、put メソッドを使用して RENDERERS_MAP の各インデックスにキーと値が割り当てられます。

于 2013-03-16T05:09:47.107 に答える