我以为
values()
方法会按照枚举的顺序给我一个有序视图(就像这里提到的那样),但是这并不是这里的情况。我只是按照Letter枚举类中创建它们的顺序获得枚举成员。
确切地说,对于枚举来说,声明的顺序被认为是重要的,因此我们很高兴它们恰好按照那个顺序返回。例如,当一个
int i
表示枚举值时,使用
values()[i]
是一个非常简单和有效的方法来找到枚举实例。相反,
ordinal()
方法返回枚举实例的索引。
有没有一种方法可以按字母顺序输出枚举的值?我需要一个单独的比较器对象吗,还是有内置的方法可以做到这一点?基本上,我希望根据getDescription()文本对值进行字母排序:
在一般情况下,你所谓的
value并不是通用的枚举定义。在这里,你的上下文中,你指的是
getDescription()
的结果。
正如你所说,你可以为这些描述创建一个比较器。那将是完美的 :-)
请注意,在一般情况下,你可能需要这些实例的多个顺序:
- 声明顺序(这是官方顺序)
- 描述顺序
- 其他需要的顺序
你也可以推动DescriptionComparator的概念:
出于性能原因,你可以存储计算出的描述。
因为枚举不能继承,代码重用必须在枚举类之外。让我给出我们在项目中使用的例子:
现在是代码示例...
public interface Described {
String getDescription();
}
public enum Letter implements Described {
}
public enum Other implements Described {
}
public abstract class EnumUtils {
public static Comparator<Described> DESCRIPTION_COMPARATOR =
new Comparator<Described>() {
public int compareTo(Described a, Described b) {
return a.getDescription().compareTo(b.getDescription);
}
};
public static <E extends Enum & Described> List<String>
getSortedDescriptions(Class<E> enumClass) {
List<String> descriptions = new ArrayList<String>();
for(E e : enumClass.getEnumConstants()) {
result.add(e.getDescription());
}
Collections.sort(descriptions);
return descriptions;
}
}
List<String> letters = EnumUtils.getSortedDescriptions(Letter.class);
List<String> others = EnumUtils.getSortedDescriptions(Other.class);
请注意,
EnumUtils
中的通用代码不仅适用于一个枚举类,而且还可用于您项目中实现
Described
接口的任何枚举类。
正如之前所说,将代码放在枚举外部(本应该放在枚举内部的位置)是为了重复利用代码。对于两个枚举来说并不是大问题,但我们的项目中有超过一千个枚举,其中许多都使用相同的接口...!