美文网首页Java 杂谈
谈谈Java中的枚举类Enum

谈谈Java中的枚举类Enum

作者: 曾泽浩 | 来源:发表于2018-10-26 19:35 被阅读16次

    关键词enum是JDK5新引入的一个特性。枚举对于开发提供了很多的便利。
    首先看一下什么是枚举吧,在Java编程思想中定义,

    关键词enum可以将一组具名的值的有限集合创造为一种新的类型。

    个人理解,枚举就是已经实例化了有限个的类,并且可以定义类的数据和行为。
    与普通类的区别,枚举无法继承其他类,因为已经继承Enum类,同样也可以实现多个接口,在枚举类中可以声明抽象方法,也可以声明实例方法,类方法。
    先看一个最简单的实例吧

    public enum Number {
        ONE,
        TWO,
        THREE,
        FOUR,
        FIVE,
        SIX,
        SEVEN,
        EIGHT,
        NINE,
        TEN;
    }
    

    这个枚举类的定义什么意思,可以理解为有一个Number的类,并且实例化了ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN等是个实例对象。可以通过values()方法得到一个Number枚举类的数组。

            Number[] numbers = Number.values();
            for(Number number:numbers){
                System.out.println(number);
            }
    

    运行结果是:

    ONE
    TWO
    THREE
    FOUR
    FIVE
    SIX
    SEVEN
    EIGHT
    NINE
    TEN
    

    用关键词enum声明的类,默认是继承了Enum类的,父类Enum中有toString()方法,所以打印出来的是实例的名字。

    好了,我们尝试Number类增加一个构造器吧

    
    public enum Number {
        ONE(1),
        TWO(2),
        THREE(3),
        FOUR(4),
        FIVE(5),
        SIX(6),
        SEVEN(7),
        EIGHT(8),
        NINE(9),
        TEN(10);
    
        final private int value;
    
        Number(int value) {
            this.value = value;
        }
    
        public int getValue() {
            return value;
        }
    }
    

    这个例子中的话,在实际开发中是经常会用到的。以前我们通常是定义一个常量类来定义的。

    public class NumberConstant {
    
        public static int ONE = 1;
        public static int TWO = 2;
        public static int THREE = 3;
        public static int FOUR = 4;
        public static int FIVE = 5;
        public static int SIX = 6;
        public static int SEVEN = 7;
        public static int EIGHT = 8;
        public static int NINE = 9;
        public static int TEN = 10;
        
    }
    

    在《Effective Java》一书中提到,

    上面类的int枚举是编译时常量,被编译到使用它们的客户端。如果与枚举常量关联的int发生了变化,客户端必须重新编译,而Java枚举类型则不需要。

    好了,构造器有了,那为Java枚举类添加一个普通的实例方法吧,其实上面的getValue()就是一个普通的实例方法了。比较简单,可以这样子直接调用。

    System.out.println(Number.ONE.getValue());
    
    

    好了,接下来为Number类增加一个抽象方法吧

    package com.example.myenum;
    
    public enum Number {
        ONE(1){
            @Override
            public void print() {
                System.out.println(this.getValue());
            }
        },
        TWO(2){
            @Override
            public void print() {
                System.out.println(this.getValue());
            }
        },
        THREE(3){
            @Override
            public void print() {
                System.out.println(this.getValue());
            }
        },
        FOUR(4){
            @Override
            public void print() {
                System.out.println(this.getValue());
            }
        },
        FIVE(5){
            @Override
            public void print() {
                System.out.println(this.getValue());
            }
        },
        SIX(6){
            @Override
            public void print() {
                System.out.println(this.getValue());
            }
        },
        SEVEN(7){
            @Override
            public void print() {
                System.out.println(this.getValue());
            }
        },
        EIGHT(8){
            @Override
            public void print() {
                System.out.println(this.getValue());
            }
        },
        NINE(9){
            @Override
            public void print() {
                System.out.println(this.getValue());
            }
        },
        TEN(10){
            @Override
            public void print() {
                System.out.println(this.getValue());
            }
        };
    
        final private int value;
    
        Number(int value) {
            this.value = value;
        }
    
        public int getValue() {
            return value;
        }
    
        abstract public void print();
    
    

    当然,出来定义抽象方法之外,也可以去实现一个接口

    package com.example.myenum;
    
    public enum Number implements INumber{
        ONE(1){
            @Override
            public int plus() {
                return this.getValue()+this.getValue();
            }
    
            @Override
            public void print() {
                System.out.println(this.getValue());
            }
        },
        TWO(2){
            @Override
            public int plus() {
                return this.getValue()+this.getValue();
            }
    
            @Override
            public void print() {
                System.out.println(this.getValue());
            }
        },
        THREE(3){
            @Override
            public int plus() {
                return this.getValue()+this.getValue();
            }
    
            @Override
            public void print() {
                System.out.println(this.getValue());
            }
        };
       ;
    
        final private int value;
    
        Number(int value) {
            this.value = value;
        }
    
        public int getValue() {
            return value;
        }
    
        abstract public void print();
    }
    
    

    Java枚举类型经常用于定义常量。
    下面实现一个简单的加减乘除
    最简单的实现方法

    public class Calculator {
        public static void main(String[] args) {
            System.out.println(cal(1.5,3.5,'+'));
            //System.out.println(CalculatorEnum.PLUS.cal(1.5,3.5));
        }
    
        public static double cal(double x,double y,char c){
            switch (c){
                case '+':
                    return x+y;
    
                case '-':
                    return x-y;
    
                case '*':
                    return x*y;
    
                case '/':
                    return x/y;
    
                default:
                    throw new ArithmeticException("异常");
    
            }
        }
    }
    

    再来看看用枚举来实现

    package com.example.myenum;
    
    public enum  CalculatorEnum {
        PLUS{
            @Override
            public double cal(double x,double y) {
                return x+y;
            }
        },
        MINUS{
            @Override
            public double cal(double x,double y) {
                return x-y;
            }
        },
        MULTI{
            @Override
            public double cal(double x,double y) {
                return x*y;
            }
        },
        DEVILE{
            @Override
            public double cal(double x,double y) {
                return x/y;
            }
        };
        abstract public double cal(double x,double y);
    }
    
    

    是不是感觉很优雅呀。

    以上是个人理解,如有不正的地方,请多多指正。

    相关文章

      网友评论

        本文标题:谈谈Java中的枚举类Enum

        本文链接:https://www.haomeiwen.com/subject/jwvltqtx.html