我以为 values() 方法会给我一个有序的枚举视图(如此处所述),但这里的情况并非如此。我只是按照我在 Letter 枚举类中创建枚举的顺序获取枚举成员。
确切地说,声明顺序对于枚举被认为是重要的,因此我们很高兴它们恰好以该顺序返回。例如,当 a 表示枚举值时,执行 是查找枚举实例的一种非常简单有效的方法。相反,该方法返回枚举实例的索引。int i
values()[i]
ordinal()
有没有办法按字母顺序输出枚举的值?我是否需要一个单独的比较器对象,或者是否有内置方法可以执行此操作?基本上,我希望这些值根据getDescription()文本按字母顺序排序:
您所说的值不是为枚举定义的一般内容。在这里,在您的上下文中,您的意思是 的结果。getDescription()
正如你所说,你可以为这些描述创建一个比较器。那将是完美的:-)
请注意,通常,对于以下实例,您可能需要多个订单:
- 申报订单(这是官方订单)
- 描述顺序
- 根据需要提供其他
你也可以稍微推动一下DetureComparator的概念:
出于性能原因,可以存储计算的描述。
由于枚举不能继承,因此代码重用必须在枚举类之外。让我举一个我们在项目中使用的例子:
现在代码示例...
/** 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);
请注意,中的泛型代码不仅适用于一个枚举类,而且适用于项目中实现 Describe 接口的任何枚举
类。EnumUtils
如前所述,将代码放在枚举之外(否则它将属于的地方)的要点是重用代码。对于两个枚举来说,这没什么大不了的,但是我们的项目中有超过一千个枚举,其中许多枚举具有相同的接口...!