Effective Java(用实例域代替序数、用EnumSet代替位域)

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 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来实现。

你可能感兴趣的:(Java)