枚举类型

来源:互联网 发布:苹果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
原创粉丝点击