枚举类型
来源:互联网 发布:苹果6数据流量怎么开 编辑:程序博客网 时间:2024/06/11 06:16
—源于《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:0Beijing.compareTo(CityEnum.Shanghai):-1Beijing.equals(CityEnum.Shanghai):falseBeijing== CityEnum.Shanghai:falseBeijing.getDeclaringClass():class com.love.yu.maven.learn.CityEnumBeijing.name():Beijing-----------------------------------Shanghai ordinal:1Shanghai.compareTo(CityEnum.Shanghai):0Shanghai.equals(CityEnum.Shanghai):trueShanghai== CityEnum.Shanghai:trueShanghai.getDeclaringClass():class com.love.yu.maven.learn.CityEnumShanghai.name():Shanghai-----------------------------------Guangzhou ordinal:2Guangzhou.compareTo(CityEnum.Shanghai):1Guangzhou.equals(CityEnum.Shanghai):falseGuangzhou== CityEnum.Shanghai:falseGuangzhou.getDeclaringClass():class com.love.yu.maven.learn.CityEnumGuangzhou.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)); } }
结果:
GuangzhouGuangzhouShanghaiGuangzhouShanghaiGuangzhouShanghaiGuangzhouBeijingShanghai