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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值