Java 如何从另一个类的生成器中引用枚举字段?

Java 如何从另一个类的生成器中引用枚举字段?,java,generics,builder,Java,Generics,Builder,我正在使用生成器模式在游戏中创建物品对象,我希望能够使用物品前缀和后缀生成随机物品,如Item.Builder().random().build()。前缀和后缀都是带有不规则字段的枚举。例如,它们都有名称,但有些有损坏和运气字段。如何从生成器中访问枚举字段 我在每个枚举中都有公共方法,它们返回一个随机前缀和后缀,我的项生成器的randomize方法调用这些方法并在本地存储词缀。但我似乎无法通过反射得到它们的成员变量prefix.getClass().getDeclaredField(“名称”).

我正在使用生成器模式在游戏中创建物品对象,我希望能够使用物品前缀和后缀生成随机物品,如
Item.Builder().random().build()
。前缀和后缀都是带有不规则字段的枚举。例如,它们都有
名称
,但有些有
损坏
运气
字段。如何从生成器中访问枚举字段

我在每个枚举中都有公共方法,它们返回一个随机前缀和后缀,我的项生成器的randomize方法调用这些方法并在本地存储词缀。但我似乎无法通过反射得到它们的成员变量
prefix.getClass().getDeclaredField(“名称”).toString
返回
java.lang.String roan.ItemPrefix$2.name
,而不是它的实际名称。另外,我觉得这很烦人

枚举:

建造商:

public static abstract class Builder<T extends Builder<T>> {
    // Default values
    private String name = "itemName"; 
    private int damage = 5;
    private int luck = 0;  

    protected abstract T self();

    public T name(String name) {
        this.name = name;
        return self();
    }

    // More builder methods
    ...

    // PROBLEMATIC CODE
    public T random() {
        Prefix prefix = Prefix.randomPrefix();
        this.name = prefix.getClass().getDeclaredField("name").toString();
        return self();
        }

        public Item build() {
            return new Item(this);
        }
    }
}

// Builder helper classes
...
公共静态抽象类生成器{
//默认值
私有字符串name=“itemName”;
私人int损害=5;
私有整数=0;
保护抽象T-self();
公共T名称(字符串名称){
this.name=名称;
返回自我();
}
//更多生成器方法
...
//问题代码
公共T随机(){
Prefix Prefix=Prefix.randomPrefix();
this.name=prefix.getClass().getDeclaredField(“name”).toString();
返回自我();
}
公共项目生成(){
返回新项目(本);
}
}
}
//生成器助手类
...

理想情况下,它将使用传递给它的枚举的成员字段来组装一个完全格式的项。我使用的是
enum Prefix
而不是前缀对象数组,因为我想在别处为
Item
的子类(如
Armor
)使用某些枚举集,这些子类只能使用某些前缀。

您当前的设计取决于enum Prefix的3个匿名子类。这是没有必要的。不如试试这个:

enum Prefix {
  ARROGANT ("Arrogant ",20,2), BLOODY("Bloody ",30,0), CURIOUS("Curious ",5, 4);

  public String name = "itemName"; 
  public int damage = 5;
  public int luck = 0;  

  Prefix(String name, int damage, int luck) {
    this.name = name;
    this.damage = damage;
    this.luck = luck;
  }

  ...
}
因此,访问字段时不需要反射


如果您确实希望备选方案
傲慢
血腥
好奇
具有不同的模式,那么对枚举的决定是错误的。而是在工厂列表中选择random,每个工厂都返回此随机选择的完全正确的配置项。

我将创建一个名为Modifier的接口,然后使用映射而不是枚举。你可以使用一个枚举来命名物品和设备可以拥有的每个属性。然后,对于每个statType,如果列表包含该类型的修改器,则按数字更改stat。
prefix.getClass().getDeclaredField(“name”)
返回字段,而不是值。无论如何,这是一个坏主意,但是调用
getValue(prefix)
将返回您需要的字符串。下面是我的答案。谢谢。我想这是我避免的,因为如果我决定以后添加新的统计数据,我不想重写每个常量和/或使用多个构造函数。。。
enum Prefix {
  ARROGANT ("Arrogant ",20,2), BLOODY("Bloody ",30,0), CURIOUS("Curious ",5, 4);

  public String name = "itemName"; 
  public int damage = 5;
  public int luck = 0;  

  Prefix(String name, int damage, int luck) {
    this.name = name;
    this.damage = damage;
    this.luck = luck;
  }

  ...
}