首页 > 解决方案 > 接受任何枚举作为参数

问题描述

public static <E extends Enum<E>> List<E> enumHeadAsList(final Class<E> val, final E topValue)
{
    // My code
}

我想创建一个接受我给出的任何枚举的方法,并设置该枚举的默认值以进行一些顺序检查,然后将所有值作为列表返回。基本上我想设置一个枚举的头并返回值。到目前为止,我设法做到了这一点,但我不知道如何继续。

我想调用以下方法,例如:

enumHeadAsList(BuffType.class, BuffType.SELF);

标签: java

解决方案


这应该可以解决问题:

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

请注意,如果不允许,Class<E>则不需要专用参数,因为我们可以从中获取枚举类。topValuenulltopValue

如果使用 Java 9 之前的 Java 版本,那么您可以替换List.of()Arrays.asList()结果List是可变的。


推荐阅读