我认为 values() 方法会给我一个枚举的有序视图(如此处所述),但这里不是这种情况。我只是按照我在 Letter 枚举类中创建它们的顺序获取枚举成员。
准确地说,声明的顺序被认为对枚举很重要,所以我们很高兴它们正好按照那个顺序返回。例如,当 aint i
表示一个枚举值时,doingvalues()[i]
是一种非常简单有效的查找枚举实例的方法。相反,该ordinal()
方法返回枚举实例的索引。
有没有办法按字母顺序输出枚举的值?我需要一个单独的比较器对象,还是有内置的方法来做到这一点?基本上,我希望根据 getDescription() 文本按字母顺序对值进行排序:
您所说的价值通常不是为枚举定义的。在这里,在您的上下文中,您的意思是getDescription()
.
正如您所说,您可以为这些描述创建一个比较器。那将是完美的:-)
请注意,一般情况下,您可能需要为这些实例订购多个订单:
您还可以稍微推动一下 DescriptionComparator 的概念:
出于性能原因,您可以存储计算的描述。
因为枚举不能继承,代码重用必须在枚举类之外。让我举一个我们将在我们的项目中使用的例子:
现在代码示例...
/** Interface for enums that have a description. */
public interface Described {
/** Returns the description. */
String getDescription();
}
public enum Letter implements Described {
// .... implementation as in the original post,
// as the method is already implemented
}
public enum Other implements Described {
// .... same
}
/** Utilities for enums. */
public abstract class EnumUtils {
/** Reusable Comparator instance for Described objects. */
public static Comparator<Described> DESCRIPTION_COMPARATOR =
new Comparator<Described>() {
public int compareTo(Described a, Described b) {
return a.getDescription().compareTo(b.getDescription);
}
};
/** Return the sorted descriptions for the enum. */
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;
}
}
// caller code
List<String> letters = EnumUtils.getSortedDescriptions(Letter.class);
List<String> others = EnumUtils.getSortedDescriptions(Other.class);
请注意,通用代码EnumUtils
不仅适用于一个枚举类,而且适用于项目中实现Described
接口的任何枚举类。
如前所述,将代码放在枚举之外(否则它应该属于)的目的是重用代码。两个枚举没什么大不了的,但是我们的项目中有超过一千个枚举,其中许多具有相同的接口......!