簡體   English   中英

如何將Enums干凈地鏈接到類中的靜態信息?

[英]How can I cleanly link Enums to the static information within classes?

為了清楚起見,我將盡最大努力通過示例的角度而不是代碼轉儲來提出問題。

在進入示例之前,我的問題如下:如何編寫一個以枚舉為參數,並返回存儲在對象中的靜態信息的方法(該對象繼承自公共父對象,其中定義了靜態信息) )。

這個例子:

我正在創建一個包含許多玩家技能的游戲。 這些技能是通過對象樹創建的,具有以下繼承(SomeSkill代表十幾種技能中的任何一種):

技能>主動技能> SomeSkill 技能>被動技能> SomeSkill

類技能的偽代碼:

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

名稱是靜態的,因為技能的名稱不應改變,而與實例無關。 在我的實際實現中,Skill還包括靜態信息descriptionid

枚舉的實際實現

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

問題:

我正在努力做的是編寫一個將SkillType枚舉作為參數並返回可用的Skill對象的方法(不是Skill對象的實例)

在Psuedo代碼中:例如,如果我想遍歷枚舉並打印出所有技能的名稱...

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

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

我當前的“解決方案”是創建一個將SkillType與實例化技能列表匹配的映射,並將所有非靜態技能信息設置為默認值。

但是,這似乎是對系統的濫用。

如何在各種技能課程中將我的枚舉列表干凈地鏈接到靜態信息(可以忽略非靜態信息)?

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

有關更多信息,請參見官方枚舉文檔中的“行星”示例。

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

然后,您可以使用反射技術來獲取靜態字段的信息,說明這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM