—源于《Java编程思想》
1.定义一个简单的枚举,该枚举继承java.lang.Enum类
public enum CityEnum {
Beijing, Shanghai, Guangzhou
}
我们可以先看一下java.lang.Enum的属性、方法(可访问部分)
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {
private final String name;
public final String name() {
return name;
}
//次序
private final int ordinal;
public final int ordinal() {
return ordinal;
}
public String toString() {
return name;
}
public final boolean equals(Object other) {
return this == other;
}
public final int hashCode() {
return super.hashCode();
}
public final int compareTo(E o) {
Enum other = (Enum) o;
Enum self = this;
if (self.getClass() != other.getClass() && // optimization
self.getDeclaringClass() != other.getDeclaringClass())
throw new ClassCastException();
return self.ordinal - other.ordinal;
}
public final Class<E> getDeclaringClass() {
Class clazz = getClass();
Class zuper = clazz.getSuperclass();
return (zuper == Enum.class) ? clazz : zuper;
}
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) {
T result = enumType.enumConstantDirectory().get(name);
if (result != null)
return result;
if (name == null)
throw new NullPointerException("Name is null");
throw new IllegalArgumentException("No enum constant " + enumType.getCanonicalName() + "." + name);
}
}
然后写个测试方法测试枚举的相关功能
public class MainTest {
public static void main(String[] args) {
for (CityEnum city : CityEnum.values()) {
System.out.println(city + " ordinal:" + city.ordinal());
System.out.println(city + ".compareTo(CityEnum.Shanghai):" + city.compareTo(CityEnum.Shanghai));
System.out.println(city + ".equals(CityEnum.Shanghai):" + city.equals(CityEnum.Shanghai));
System.out.println(city + " == CityEnum.Shanghai:" + (city == CityEnum.Shanghai));
System.out.println(city + ".getDeclaringClass():" + city.getDeclaringClass());
System.out.println(city + ".name():" + city.name());
System.out.println("-----------------------------------");
}
}
}
输出结果为:
Beijing ordinal:0
Beijing.compareTo(CityEnum.Shanghai):-1
Beijing.equals(CityEnum.Shanghai):false
Beijing== CityEnum.Shanghai:false
Beijing.getDeclaringClass():class com.love.yu.maven.learn.CityEnum
Beijing.name():Beijing
-----------------------------------
Shanghai ordinal:1
Shanghai.compareTo(CityEnum.Shanghai):0
Shanghai.equals(CityEnum.Shanghai):true
Shanghai== CityEnum.Shanghai:true
Shanghai.getDeclaringClass():class com.love.yu.maven.learn.CityEnum
Shanghai.name():Shanghai
-----------------------------------
Guangzhou ordinal:2
Guangzhou.compareTo(CityEnum.Shanghai):1
Guangzhou.equals(CityEnum.Shanghai):false
Guangzhou== CityEnum.Shanghai:false
Guangzhou.getDeclaringClass():class com.love.yu.maven.learn.CityEnum
Guangzhou.name():Guangzhou
-----------------------------------
输出结果没有什么太大问题,但是发现了虽然用到了Enum.values()方法,但是java.lang.Enum中没有这个方法?
通过 反射 进行探秘
public static Set<String> analyze(Class<?> enumClass) {
Set<String> methods = new TreeSet<String>();
for (Method m : enumClass.getMethods()) {
methods.add(m.getName());
}
return methods;
}
public static void main(String[] args) {
Set<String> cityMethods = analyze(CityEnum.class);
System.out.println("CityEnum:" + cityMethods);
Set<String> enumMethods = analyze(Enum.class);
System.out.println("Enum:" + enumMethods);
}
输出结果为:
CityEnum:[compareTo, equals, getClass, getDeclaringClass, hashCode, name, notify, notifyAll, ordinal, toString, valueOf, values, wait]
Enum:[compareTo, equals, getClass, getDeclaringClass, hashCode, name, notify, notifyAll, ordinal, toString, valueOf, wait]
发现CityEnum多了个values()方法,这就是编译器插入到enum中的static方法。
2.构造枚举随机选取工具类
package com.love.yu.maven.learn.util;
import java.util.Random;
public class Enums {
private static Random rand = new Random(47);
public static <T extends Enum<T>> T random(Class<T> ec) {
return random(ec.getEnumConstants());
}
public static <T> T random(T[] values) {
return values[rand.nextInt(values.length)];
}
}
其中:
<T extends Enum<T>> 表示T是一个enum实例
Class<T> 作为参数,利用Class对象得到enum实例的数组
测试:
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(Enums.random(CityEnum.class));
}
}
结果:
Guangzhou
Guangzhou
Shanghai
Guangzhou
Shanghai
Guangzhou
Shanghai
Guangzhou
Beijing
Shanghai