public static <E extends Enum<E>> List<E> enumHeadAsList(final Class<E> val, final E topValue)
{
// My code
}
我想制作一个方法,接受我给出的任何枚举,并设置该枚举的默认值来进行一些顺序检查,然后将所有值作为列表返回。基本上,我想要设置一个枚举的头和返回值。到目前为止,我设法做到了,但我不知道如何继续。
我想调用以下方法,如:
enumHeadAsList(BuffType.class, BuffType.SELF);
这应该可以做到:
public static <E extends Enum<E>> List<E> enumHeadAsList(final E topValue)
{
E[] values = topValue.getDeclaringClass().getEnumConstants();
if (topValue.ordinal() != 0) {
E oldTop = values[0];
values[0] = topValue;
values[topValue.ordinal()] = oldTop;
}
return List.of(values);
}
这段代码假设您不太关心其余元素的顺序(因为顶部元素只是与前面的第一个元素交换(。
如果你想保持其他值的相对顺序不变,那么你必须调整并用以下代码块替换上面的if
:
final int topValueIndex = topValue.ordinal();
if (topValueIndex != 0) {
System.arraycopy(values, 0, values, 1, topValueIndex);
values[0] = topValue;
}
请注意,如果不允许topValue
为null
,则不需要专用的Class<E>
参数,因为我们可以从topValue
获取枚举类。
如果使用Java 9之前的Java版本,则可以将List.of()
替换为Arrays.asList()
,不同之处在于生成的List
是可变的。
EnumSet让这一切变得简单:
public static <E extends Enum<E>> List<E> enumHeadAsList(final Class<E> val, final E topValue)
{
List<E> values = new ArrayList<>();
values.add(topValue);
values.addAll(EnumSet.complementOf(EnumSet.of(topValue)));
return values;
}
complementOf
返回除参数中存在的枚举值之外的所有枚举值的集合。因此,complementOf(EnumSet.of(topValue((是除topValue之外的所有值。