Пояснение к коду: Перечисление и рендеринг

Так что я наткнулся на этот кусок кода и, будучи новичком, я не совсем понял код. Мне было интересно, если кто-то может объяснить мне код. Спасибо!

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

В основном это кусок кода ^ code, о котором мне нужно было объяснить, потому что, как новичок, я никогда не использовал "<>" и ":". Также я не уверен, что такое 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 State, который используется для организации всех состояний в игре.

Спасибо за вашу помощь и объяснения!

3 ответа

Решение

В основном это кусок кода ^ code, о котором мне нужно было объяснить, потому что, как новичок, я никогда не использовал "<>" и ":". Также я не уверен, что такое EnumMap. Предпочтительно этот можно объяснить в деталях.

<> является частью объявления обобщений и просто связывает объявленные вами типы с классом обобщений, который вы используете. Для MapЕсть два типа, Key и Valueкоторые по соглашению объявляются как EnumMap<K,V>

Поэтому, когда вы говорите:

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

Вы говорите, что хотите создать EnumMap где Map ключ является Stateи Map значение является IRenderer, Как только вы объявите свой конкретный EnumMap с вашими желаемыми типами, Java затем берет на себя приведение при получении или установке значений на Map,

Итак, вы можете сказать:

IRenderer myRenderer = RENDERERS_MAP.get(myState);

без явного приведения.

1,EnumMap - это карта, ключом которой является Enum;

2, for (State state: State.values ​​())... удобная форма итерации всего элемента в перечислении State;

3,<> является универсальным типом в Java, как шаблон в C++. Это означает, что конкретный тип будет определен во время выполнения,

4, последний фрагмент кода выглядит как шаблон State: другое состояние, разные реализации

EnumMap - это специализированная реализация Map для использования с ключами типа enum. Все ключи в карте перечисления должны исходить из единственного типа перечисления, который указан явно или неявно. Здесь Enum - это State.

Теперь в этой строке

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

Вы создаете объект типа EnumMap, где State Enum используется в качестве ключа. Он заключен в <>, потому что State может быть заменен любым другим Enum. <> Предполагает, что этот тип является универсальным. Вы можете использовать любой другой enum вместо State.

Следующий,

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

Этот цикл For используется для итерации всех значений EnumMap по одному, так же как итерируются элементы массива один за другим. ":" используется для итерации во многих языках. Это часть синтаксиса Java цикла foreach. В этом цикле ключ и значения присваиваются каждому индексу RENDERERS_MAP с использованием метода put.

Другие вопросы по тегам