Пояснение к коду: Перечисление и рендеринг
Так что я наткнулся на этот кусок кода и, будучи новичком, я не совсем понял код. Мне было интересно, если кто-то может объяснить мне код. Спасибо!
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.