java基础——枚举类

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/swadian2008/article/details/100354829

目录

一、为什么使用枚举类?

一、枚举类原理

二、枚举类的使用

1、在枚举类中添加方法和自定义构造函数

2、在枚举类中定义抽象方法

3、枚举类实现接口

三、EnumMap 和 EnumSet


一、为什么使用枚举类?

使用枚举类可以使代码更高效、更简洁、更安全,也更容易维护。比如可以使用枚举类来代替常量(public static final ...),限定数据的取值范围等。

一、枚举类原理

枚举类在编译后,会转换成一个实实在在的类,而在该类中,会存在每个在枚举类型中定义好变量的对应实例对象,如定义VARIABLE枚举类型生成对应的public static final T VARIABLE实例;同时编译器会为该类创建两个方法,分别是values()valueOf()

1、values()方法——编译器生成

作用是获取枚举类中的所有变量,并作为数组返回。

2、valueOf(String name)方法——编译器生成

根据枚举名称获取枚举常量,与Enum中的valueOf方法的作用类似,只不过这里只需传入一个参数,比使用可变参数,在提高效率和运行性能上更好一点。

3、valueOf(Class<T> enumType,String name)方法——Enum类方法

静态方法,根据枚举类的Class对象和枚举名称获取枚举常量,效果跟valueOf(String name)方法一样。

测试代码:对枚举方法进行测试

public enum Color {

    GREEN,BLUE,RED,MAUVE,PURPLE;

    public static void main(String[] args) {
        // valueOf(String name)方法获取结果
        System.out.println(Color.valueOf("GREEN"));
        // valueOf(Class<T> enumType,String name)方法获取结果
        System.out.println(Color.valueOf(Color.class,"GREEN"));
        // values()获取结果
        for(Color color : Color.values()){
            System.out.println(color.name());
        }
    }
}

测试结果:

二、枚举类的使用

1、在枚举类中添加方法和自定义构造函数

演示代码:修改了枚举类的构造函数

public enum Color {

    GREEN("绿色"),
    BLUE("蓝色"),
    RED("红色"),
    MAUVE("紫红色"),
    PURPLE("紫色");

    // 私有化参数
    private String desc;

    // 提供公有的获取参数的方法
    public String getDesc() {
        return desc;
    }

    // 私有化构造方法,实际上在enum类中构造方法总是私有的
    private Color(String desc){
        this.desc = desc;
    }

    public static void main(String[] args) {
        for(Color color : Color.values()){
            System.out.println(color.name()+":"+color.getDesc());
        }
    }
}

演示结果:

2、在枚举类中定义抽象方法

演示代码:定义一个抽象方法,每个实例都需要实现它

public enum Color {

    GREEN{// 实现抽象方法
        @Override
        public void doSomething() {
            System.out.println("这代表绿色");
        }
    },
    BLUE{
        @Override
        public void doSomething() {
            System.out.println("这代表绿色");
        }
    },
    RED{
        @Override
        public void doSomething() {
            System.out.println("这代表红色");
        }
    };

    // 定义抽象方法,这个做法其实是把属性固定绑定在了对应的实例上
    public abstract void doSomething();

    public static void main(String[] args) {
        for(Color color : Color.values()){
            System.out.print(color.name()+":");
            color.doSomething();// 根据不同实例调用抽象方法
        }
    }
}

测试结果:

3、枚举类实现接口

演示代码:枚举类的枚举

public enum Color {

    GREEN(DealColor.GREENCOLOR.class),
    BLUE(DealColor.BLUECOLOR.class),
    RED(DealColor.REDCOLOR.class);

    private DealColor[] values;

    private Color(Class<? extends DealColor> kind){
        // 通过class获取枚举对象实例
        this.values = kind.getEnumConstants();
    }

    public DealColor[] getValues() {
        return values;
    }

    public interface DealColor{

        enum GREENCOLOR implements DealColor{
            MOSS_GREEN, EMERALD_GREEN, OLIVE_GREEN
        }

        enum BLUECOLOR implements DealColor{
            COBALT_BLUE, NAVY_BLUE, AQUAMARINE_BLUE
        }

        enum REDCOLOR implements DealColor{
            SCARLET, WINE_RED, MAUVE
        }
    }

    public static void main(String[] args) {
        for(Color color : Color.values()){
            System.out.print(color.name()+" :");
            DealColor[] values = color.getValues();
            for(int i = 0; i<values.length;i++){
                System.out.print(values[i]+" ");
            }
            System.out.println();
        }
    }
}

演示结果:

三、EnumMap 和 EnumSet

这个两个集合是专门针对Enum类而设计的,它们的优势主要体现在性能和速度上,比HashMap和HashSet要快很多,其中最主要的原因就是枚举类的个数是有限的,针对这一有限性使用数组来设计集合

最后,枚举类的使用和功能都比较简单,但是它的实现原理却比较复杂,枚举类在使用时做了很多性能方面的优化工作,其中的设计思想和实现方法是非常值得我们去借鉴的。因为时间有限,此处只做功能上的阐述。

猜你喜欢

转载自blog.csdn.net/swadian2008/article/details/100354829