Как правильно инициализировать HashMap - PullRequest
0 голосов
/ 31 января 2020

Я не уверен, правильно ли я сделал этот HashMap, но я застрял !! Я предполагаю объявить

  1. переменную экземпляра типа Map, которая отображает элементы в GameObjects.
  2. Инициализируйте карту в конструкторе, используя HashMap, и поместите в нее четыре игровых объекта.
  3. Используйте map для упрощения методов getName, getLocation и getSound.

Мне нужна помощь с пониманием того, как сделать все 3 правильно.

package river;

public class GameEngine {

public enum Item {
    TOP, MID, BOTTOM, PLAYER;
}

public enum Location {
    START, FINISH, BOAT;
}


private GameObject top;
private GameObject mid;
private GameObject bottom;
private GameObject player;

private Location currentLocation;

public GameEngine() {
    top = new Wolf();
    mid = new Goose();
    bottom = new Beans();
    player = new Farmer();
    currentLocation = Location.START;
}

//Declare an instance variable of type Map that maps Items to GameObjects

 Map<Item, GameObject> itemMap = createMap(){
 private static Map<Item, GameObject> itemMap = new HashMap<>();
   itemMap.put(Item.TOP, top);
   itemMap.put(Item.MID, mid);
   itemMap.put(Item.BOTTOM, bottom);
   itemMap.put(Item.PLAYER, player);
   return itemMap;
 }

//Initialize the map in a constructor using a HashMap

  ???

// use map to simplify the methods (getName, getLocation, getSound)
public String getName(Item id) {
    switch (id) {
    case TOP:
        return top.getName();
    case MID:
        return mid.getName();
    case BOTTOM:
        return bottom.getName();
    default:
        return player.getName();
    }
}

public Location getLocation(Item id) {
    switch (id) {
    case TOP:
        return top.getLocation();
    case MID:
        return mid.getLocation();
    case BOTTOM:
        return bottom.getLocation();
    default:
        return player.getLocation();
    }
}

public String getSound(Item id) {
    switch (id) {
    case TOP:
        return top.getSound();
    case MID:
        return mid.getSound();
    case BOTTOM:
        return bottom.getSound();
    default:
        return player.getSound();
    }
}


public Location getCurrentLocation() {
    return currentLocation;
}

1 Ответ

1 голос
/ 31 января 2020

Я не уверен, правильно ли я сделал эту HashMap

Вы обнаружите, что компилятор недоволен этим.

 Map<Item, GameObject> itemMap = createMap(){
 private static Map<Item, GameObject> itemMap = new HashMap<>();
   itemMap.put(Item.TOP, top);
   itemMap.put(Item.MID, mid);
   itemMap.put(Item.BOTTOM, bottom);
   itemMap.put(Item.PLAYER, player);
   return itemMap;
 }

Выражение инициализации напоминает нечто среднее между вызовом метода и анонимным классом. Но это на самом деле либо полностью недействительным, либо неработоспособным. (createMap объявлено где-нибудь? Как что?)

Я подозреваю, что вы, возможно, пытаетесь использовать идиому "инициализация карты с анонимным классом":

 Map<Item, GameObject> itemMap = new HashMap<>() {{
     put(Item.TOP, top);
     put(Item.MID, mid);
     put(Item.BOTTOM, bottom);
     put(Item.PLAYER, player);
 }};

Это мило и лаконично ... но в нем используется неясная языковая функция Java и поэтому, вероятно, это плохая идея. (Многие Java программисты не поймут этого.)

То, что на самом деле делается выше, - это объявление анонимного подкласса HashMap, который использует блок инициализатора экземпляра для заполнения экземпляра перед его возвратом.

(Вы когда-нибудь слышали о блоке инициализатора экземпляра? Многие Java программисты этого не сделали! И вас, вероятно, этому не научат.)

Это почти эквивалентно этому:

Map<Item, GameObject> itemMap = new HashMap<>();
itemMap.put(Item.TOP, top);
itemMap.put(Item.MID, mid);
itemMap.put(Item.BOTTOM, bottom);
itemMap.put(Item.PLAYER, player);

На мой взгляд, это гораздо лучший способ написать это. (Не будь милым :-))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...