我有一个项目,它使用枚举作为类的参数,签名是这样的:
public class MyClass<E extends Enum<E>> extends ExtendedClass
问题是,我不想定义一个枚举,并为每个新的枚举再次执行相同的编程。
我在考虑ByteBuddy在运行时生成枚举。但是我找不到一个简洁的方法来做这个,资源不是那么多。
编辑:
更具体地说,我的代码中包含的内容:
private enum MyEnum{
FOO, BAR;
}
MyClass<MyEnum> obs = new MyClass<MyEnum>()
当我使用ByteBuddy生成的Enum时,它不起作用;在这种情况下,它不被视为一种类型(编译错误)。
是否有一些技巧可以使用,或者在运行时可以做什么?
答案 0 :(得分:1)
使用静态字段编译到类的枚举类型
enum MyEnum {
FOO
}
编译为
class MyEnum extends java.lang.Enum<MyEnum> {
public static final Sample FOO;
// synthetic
private static final Sample[] $VALUES;
static {
FOO = new MyEnum("FOO", 0);
$VALUES = new MyEnum[] {FOO};
}
private MyEnum(String name, int ordinal) {
super(name, ordianl);
}
// and other helpers
public static MyEnum[] values() { /* $VALUES */ }
public static MyEnump[] valueOf(String name) { /* $VALUES lookup */ }
}
(这就是为什么枚举不能扩展另一个类只实现接口)。所以你需要生成这种类来模拟枚举。
答案 1 :(得分:0)
您可以轻松地使用Byte Buddy创建枚举:
Class<? extends Enum<?>> type = new ByteBuddy()
.makeEnumeration("FOO", "BAR")
// define methods/fields if required.
.make()
.load(MyClass.class.getClassLoader())
.getLoaded();
这会给你一个枚举类型。您可以通过以下方式读取常量:
Enum<?> foo = Enum.valueOf(type, "FOO");
Enum<?> bar = Enum.valueOf(type, "BAR");
免责声明:如果这是解决问题的最佳方法,那么您的问题确实没有足够的用例来允许断言。
答案 2 :(得分:-1)