有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用enum类方法中类的HashSet

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

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)
{

}

以下是用于创建房间对象的类

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

我如何在enum类中编写一个方法,比如调用时,CookieGiver为房间中的每个角色提供项目COOKIE

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


共 (1) 个答案

  1. # 1 楼答案

    将getter添加到Room以获取文件室中的字符列表

    public Set<Character> getChars() {           
         return chars;                            
    }                                            
    

    向字符枚举添加一个方法,以将项添加到已保留项的列表中

    private void addItem(Item item) {            
        charItems.add(item);                    
    }                                           
    

    enterRoom方法中,对于文件室中的每个字符,调用addItem,向其中添加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);
        }
    }
    

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