Effective Java~35. 用实例域代替序数

许多枚举通常与单个 int 值关联。所有枚举都有一个 ordinal 方法,它返回每个枚举常量类型的数值位置。你可能想从序数中派生一个关联的 int 值:

// Abuse of ordinal to derive an associated value - DON'T DO THIS
public enum Ensemble {
	SOLO, DUET, TRIO, QUARTET, QUINTET,
	SEXTET, SEPTET, OCTET, NONET, DECTET;
	
	public int numberOfMusicians() { 
		return ordinal() + 1; 
	}
}

        虽然这个枚举能正常工作,但对于维护来说则是一场噩梦。如果常量被重新排序,numberOfMusicians 方法将会中断。

        幸运的是,这些问题有一个简单的解决方案。 永远不要从枚举的序号中得出与它相关的值; 请将其保存在实例属性中

public enum Ensemble {
	SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5),
	SEXTET(6), SEPTET(7), OCTET(8), DOUBLE_QUARTET(8),
	NONET(9), DECTET(10), TRIPLE_QUARTET(12);
	
	private final int numberOfMusicians;
	
	Ensemble(int size) { 
		this.numberOfMusicians = size; 
	}
	public int numberOfMusicians() { 
		return numberOfMusicians; 
	}
}

        枚举规范对此 ordinal 方法说道:“大多数程序员对这种方法没有用处。 它被设计用于基于枚举的通用数据结构,如 EnumSet 和 EnumMap 。“除非你在编写这样数据结构的代码,否则最好避免用 ordinal 方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值