如何编写循环仲裁枚举的代码?
所以在下面的代码中使用枚举作为提供创建Html选择循环的值,但是我看不到如何将枚举传递给方法,或者如何访问标准.values()
和{ {1}}方法。所以目前我已经硬编码了一个特定的枚举 RenameFileOptions ,但我想使用任何枚举,我可以解析枚举类,例如.ordinal()
,但仍然如何访问RenameFileOptions.class
,{{ 1}}和.name()
.values()
更新 由于似乎没有办法以一种无问题的方式实现这一点,我在每个枚举中添加了一个getOptions()方法,这就是发送到我的addCombo方法的内容。这意味着我必须基本上重复代码,我不喜欢这样做,但这意味着addCombo()方法可以根据需要工作,并且通过不引入困难的语法使代码更容易理解。
.ordinal()
答案 0 :(得分:5)
您应该使用Class.getEnumConstants()
方法。
因此,代码的中间部分应该类似于
each(Arrays.asList(enumClass.getEnumConstants()),
next ->
iffElse(next.ordinal()==selectedValue,
option(next.name()).attr(Html.SELECTED, Html.SELECTED).withValue(String.valueOf(next.ordinal())),
option(next.name()).withValue(String.valueOf(next.ordinal()))
)
))
你应该在方法参数中传递Class<? extends Enum<?>> enumClass
。
答案 1 :(得分:3)
您可以使用EnumSet.allOf()
:
for(MyType t : EnumSet.allOf(MyType.class)) {
doSomethingWith(t);
}
...或Java 8 lambdas:
EnumSet.allOf(MyType.class).forEach(
t -> doSomethingWith(t)
);
尽管是Set
,EnumSet
的文档声明它的迭代器以“自然顺序(声明枚举常量的顺序)”产生值“
对于任意枚举类:
<T extends Enum<T>> void loopAroundEnum(Class<T> enumType) {
EnumSet.allOf(enumType).forEach(
val -> doSomethingWith(val) // val is of type T
);
}
虽然Java的习惯是不要过早地进行优化,但是值得知道EnumSet
可能在速度和内存消耗方面比使用MyType[]
数组更高效由MyType.getEnumConstants()
返回。
来自EnumSet
的Javadoc:
枚举集在内部表示为位向量。这个 表示非常紧凑和高效。空间和时间 这个类的性能应该足够好,以允许它作为一个 传统的基于int的“bit”的高质量,类型安全的替代品 标志“。
答案 2 :(得分:1)
由于Enum是基类,您需要将类传递给枚举:
public <E extends Enum<E>> void method(Class<E> type) {
E[] values = type.getEnumConstants();
}
当然Class会测试它是否是枚举;没有枚举类时返回null。