Java 在枚举类的方法中使用类中的哈希集

Java 在枚举类的方法中使用类中的哈希集,java,enums,Java,Enums,我有以下枚举类字符,以及枚举类项: public enum Item { COOKIE("cookie"), CRISPS("crisps"), DRINK("drink"); private String description; /** * Constructor with description and weight. * Pre-condition: description not null. */ private Item(String description

我有以下枚举类字符,以及枚举类

public enum Item
{
COOKIE("cookie"), CRISPS("crisps"), DRINK("drink");    

private String description;    

/**
 * Constructor with description and weight.
 * Pre-condition: description not null.
 */
private Item(String description)
{
    assert description != null : "Item.Item with null description";
    this.description = description;
    sane();
}
人物:

public enum Character
{
JESS("Jess", 0.5f,Item.SANDWICH), SALLY("Sally",0.5f, Item.CRISPS), 
ANDREW("Andrew" ,0.5f,Item.DRINK), 
ALEX("Alex",0.5f,null),CookieMonster("CookieMonster",1.0f,null),
CookieGiver("CookieGiver",1.0f,null),Player("Player",0.0f,null);

private String description;
private ArrayList<Item> charItems = new ArrayList<Item>();
private float probability;

/**
 * Constructor initialising description,item and probability.
 */
private Character(String desc,float moveProbability,Item items)
{
    description= desc;
    charItems.add(items);
    probability =moveProbability;

}

public void enterRoom(Room r)
{

}
公共枚举字符
{
杰西(“杰西”,0.5华氏度,一种三明治),莎莉(“莎莉”,0.5华氏度,一种薯片),
ANDREW(“ANDREW”,0.5f,项目饮料),
亚历克斯(“亚历克斯”,0.5f,零),库克怪兽(“库克怪兽”,1.0f,零),
CookieGiver(“CookieGiver”,1.0f,空)、玩家(“玩家”,0.0f,空);
私有字符串描述;
private ArrayList charItems=new ArrayList();
私有浮动概率;
/**
*建造商初始化说明、项目和概率。
*/
私有字符(字符串描述、浮点移动概率、项目)
{
描述=描述;
charItems.添加(项目);
概率=移动概率;
}
公共休息室(r室)
{
}
以下是用于创建房间对象的类

  public class Room 
  {
private String description;
private HashMap<Direction, Room> exits;        // stores exits of this room.
private Set<Character> chars;  // stores the characters that are in this 
room.

/**
 * Create a room described "description". Initially, it has
 * no exits. "description" is something like "a kitchen" or
 * "an open court yard".
 * @param description The room's description.
 * Pre-condition: description is not null.
 */
public Room(String description) 
{
    assert description != null : "Room.Room has null description";
    this.description = description;
    exits = new HashMap<Direction, Room>();
    chars = new HashSet<Character>();
    sane();
}
公共教室
{
私有字符串描述;
私有HashMap exits;//存储此房间的出口。
private Set chars;//存储此文件中的字符
房间。
/**
*创建一个描述为“description”的文件室。最初,它具有
*没有出口。“描述”类似于“厨房”或
*“露天庭院”。
*@param description房间的描述。
*前提条件:说明不为空。
*/
公共房间(字符串描述)
{
断言描述!=null:“Room.Room具有null描述”;
this.description=描述;
exits=newhashmap();
chars=新的HashSet();
理智();
}
我如何在enum类中编写一个方法,比如调用时,CookieGiver为房间中的每个角色提供项目COOKIE


我知道我需要使用HashSetchars,但我想不出一个方法来实现它。

文件室添加一个getter
以获取文件室中的字符列表

public Set<Character> getChars() {           
     return chars;                            
}                                            
enterRoom
方法中,对于文件室中的每个字符,调用
addItem
,向其中添加COOKIE

注意:如果多次调用此函数,它将添加多个COOKIE。如果您不想使用此函数,则必须检查COOKIE是否已存在或使用一组COOKIE

public void enterRoom(Room r) {              
    for(Character character : r.getChars()) {
        character.addItem(Item.COOKIE);      
}                                        
编辑:

由于您希望上述策略仅适用于
CookieGiver
,一种方法是将
enterRoom
的默认逻辑设为空,并覆盖
CookieGiver
的默认逻辑

public void enterRoom(Room r) { } //empty / no-op in enum

CookieGiver("CookieGiver", 1.0f, null) {           
@Override                                      
public void enterRoom(Room r) {                
    for (Character character : r.getChars()) { 
        character.addItem(Item.COOKIE);        
    }                                          
}                                              
选项2:

您可以创建一个私有嵌套枚举,其中包含调用
enterRoom
时要执行的操作策略。然后每个字符都将有一个针对它的策略

public enum Character {
    JESS("Jess", 0.5f, Item.CRISPS, RoomStrategy.NONE),  //when enterRoom is called on this Character, then there is nothing to do
    CookieMonster("CookieMonster", 1.0f, null, RoomStrategy.NONE),
    CookieGiver("CookieGiver", 1.0f, null, RoomStrategy.PROVIDE_COOKIE), //when enterRoom is called on this Character, then invoke the logic corresponding to PROVIDE_COOKIE

    private String description;
    private ArrayList<Item> charItems = new ArrayList<Item>();
    private float probability;
    private RoomStrategy roomStrategy; //Field to hold the strategy

    /**
     * Constructor initialising description,item and probability.
     */
    private Character(String desc, float moveProbability, Item items, RoomStrategy roomStrategy) {
        description = desc;
        charItems.add(items);
        probability = moveProbability;
        this.roomStrategy = roomStrategy;
    }

    private void addItem(Item item) {
        charItems.add(item);
    }
    public void enterRoom(Room r) {
        roomStrategy.enterRoom(r); //Just delegate to the strategy
    }


    private enum RoomStrategy { //better name needed?
        NONE {
            @Override
            void enterRoom(Room r) {
               //No op
            }
        },
        PROVIDE_COOKIE {
            @Override
            void enterRoom(Room r) {
                for (Character character : r.getChars()) {
                    character.addItem(Item.COOKIE);
                }
            }
        };

        abstract void enterRoom(Room r);
    }
}
公共枚举字符{
JESS(“JESS”,0.5f,Item.CRISPS,RoomStrategy.NONE),//当对该角色调用enterRoom时,则无需执行任何操作
CookieMonster(“CookieMonster”,1.0f,空,RoomStrategy.NONE),
CookieGiver(“CookieGiver”,1.0f,null,RoomStrategy.PROVIDE\u COOKIE),//当对该字符调用enterRoom时,调用与PROVIDE\u COOKIE对应的逻辑
私有字符串描述;
private ArrayList charItems=new ArrayList();
私有浮动概率;
private RoomStrategy RoomStrategy;//保存策略的字段
/**
*建造商初始化说明、项目和概率。
*/
私有字符(字符串描述、浮点移动概率、项目项、RoomStrategy RoomStrategy){
描述=描述;
charItems.添加(项目);
概率=移动概率;
this.roomStrategy=roomStrategy;
}
专用无效附加项(项目){
charItems.添加(项目);
}
公共休息室(r室){
roomStrategy.enterRoom(r);//只需委托给策略
}
私有枚举策略{//需要更好的名称吗?
没有{
@凌驾
休息室(r室){
//无操作
}
},
提供饼干{
@凌驾
休息室(r室){
for(字符:r.getChars()){
character.addItem(Item.COOKIE);
}
}
};
抽象房间(r房间);
}
}

注意:按照注释中的建议,有更好的方法可以做到这一点。

首先以标准方式(大写)命名所有枚举:重命名
字符
。这是
java.lang
中的一个现有类-然后将该方法添加到
房间
(而不是
枚举
)。具有该状态的是
房间
(它包含
字符
s)。您所说的
为房间中的每个角色提供项目COOKIE是什么意思?
。是否要对
charItems
进行变异?charItems用于为每个角色保存项目character@ElliottFrisch我宁愿不把这个方法放在房间里,这基本上就是我想要的方法,除了只有角色CookieGiver能够添加Item.COOKIE到所有字符的字符当为其他字符调用
enterRoom
时,您想要什么?当为其他字符调用
enterRoom
时,它不应该做任何事情
public enum Character {
    JESS("Jess", 0.5f, Item.CRISPS, RoomStrategy.NONE),  //when enterRoom is called on this Character, then there is nothing to do
    CookieMonster("CookieMonster", 1.0f, null, RoomStrategy.NONE),
    CookieGiver("CookieGiver", 1.0f, null, RoomStrategy.PROVIDE_COOKIE), //when enterRoom is called on this Character, then invoke the logic corresponding to PROVIDE_COOKIE

    private String description;
    private ArrayList<Item> charItems = new ArrayList<Item>();
    private float probability;
    private RoomStrategy roomStrategy; //Field to hold the strategy

    /**
     * Constructor initialising description,item and probability.
     */
    private Character(String desc, float moveProbability, Item items, RoomStrategy roomStrategy) {
        description = desc;
        charItems.add(items);
        probability = moveProbability;
        this.roomStrategy = roomStrategy;
    }

    private void addItem(Item item) {
        charItems.add(item);
    }
    public void enterRoom(Room r) {
        roomStrategy.enterRoom(r); //Just delegate to the strategy
    }


    private enum RoomStrategy { //better name needed?
        NONE {
            @Override
            void enterRoom(Room r) {
               //No op
            }
        },
        PROVIDE_COOKIE {
            @Override
            void enterRoom(Room r) {
                for (Character character : r.getChars()) {
                    character.addItem(Item.COOKIE);
                }
            }
        };

        abstract void enterRoom(Room r);
    }
}