美文网首页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枚举类 enum(枚举)类介绍 **java枚举类是一组预定义常量的集合,使用enum关键字声明...

  • Java枚举

    Java中的每个枚举都是java.lang.Enum的final子类,枚举类中的每个枚举常量都是该枚举类的一个实例...

  • 谈谈Java中的枚举类Enum

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

  • Java枚举类

    枚举其实是个特殊的 Java 类,创建枚举需用enum关键字,枚举类都是java.lang.Enum的子类,jav...

  • 枚举

    一、概念: 实例有限而且固定的类,在java里被称为枚举类。 二、通过enum实现枚举类 使用enum定义的枚举类...

  • Java核心类-枚举类

    Java 进阶——枚举enum使用小结及使用枚举替代你的常量类 通过enum定义的枚举类,和其他的class没有任...

  • Java枚举

    枚举 普通方式定义(int枚举模式) 枚举方式 Enum抽象类常见方法 Enum是所有 Java 语言枚举类型的公...

  • Python_枚举

    一、枚举 Enum类 Python中所有枚举类型都是enum模块下的Enum类的子类。 枚举中的标识最好全部使用大...

  • Enum的简单用例

    详阅:Java 中的枚举 (enum)

  • java enum枚举类的用法以及高级玩法

    enum(枚举)类介绍 **java枚举类是一组预定义常量的集合,使用enum关键字声明这个类,常量名称官方建议大...

网友评论

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

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