第30条:用enum代替int常量
将加班工资计算移到一个私有的嵌套枚举中,将这个策略枚举(strategy enum)的实例传到PayrollDay枚举的构造器中。之后PayrollDay枚举将加班工资计算委托给策略枚举:
以上,方法overtimePay()在每个枚举类示例中实现,对外提供一致的pay()方法。
第31条:用实例域代替序数
永远不要根据枚举的序数导出与它关联的值、而是要将它保存在一个实例域中:
第33条:用EnumMap代替序数索引
现在假设有一个香草的数组。表示一座花园中的植物,你想要按照类型(一年生、多年生或者两年生植物)进行组织之后将这些植物列出来。如果要这么做的话,需要构建泛个集合,征种类型一个,并且遍历整座花园,将每种香草放到相应的集合中。有些程序员会将这些集合放到一个按照类型的序数进行索引的数组中来实现这一点。
一个反例:使用ordinal()方法
有一种非常快速的Map实现专门用于枚举键,称作java.util.EnumMap。以下就是用EnumMap改写后的程序:
Note:
Enum规范中谈到ordinal时这么写道:“大多数程序员都不需要这个方法。它是设计成用于像EnumSet和EnumMap这种基于枚举的通用数据结构的。”除非你在编写的是这种数据结构,否则最好完全避免使用ordinal方法。
第34条:用接口模拟可伸缩的枚举
虽然枚举类型(BasicOperation)不是可扩展的,但接口类型( Operation)则是可扩展的,它是用来表示API中的操作的接口类型。你可以定义另一个枚举类型,它实现这个接口,并用这个新类型的实例代替基本类型。
时间: 2024-11-13 08:12:52