Java 如何正确初始化HashMap

Java 如何正确初始化HashMap,java,eclipse,Java,Eclipse,我不确定这个哈希图是否正确,但我被卡住了!!我想申报一下 Map类型的实例变量,用于将项目映射到游戏对象。 使用HashMap在构造器中初始化地图,并将四个游戏对象放在其中。 使用map简化getName、getLocation和getSound方法。 我需要帮助理解如何正确地完成这三个步骤 package river; public class GameEngine { public enum Item { TOP, MID, BOTTOM, PLAYER; } public e

我不确定这个哈希图是否正确,但我被卡住了!!我想申报一下

Map类型的实例变量,用于将项目映射到游戏对象。 使用HashMap在构造器中初始化地图,并将四个游戏对象放在其中。 使用map简化getName、getLocation和getSound方法。 我需要帮助理解如何正确地完成这三个步骤

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;
}
我不确定这个哈希映射是否正确

您会发现编译器对此不满意

 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;
 }
它是可爱的,简洁的。。。但是它使用了一个模糊的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);

在我看来,这是一种更好的写作方式。别那么可爱:-

我不是java程序员,所以这对我来说是新的。上面的代码是我在一个关于HashMap的示例中使用的,比如Map itemma=newhashmap;是我应该用的东西。。当我使用put方法时,我会出现语法错误,因此如果它出错,我就无法编译。好吧,请查看我答案的更新版本,以获得更好的编写方法。。。。并将其与您编写的内容进行比较。可能您误解了示例,但如果它实际上说要像您的代码中那样初始化映射,则这是胡说八道。我认为我的编译器讨厌我,因为我已使用您的建议更新了我的代码,我得到的只是语法错误,请插入标识符以完成MethodHeader。初始化代码需要在GameEngine的构造函数中。这也是您的需求所说的。
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);