美文网首页
Java 枚举(enum)

Java 枚举(enum)

作者: xiaofudeng | 来源:发表于2017-11-09 15:32 被阅读0次

参考

Effective Java(2nd Edition)

实例

一直没有怎么关注过Java里的enum枚举类, 原来它的功能不仅仅是public static final int CONSTANT_NAME = 1这样的常量声明.
enum类型中的每个枚举元素, 其实都是该枚举类的一个实例对象, 枚举类的构造器只能是private的. 可以定义新的构造函数, 然后在定义枚举元素的时候传入构造参数, 也可以在enum中定义一些抽象方法, 然后每个枚举元素都可以有自己的行为.
另外, 枚举元素是可以使用==运算符比较的.comparing-java-enum-members-or-equals
下面这个例子主要参考于Effective Java(2nd Edition)这本书.

代码

枚举类:

package enumdemo;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by xiaofu on 17-11-9.
 * 枚举类不可继承其他类, 但是可以实现接口
 */
public enum  OperatorEnum {

    // 以下其实都是OperatorEnum的对象
    ADD("+"){
        @Override
        public double apply(double left, double right) {
            return left + right;
        }
    },
    MINUS("-") {
        @Override
        public double apply(double left, double right) {
            return left - right;
        }
    },
    DIVIDE("/") {
        @Override
        public double apply(double left, double right) {
            return left / right;
        }
    },
    MULTIPLY("*") {
        @Override
        public double apply(double left, double right) {
            return left * right;
        }
    };

    private static final Map<String, OperatorEnum> CONSTANTS = new HashMap<>();

    static {
        CONSTANTS.put("+", ADD);
        CONSTANTS.put("-", MINUS);
        CONSTANTS.put("/", DIVIDE);
        CONSTANTS.put("*", MULTIPLY);
    }

    private String symbol;

    // enum类型的构造器只能是私有的
    private OperatorEnum(String symbol){
        this.symbol = symbol;
    }

    abstract public double apply(double left, double right);

    @Override
    public String toString() {
        return symbol;
    }

    // 无法定义该方法, 因为编译器会自动生成一个这样的方法
//    public static OperatorEnum valueOf(String representation){
//        return CONSTANTS.get(representation);
//    }

    public static OperatorEnum fromString(String representation){
        return CONSTANTS.get(representation);
    }

}

使用:

package enumdemo;

/**
 * Created by xiaofu on 17-11-9.
 */
public class Main {

    public static void main(String[] args) {
        double a = 10, b = 2;
        for(OperatorEnum operatorEnum: OperatorEnum.values()){
            System.out.println(String.format("%f %s %f = %f", a, operatorEnum, b, operatorEnum.apply(a, b)));
        }
        OperatorEnum multiply = OperatorEnum.fromString("*");
        // 枚举类型可以用 == 比较
        // https://stackoverflow.com/questions/1750435/comparing-java-enum-members-or-equals
        System.out.println(multiply == OperatorEnum.MULTIPLY);
    }

}

输出:

10.000000 + 2.000000 = 12.000000
10.000000 - 2.000000 = 8.000000
10.000000 / 2.000000 = 5.000000
10.000000 * 2.000000 = 20.000000
true

相关文章

  • 枚举学习

    java enum枚举类 enum(枚举)类介绍 **java枚举类是一组预定义常量的集合,使用enum关键字声明...

  • 枚举

    枚举 wiki Java的枚举类型用法介绍 深入理解Java枚举类型(enum) 为什么要用enum? 学习计划 ...

  • Java枚举类

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

  • Enum的简单用例

    详阅:Java 中的枚举 (enum)

  • Java枚举

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

  • Java 枚举enum构造方法默认是private

    Java 枚举enum构造方法默认是private

  • Java核心类-枚举类

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

  • 枚举

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

  • Java编程思想---枚举类型

    Java编程思想---枚举类型 基本enum特性 调用enum的values()方法,可以遍历enum实例,val...

  • Android中不推荐使用Enum

    一、Enum的产生 Java1.5中引入了枚举的语法,包括Enum,EnumSet,EnumMap等。其中Enum...

网友评论

      本文标题:Java 枚举(enum)

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