语法定义
枚举类型(enum type)是指一组固定常量组成合法值得类型,例如一年中的四季、太阳系中的行星或者一副牌中的花色
int枚举模式
public static final int APPLE_FUJI = 0;
public static final int APPLE_PIPPIN = 1;
public static final int APPLE_GRANNY_SMITH = 1;
public static final int ORANGE_NAVEL = 0;
public static final int ORANGE_TEMPLE = 1;
public static final int ORANGE_BLOOD = 1;
这种方法称为int枚举模式,他存在的很多不足。
1. 不具有类型安全
2. 没有描述性可言
3. 很难将int枚举转化成可打印的字符串
例如:讲apple传到想要传到orange的方法中,编译器也不会发出警告
扩展:这种模式还有一种辩题,他是用的是String常量,称为String枚举模式。这种模式提供了可打印的字符串。但同时会导致初级用户直接把字符串常量硬编码到客户端代码中,而不使用对应的常量字段名,这样只会在运行时报错
枚举类型
public enum Apple{FUJI,PIPPIN,GRANNY_SMITH}
public enum Orange{NAVEL,TEMPLE,BOOD}
基本思想:通过公有的静态final域为每个枚举常量导出一个实例。枚举类型无可访问的构造器,所以他是真正的final类。客户端不能创建和扩展。他们都是单例的
优点:
1-保证编译时的类型安全
2-包含同名常量的多个枚举类型可以在一个系统中和平相处,因为每个类型都有自己的命名空间
应用
看过大话设计模式的简单工厂模式的都一定有印象,里面的例题是一个利用面向对象语言实现一个计算器控制台程序。具体细节不说了,为了使程序具有高内聚和低耦合。最后使用工厂模式创建了很多类
这里使用枚举加JDK8函数式编程实现相同的功能
public enum Operator {
PLUS ("+", (x, y) -> x + y),
MINUS ("-", (x, y) -> x - y),
TIMES ("+", (x, y) -> x * y),
DIVIDE("+", (x, y) -> x / y);
private final String symbol;
private final DoubleBinaryOperator op;// 函数接口,接受两个double类型参数返回一个double的value
Operator(String symbol, DoubleBinaryOperator op) {
this.symbol = symbol;
this.op = op;
}
@Override
public String toString() {
return symbol;
}
public double apply(double x, double y) {
return op.applyAsDouble(x, y);
}
}