在我正在进行的一个小项目中,我遇到了困难。用户输入的命令可能是“xp Speed”,我的命令处理程序类发现它想要速度实例的XP值。在这种情况下,它需要将Skill.Speed.currentXP的值返回给用户。
该计划的一小部分:
//Example Instance initialization there is over 40 of these
Skill Speed = (new SkillSpeed(Skills.SKILL_SPEED,Skills.SKILL_SPEED_MODIFIER));
//Constructor for skill class
public Skill(String skillName, double modifier) {
this.name = skillName;
this.minLevel = Skills.MIN_SKILL_LEVEL;
this.Modifier = 1f;
this.currentLevel = (int)calculateLevel();
this.currentXP = 1;
this.leaderboard = getCurrentLeaderboard();
this.ID = getNextID();
}
现在,有一种方法可以做到这一点。通过一个switch语句,case case是输入的字符串。但是我确信在一个switch语句中有40多个case必须是可以避免的。我所拥有的另一个理论是创建一个包含所有当前实例的数组,然后遍历该列表,查找用户输入的字符串是否等于该实例的名称,然后返回实例本身。这就是我想出的:
//method inside another classs that attempts to return the appropriate skill Instance
public Skill getSkillFromName(String Name) {
for(int i = 0; i < Skill.SkillArray.length; i++) {
final String SkillName = Skill.SkillArray[i].getName();
if(SkillName.equalsIgnoreCase(Name)) {
return Skill.SkillArray[i];
}
}
return null;
}
所以这就是我需要帮助的地方:
创建所有已初始化实例的数组
创建将返回Skill的方法。“InsertRandomInstanceDependingOnUserInputHere”.currentXP
修复您在getSkillFromName()方法中看到的任何问题
或许我忽略了一种更简单的方法,你可以帮助我。
感谢您的帮助,
BigDaveNz
答案 0 :(得分:0)
您可以使用Map
。 E.g:
Map<String, Skill> skills = new HashMap<String, Skill>();
要插入值,请将值放入Map
:
skills.put(skill.getName(), skill);
要检索您的技能,您可以按名称获得技能:
Skill skill = skills.get(name);
答案 1 :(得分:0)
如果技能名称与方法名称完全匹配,您可以在“How do I invoke a Java method when given the method name as a string?”找到答案。
要按名称查找实例,您仍然可以使用Map
。