接受任何枚举作为参数


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;
}

请注意,如果不允许topValuenull,则不需要专用的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之外的所有值。

最新更新