1.用实例域代替序数
枚举类型有一个ordinal方法,它的范围是常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用实例域,例如:
public enum ErrorCode {FAILURE(0),SUCCESS(1);private final int code; //上一条讲到枚举天生不可变,所有域都应该是final的。ErrorCode(int code) {this.code = code;}public int getCode() {return code;}
}
2.用EnumSet代替位域
前面说到枚举类型并“不常用”,那么这个EnumSet可能就更不常用了,首先来介绍写EnumSet是什么类型,它存在的意义是什么。
我们都知道HashSet不包含重复元素,同样EnumSet也和HashSet一样实现自AbstractSet,它也不包含重复元素,可以说它就是为Enum枚举类型而生,在《Thinking in Java》中这样描述“Java SE5引入EnumSet,是为了通过enum创建一种替代品,以替代传统的基于int的“位标识””。本书中也是提到用EnumSet来代替位域。
关于EnumSet中的元素必须来自同一个Enum,并且构造一个EnumSet实例是通过静态工厂方法——noneOf,用法如下:
public enum Operation {PLUS, MINUS, TIMES, DEVIDE;
}
import java.util.EnumSet;
public class Main {public static void main(String[] args) throws InterruptedException {EnumSet<Operation> enumSet = EnumSet.noneOf(Operation.class);enumSet.add(Operation.DEVIDE);System.out.println(enumSet);enumSet.remove(Operation.DEVIDE);System.out.println(enumSet);}
}
书中提到的位域,实际上就是OR位运算,换句话说就是“并集”也就是Set所代表的就是并集,在使用int型枚举模式的时候可能会用到类似“1 || 2”,这个时候不如用Enum枚举加以EnumSet来实现。