当前位置: 代码迷 >> 综合 >> Effective Java(用实例域代替序数、用EnumSet代替位域)
  详细解决方案

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

热度:86   发布时间:2023-09-29 02:15:42.0

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

  相关解决方案