我有以下枚举类字符,枚举类项目:
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)
{
}
以下是用于创建Room对象的类
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();
}
我如何在我的枚举类中编写一个方法,这样当被调用时, CookieGiver 会向房间中的每个角色提供一个项目COOKIE?
据我所知,我需要使用HashSet 字符,但我无法想出办法。
答案 0 :(得分:1)
将吸气剂添加到Room
以获取房间中的角色列表
public Set<Character> getChars() {
return chars;
}
向Character enum添加一个方法,将Item添加到已保留项目列表中。
private void addItem(Item item) {
charItems.add(item);
}
在enterRoom
方法中,对于会议室中的每个角色,请致电addItem
,向其中添加COOKIE。
注意:如果多次调用它,它会添加多个COOKIES。如果你不想要这个,你必须检查COOKIE是否已经存在或使用Set。
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);
}
}
注意:根据评论中的建议,有更好的方法可以做到这一点。