Java - нестатические перечисления - PullRequest
3 голосов
/ 24 июня 2011

Скажем, у меня есть несколько классов:

class NPC {
    Attributes attributes;
    Skills skills;

    void doStuff() { //doStuffff }
}

class Player {
    Attributes attributes;
    Skills skills;

    void doStuff() { //doStuffff }
}

И Enum для этих классов:

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

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

Теперь, скажем, я хотел сделать так, чтобы каждый экземплярКласс Player или NPC может фактически иметь свой собственный отдельный экземпляр Атрибутов или Навыков, который может складывать и вычитать значения самих перечислений.Это возможно?Если нет, можно ли будет использовать методы внутри вложенного перечисления для манипулирования значениями поля класса, в котором он находится?нужно найти правильное дизайнерское решение ... ну, иногда нужно просто мыслить нестандартно.

Редактировать:

Я нашел интересное решение, хотя сомневаюсь, что оно так же хорошо, как иидея карты.

Я подумал, что было бы интересно опубликовать: 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, переданным ему.

Карты, вероятно, лучше, хотя я мог видеть, где это может легко запутаться.

Ответы [ 3 ]

3 голосов
/ 24 июня 2011

Что касается дальнейшего рассмотрения, я думаю, что, возможно, ответом на вашу проблему является использование одинаковых перечислений для всех, кроме разных EnumMaps для ваших разных классов, если вы хотите, чтобы каждое перечисление имело различное значение некоторого вида, связанного с ним.Если в левом поле нет ответа, извините, но затем уточните свой вопрос.:)

Подробнее о EnumMaps можно узнать здесь:
Укрощение тигра: помимо основ перечисленных типов
EnumMap API

1 голос
/ 24 июня 2011

Вы можете использовать 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() { }
}
0 голосов
/ 24 июня 2011

Вы можете добавить атрибуты к каждому экземпляру Enum.Смотрите пример Планеты:

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

...