Java 枚举 enum 类 class 对比

枚举是特殊的类,枚举能实现的类都能实现,但是,某些场景枚举更方便。博主将以class和enum对比的方式展示枚举的特性


Talk is cheap. Show me the code

首先,我们定义一个枚举enum

enum Season1{

    SPRING,//枚举常量之间用逗号隔开
    SUMMER("夏天"),
    AUTUMN,
    WINTER("冬天");//最后一个枚举常量后写分号
    String name;
    public String getName(){
        return name;
    }
    Season1(){}//此处默认构造方法为私有的(自动添加上了private)(无参构造)
    Season1(String name){//此处默认构造方法为私有的(自动添加上了private)(有参构造)
        this.name = name;
    }
    
}

然后,再用类class实现相同的定义

class Season2{

    public static final Season2 SPRING = new Season2();
    public static final Season2 SUMMER = new Season2("夏天");
    public static final Season2 AUTUMN = new Season2("秋天");
    public static final Season2 WINTER = new Season2("冬天");

    String name;
    private Season2(String name){this.name = name;}
    private Season2(){}
    public String getName(){
        return name;
    }

}

这里再展示一下枚举的高级特性

enum Operator{

    //匿名内部类
    ADD{
        public double calculate(double a ,double b){return a+b;}
    },
    SUBTRACT{
        public double calculate(double a ,double b){return a-b;}
    },
    MULTIPLY{
        public double calculate(double a ,double b){return a*b;}
    },
    DIVIDE{
        public double calculate(double a ,double b){return a/b;}
    };
    /**
     * 因为枚举的构造方法是私有的,所以枚举类是不能有子类的,
     * 所以枚举严格上来说是不能定义抽象方法的,但是枚举类允许
     * 枚举常量以匿名内部类的形式实现枚举类中的抽象方法,所以枚举
     * 类中是能够定义抽象方法的(他是一种特例和放宽)
     * 但当定义抽象方法时,枚举类中的所有枚举常量都必须实现这个
     * 抽象方法
     */
    public abstract double calculate(double a ,double b);

}

最后使用一个demo操作一下上面的定义

package com.zaomianbao.demo;

/**
 * @Description 枚举demo
 * @Author zaomianbao
 * @Date 2019/1/28
 **/
public class EnumDemo {

    public static void main(String[] args) {

        //下面4行展示class和enum达到了同一个效果
        Season1 season1 = Season1.SPRING;//获取枚举类中的一个枚举常量SPRING
        Season2 season2 = Season2.SPRING;
        String name = season1.name();//枚举常量的名称
        String name2 = season2.getName();
		
		//下面展示枚举的常用方法
        int ordinal = season1.ordinal();//枚举常量的序号(枚举常量在枚举中是有顺序的,从0开始)
        Season1[] values = Season1.values();//静态方法,返回该枚举中的所有枚举常量
        for (Season1 s1 : values) {
            System.out.println(s1);
        }

        //java对c语言的保留(%为占位符,s表示字符串,d表示整数)
        System.out.printf("这个枚举枚举常量name为%s,在枚举中的位置为%d",name,ordinal);

        Operator[] os = Operator.values();
        for (Operator operator : os) {
            System.out.println(operator.calculate(5, 10));
        }
    }
}

注意:博主将以上代码全部写在一个类文件中,只有将EnumDemo声明成public,结构如下.

package com.zaomianbao.demo;

/**
 * @Description 枚举demo
 * @Author zaomianbao
 * @Date 2019/1/28
 **/
public class EnumDemo {

}

enum Season1{

}

class Season2{

}

enum Operator{
    
}

总结

枚举基本特性就是这些,另外,枚举是实现单例的最简便的方式。

你可能感兴趣的:(后台开发)