Как я могу чисто связать Enums со статической информацией внутри классов? - PullRequest
0 голосов
/ 15 октября 2018

Для ясности я сделаю все возможное, чтобы сформулировать вопрос через призму примера, а не из дампа кода.

Прежде чем перейти к моему примеру, у меня следующий вопрос: Как я могу написать метод, который принимает перечисление в качестве параметра и возвращает статическую информацию, хранящуюся в объекте (которыйнаследуется от общего родителя, где статическая информация определена).

Пример:

Я создаю игру, которая включает в себя множество навыков игрока.Эти умения создаются с помощью дерева объектов со следующим наследованием (SomeSkill представляет любое из дюжины или около того умений):

Skill> ActiveSkill> SomeSkill и Skill> PassiveSkill> SomeSkill

Псевдо-код для класса Skill:

    Class Skill{
       static string name = "Default Skill"
       int level;
       Skill(int level){
          this.level = level;
       }
       static getName{
          return name;
       }
    }

Имя статическое, так как имя навыка не должноне меняется, независимо от интанса.В моей реальной реализации Skill также включает статическую информацию description и id .

Фактическая реализация enum :

   public enum SkillType
   {
     basic, speed_buff, leap, beat_down
   }

Проблема:

Что я пытаюсь сделать, это написатьметод, который принимает перечисление SkillType в качестве аргумента и возвращает пригодный для использования объект Skill (НЕ экземпляр объекта Skill)

В коде Psuedo: Например, если я хочу выполнить циклчерез Enum и распечатайте имена всех умений ...

    method getSkillClass(SkillType skillType){
       if(skillType == beat_down) return BeatDown
       if(skillType == leap) return Leap
       ...
    }

    for(e : SkillType.getKeys){
       print(getSkillClass(e).getName);
    }

Мое текущее "решение" было бы создать карту, которая соответствует SkillType списку экземпляров из Навыков со всеми нестатическимиинформация о навыке установлена ​​на значения по умолчанию.

Это похоже на злоупотребление системой.

Как я могу чисто связать мой список-перечисление со статической информацией (не статическую информацию можно игнорировать) в моих различных классах навыков

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Как уже упоминалось @Alex, вы можете использовать конструктор enum, но вместо создания экземпляра для связывания вы можете связать тип Class, если не хотите создавать экземпляры:

public enum SkillType {
    Basic(Basic.class),
    SpeedBuff(SpeedBuff.class),
    Leap(Leap.class),
    ...

    private final Class skillClass;

    public skillClass(Class skillClass) {
        this.skillClass = skillClass;
    }

    public Class getSkillClass() {
        return skillClass;
    }
}

Затем вы можете использовать отражение методы, чтобы получить информацию о статическом поле, как объяснено здесь .

0 голосов
/ 15 октября 2018

Перечисления Java позволяют конструктору, который может использоваться для привязки данных к перечислению:

class Skill {
    ...
}

public enum SkillType {
    Basic(new Skill(...)),
    SpeedBuff(new Skill(...)),
    Leap(new Skill(...)),
    ...

    private final Skill skill;

    public SkillType(Skill skill) {
        this.skill = skill;
    }

    public Skill getSkill() {
        return skill;
    }
}

Для получения дополнительной информации, посмотрите на пример 'Планета' в официальной документации перечисления .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...