3

说,我有一些课程:

class NPC {
    Attributes attributes;
    Skills skills;

    void doStuff() { //doStuffff }
}

class Player {
    Attributes attributes;
    Skills skills;

    void doStuff() { //doStuffff }
}

以及这些类的枚举:

enum Attributes {
STRENGTH, INTELLIGENCE, AGILITY...//etc
}

enum Skills {
GUNS, MELEE, ATHLETICS...//etc
}

现在,假设我想做它,以便类 Player 或 NPC 的每个实例实际上都可以拥有自己单独的 Attributes 或 Skills 实例,这些实例可以添加和减去枚举本身的值。这可能吗?如果不是,是否可以使用内部嵌套枚举中的方法来操作它所在的类的字段值?

这可能听起来有些疯狂、荒谬,而且简直是疯了,但是当您必须找到正确的设计解决方案时……嗯,有时您只需要跳出框框思考。

编辑:

我找到了一个有趣的解决方案,尽管我怀疑它是否与地图创意一样好。

我认为发帖会很有趣:D

public final class StatControl {

    int agility;
    int endurance;
    int intelligence;
    int intuition;
    int luck;
    int speed;
    int strength;

}

enum Attributes {
    AGILITY {
        void add(int value) {
            test.agility += value;
        }
    },
    ENDURANCE {},
    INTELLIGENCE {},
    INTUITION {},
    LUCK {},
    SPEED {},
    STRENGTH {};

    abstract void add(int value);

    StatControl test;

    void receiveObj(StatControl test) {
        this.test = test;
    }

}

如您所见,一个类拥有枚举的整数表示,但枚举本身充当控制中心,可以操作传递给它的任何 StatControl 对象实例。

不过地图可能更好——我可以看到这很容易变得混乱。

4

3 回答 3

3

进一步考虑,我认为,如果您希望每个枚举具有与其相关联的某种不同值,则可能对您的问题的答案是为您的不同类使用相同的枚举,但不同的 EnumMaps 除外。如果此答案在左侧字段中出路,对不起,但请澄清您的问题。:)

有关 EnumMaps 的更多信息,请查看此处:
驯服老虎:超越枚举类型的基础
EnumMap API

于 2011-06-24T16:19:45.710 回答
1

您可以使用 EnumMaps 之类的

abstract class Actor {
    final Map<Attribute, Integer> attributes = new EnumMap<Attribute, Integer>();
    final Map<Skill, Integer> skills = new EnumMap<Attribute, Integer>();

    abstract void doStuff();
}

class NPC extends Actor {
    void doStuff() { }
}

class Player extends Actor {
    void doStuff() { }
}
于 2011-06-24T16:25:08.097 回答
0

您可以为 Enum 的每个实例添加属性。请参阅行星示例:

http://download.oracle.com/javase/1,5.0/docs/guide/language/enums.html

于 2011-06-24T16:24:45.050 回答