1.枚举简单介绍
Java 支持两种特殊用途的引用类型 一种是类 称作枚举类型 一种是接口,称作注解类型,本文将主要讲解枚举类型的特点和使用。
枚举类型( enum pe )是指由一组固定 常量组成合法值的类型,例如一年中 季节太阳系中的行星或者一副牌的花色。
我们可以很容易发现这些对象拥有的属性都是固定,且可以通过列举每个元素来完整的描述当前对象,这些对象与我们平常接触到的对象具有很多特别的地方。
例如
1.不可变
2.对象描述起来较简单
3.对象属性较少,且固定
等。。
因此在java中对这类对象做了特殊的处理,我们可以将这样的引用类型,称作枚举类型。
2.枚举的使用
在不使用枚举之前,我们定义一组固定值的对象通常采用一组静态int常量的方式
例如:
public static final APPLE_LARGE=0;
public static final APPLE_MIDDLE=1;
public static final APPLE_SMALL=2;
上面的一组静态常量代表了一组大小不一的苹果,这种方式命名都有APPLE的前缀,且其值0,1,2均没有任何意义,因此我们可以使用枚举进行表示一个苹果的大中小三种属性,
例如:
public enum Apple {
LARGE,
MIDDLE,
SMALL
}
这样一个苹果的引用类型就被简洁的表示出来,其属性分别为大中小三中。
java的枚举实质上是int值,且没有构造器,因此它是真正的final类,我们无法通过构造器创建枚举实例,因此枚举是单例的,这一点在单例模式中较为推荐,枚举仍然是Object类,而且java的枚举对Object方法进行了高级实现,因为他实现了Comparable和Serializable接口,因此枚举是可以比较和序列化的。
下面这个例子展示了枚举的Comparable接口的实现
Apple.LARGE.compareTo(Apple.MIDDLE);//result is -1
因此这一点也启发我们在开发中写枚举类型,如果有需要比较枚举进行排序的场景,例如苹果大小我们在书写枚举类时就要按照枚举前后顺序进行书写,我们可以将上下的位置看做一个0,1,2递增的顺序,因此不要写成大小中或者小大中等,以免造成错误的比较结果。
3.枚举类型添加方法和域
枚举类型除了能优雅的简化int常量组,而且还能通过增加方法和域。
那么我们为什么要向枚举中添加方法呢?因为这样我们可以将枚举中的数据关联起来便于后续的枚举操作。
例如:
public enum Opeation {
PLUS , MINUS, TIES, DIVIDE;
public double apply(double x ,double y) throws Exception {
switch (this){
case PLUS:return x+y;
case MINUS:return x-y;
case TIMES:return x*y;
case DIVIDE:return x/y;
}
throw new Exception("Unknown op"+this);
}
这里我们使用加减乘除四种运算并且添加了一个apply方法进行简单的x和y的运算方式并得出运算结果。
这一点是枚举更为强大的地方。
但是很明显这种方式是不安全的,
例如如果你添加了一种新的运算方式却没有在switch中添加这种运算方式,那么就会导致不必要的麻烦,因此我们有了另一中更安全的方式添加枚举方法。
public enum Operation {
/**
* + - * /
*/
PLUS("+") {@Override public double baseApply(double x, double y) { return x + y; }},
MINUS("-") {@Override public double baseApply(double x, double y) { return x - y; }},
TIMES("*") {@Override public double baseApply(double x, double y) { return x * y; }},
DIVIDE("/") {@Override public double baseApply(double x, double y) { return x / y; }};
/**
* must override this method
* if add a Enum type
* we can override this method to computer a result
* if every enum has small action
* a abstract method is a good choice
*/
public abstract double baseApply(double x, double y);
}
这里通过一个定义抽象方法,让枚举中的每个属性都使用@override方式进行覆盖,这样在添加新的枚举的时候,就提醒我们必须覆盖这个基础的计算方式。