在Java中如何编写循环仲裁枚举的代码?

时间:2017-12-12 13:20:20

标签: java enums

如何编写循环仲裁枚举的代码?

所以在下面的代码中使用枚举作为提供创建Html选择循环的值,但是我看不到如何将枚举传递给方法,或者如何访问标准.values()和{ {1}}方法。所以目前我已经硬编码了一个特定的枚举 RenameFileOptions ,但我想使用任何枚举,我可以解析枚举类,例如.ordinal(),但仍然如何访问RenameFileOptions.class,{{ 1}}和.name()

.values()

更新 由于似乎没有办法以一种无问题的方式实现这一点,我在每个枚举中添加了一个getOptions()方法,这就是发送到我的addCombo方法的内容。这意味着我必须基本上重复代码,我不喜欢这样做,但这意味着addCombo()方法可以根据需要工作,并且通过不引入困难的语法使代码更容易理解。

.ordinal()

3 个答案:

答案 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)
);

尽管是SetEnumSet的文档声明它的迭代器以“自然顺序(声明枚举常量的顺序)”产生值“

对于任意枚举类:

<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。