Effective Java 之枚举详解

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方式进行覆盖,这样在添加新的枚举的时候,就提醒我们必须覆盖这个基础的计算方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值