参考
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
网友评论