【问题标题】:Java retrieving data from enumsJava 从枚举中检索数据
【发布时间】:2015-10-23 12:12:57
【问题描述】:

我在编写我的第一个 java 程序(所以这个问题相对简单)。我开发了某种基本的角色扮演游戏,我研究角色的属性。

我的问题是:

  1. 如何从我创建的枚举中检索数据(问题出在 Character 构造函数中。我需要根据所选字符类从 ClassStats 获取值)?
  2. 能否以更好的方式存储每个字符类的属性初始值?
enum ClassStats {

    Fighter(15,14,12,10,9,10), Rogue(12,12,16,14,10,10), Mage(10,10,14,16,14,10), Cleric(12,14,12,13,16,14);

    private int strength, constitution, dexterity, intelligence, wisdom, charisma;

    ClassStats(int str, int con, int dex, int intel, int wis, int cha){
        strength = str;
        constitution = con;
        dexterity = dex;
        intelligence = intel;
        wisdom = wis;
        charisma = cha;
    }

    int getStrength(){
        return strength;
    }

    int getConstitution(){
        return constitution;
    }

    int getDexterity(){
        return dexterity;
    }

    int getIntelligence(){
        return getIntelligence();
    }

    int getWisdom(){
        return wisdom;
    }

    int getCharisma(){
        return charisma;
    }

}
public class Character {

private String Name;
private String Class;
private int Level;
private long XP;
private int HP;
private int currentHp;
/*private int BAB; /*Base attack bonus*/

private int Strength;
private int Constitution;
private int Dexterity;
private int Intelligence;
private int Wisdom;
private int Charisma;

Character(String name, String chracterClass){

    Name = name;
    Class = chracterClass;
    Level = 1;
    XP = 0;
    HP = CharacterUtil.setHP(chracterClass);
    currentHp = HP;
    ClassStats cs = null;
    Strength = cs.getStrength();
    System.out.println("Strength: " + Strength);
    Constitution = cs.getConstitution();
    Dexterity = cs.getDexterity();
    Intelligence = cs.getIntelligence();
    Wisdom = cs.getWisdom();
    Charisma = cs.getCharisma();

}

}

【问题讨论】:

  • 请遵守 Java 编码约定:类型名称(类、接口、枚举)应以大写字母开头(例如BigPicture)。方法、变量和字段名称应以小写字母开头(例如bigPicture),常量应全部大写(例如BIG_PICTURE)。此外,强烈建议避免使用与java.lang 中的类相同的名称来命名您自己的类(例如Character)。

标签: java enums


【解决方案1】:

A) 你可以将枚举传入构造函数。

B) 或者,您可以通过enumClass.valueOf(strValue) 从字符串值中获取枚举。

C) 或者,更好的是,您可以有一个工厂类来为您生成不同的默认字符。

另外,这两行没有意义:

ClassStats cs = null;
Strength = cs.getStrength();

如果将其设置为 null,则无法调用对象上的方法。这实际上是您可以从构造函数中传递的字符串表示解析枚举的地方,或者如果您选择选项 2,您将已经有了一个 ClassStats 变量。

【讨论】:

  • A) 在构造函数中添加枚举 ClassStats 就足够了?
  • B) enumClass.valueOf(strValue) 会给我想要的统计数据吗?特定的字符类在这里有什么作用?
  • 是的,我知道null在这里没有意义,ide建议我添加它,我忘了删除它。
  • @Niminim A/B) 我可能误解了你的问题,但我认为问题是如何为给定字符获取正确的 ClassStat 枚举。空值是由于您有一个未初始化的变量这一事实 - 因此,也许我误解了您的问题。
  • 问题是如何从枚举中获取数据。你能写出如何根据选择的字符类(例如)从枚举中检索正确的强度值吗?
【解决方案2】:

我建议不要使用枚举,而是使用较少的原始值并为这些需求创建对象。每个播放器类也可以是一个 Java 类(它们都扩展了一个抽象的 PlayerClass) 然后 Character 可以在构造函数中接收一个玩家类并询问它的默认属性是什么。

这个程序变大后,我会研究工厂设计模式。

【讨论】:

  • 我想过使用抽象类,但是这里有人建议我使用聚合,因为一个字符有一个字符类而不是一个字符是一个字符类。我会检查工厂设计模式。谢谢!
  • 是的,一定要使用聚合。我的意思是有一个抽象的 CharacterClass,然后每个类都扩展它(Thief 扩展 CharacterClass)。然后玩家在其构造函数中接收一个 CharacterClass(这将是一个特定的类,例如 Rogue)并使用它来设置它的初始属性。
【解决方案3】:

起初:

ClassStats cs = null;
Strength = cs.getStrength();
System.out.println("Strength: " + Strength);
Constitution = cs.getConstitution();
Dexterity = cs.getDexterity();
Intelligence = cs.getIntelligence();
Wisdom = cs.getWisdom();
Charisma = cs.getCharisma();

这行不通。在第一行中,您将 cs 设置为“null”,然后尝试通过一些 getter 访问 cs 的数据。您应该如何从“null”中获取值?

在 java 中访问枚举值的工作方式类似于

YourEnum.values()[index];

点赞How to get Enum Value from index in Java?

YourEnum.YourValue

点赞Java: access to the constants in an enumeration (enum)

此外,我会考虑使用像 MySQL 这样的数据库系统来存储字符类信息 - 如果您的项目变得更大,这将更容易编辑。这里使用最多的是 Java Persistance API (JPA)。

https://dzone.com/articles/jpa-tutorial-setting-jpa-java

【讨论】:

  • 是的,我知道null在这里没有意义,ide建议我添加它,我忘了删除它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多