【问题标题】:How can I cleanly link Enums to the static information within classes?我怎样才能干净地将枚举链接到类中的静态信息?
【发布时间】:2019-03-19 09:39:09
【问题描述】:

为了清楚起见,我将尽力通过示例而不是代码转储来构建问题。

在进入我的示例之前,我的问题如下:我如何编写一个以枚举为参数的方法,并返回存储在对象中的静态信息(继承自一个共同的父母,其中定义了静态信息)。

示例:

我正在创建一个包含许多玩家技能的游戏。这些技能是通过对象树创建的,具有以下继承性(SomeSkill 代表十几种技能中的任何一种):

技能 > ActiveSkill > SomeSkill and Skill > PassiveSkill > SomeSkill

技能类的伪代码:

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

名称是静态的,因为无论实例如何,技能的名称都不应更改。在我的实际实现中,Skill 还包括静态信息description,和id

枚举的实际实现

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

问题:

我正在努力做的是编写一个将 SkillType 枚举作为参数的方法,并返回一个可用的 Skill 对象(不是 Skill 对象的实例)

在伪代码中:例如,如果我想循环遍历 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 与实例化技能列表匹配的地图,并将所有非静态技能信息设置为默认值。

这似乎是对系统的滥用。

如何将我的枚举列表清晰地链接到我的各种技能课程中的静态信息(非静态信息可以忽略)?

【问题讨论】:

  • SkillType 与 Skill 有何不同?为什么两者都有?
  • 另外,当你说“返回一个可用的技能对象(不是技能对象的实例”时,技能对象怎么不是技能对象的实例?
  • “名称是静态的,因为技能的名称不应该改变,无论实例如何。” 许多 Java 字符串是 intern 的,这意味着这种“优化”可能是'为你做的不多,只会让你的设计更复杂。
  • 基于您的枚举中的名称:speed_buff, leap, beat_down 在我看来,您应该在基本技能类中应用一些多态方法,而不是尝试通过声明这些类型来重新发明打字系统技能与技能本身分开。
  • 我认为我最大的“失败”是没有意识到 Enums 的全部功能。我使用 SkillType 枚举作为以纯文本格式传递技能的简单方法。例如,如果我运行游戏内命令/giveSkill speed_buff,我可以创建一个变量 s = SkillType.valueOf("speed_buff")。现在,我可以在处理命令时将 s 传递给我的函数。我绝对应该研究一个更强大的 Enum 应用程序,它不需要这种奇怪的 if/if/else 链接。

标签: java enums static


【解决方案1】:

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

欲了解更多信息,请查看官方enum documentation 中的“行星”示例。

【讨论】:

  • 谢谢!这无疑给了我一些思考的余地。正如我上面提到的,我最大的失败是没有意识到 Enums 的全部功能。是时候开始重构了!
【解决方案2】:

正如@Alex 提到的,您可以使用枚举构造函数,但如果您不想创建实例,则可以链接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;
    }
}

然后您可以使用 反射 技术来获取静态字段信息,如 here 所述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多