2013-03-16 6 views
0

Так что я натолкнулся на этот кусок кода и стал новичком, я действительно не понял код. Мне было интересно, может ли кто-нибудь объяснить мне код. Благодаря!Код Объяснение: Enum and Rendering

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?

EDIT: Я также хотел бы, что <> и: называются так что я могу найти его в Интернете и прочитать о них. Ссылки тоже приветствуются :)

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

Это состояние перечисления, которое используется для организации всех состояний в игре.

Благодарим за помощь и объяснения!

ответ

2

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

<> является частью декларации generics и просто ассоциирует типы, которые вы объявляете с классом генериков, который вы используете. Для 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); 

без явного литья.

2

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

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

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

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

+0

Дженерики предназначены для безопасности типов, которая обеспечивается компилятором. –

+0

Да, в этом примере, принудительно, чтобы V был IRenderer, определенный тип будет удален в Runtime. – BlackJoker

+0

IMO, конкретный тип здесь - «IRenderer», и это принято во время компиляции. В Java дженерики недоступны во время выполнения из-за стирания типа. –

1

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

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

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

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

Далее

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

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

+0

Что такое IRenderer? – Exikle

+0

IRenderer - это общий интерфейс для всех рендерингов. Вы можете ссылаться на следующие ссылки для всех подробностей относительно средства визуализации: http://docs.oracle.com/javaee/5/api/javax/faces/render/Renderer.html –

Смежные вопросы