第31条:用实例域代替序数

枚举天生域一个单独的int值关联,根据枚举常量在类型中的数字位置,从0开始计数。所有枚举都有一个ordinal方法,返回每个枚举常量在类型中的数字位置。

大多数程序不需要这个方法,它是被设计成用于像EnumSet和EnumMap这种基于枚举的通用数据结构的。

不要根据枚举的序数导出与它相关联的值,而是将它保存在一个实例域中。

public enum Ensemble {
    SOLO, DUET, TRIO, QUARTET, QUINTET,
    SEXTET, SEPTET, OCTET, NONET, DECTET;
    public int numberOfMusicians() {
        return ordinal() + 1;
    }
}

这个枚举表示不同数量音乐家。如果枚举常量被重新排序,或者增加一个与之前相同数量音乐家的枚举常量,没办法实现。

修改成:

public enum Ensemble {
    SOLO(1), DUET(2). TRIO(3), QUARTET(4),
    ...;

    private final int numberOfMusicians;
    Ensemble(int n) {
        numberOfMusicians = n;
    }
}

使用实例域numberOfMusicians来保存音乐家的数量。

时间: 2024-08-24 11:59:01

第31条:用实例域代替序数的相关文章

[Effective JavaScript 笔记]第31条:使用Object.getPrototypeOf函数而不要使用__proto__属性

ES5引入Object.getPrototypeOf函数作为获取对象原型的标准API,但由于之前的很多js引擎使用了一个特殊的__proto__属性来达到相同的目的.但有些浏览器并不支持这个__proto__属性,所以并不是完全兼容的.例如对于拥有null原型的对象,不同的环境结果就不同了. var empty=Object.create(null); '__proto__' in empty;//一些环境会返回false,另一些会返回true 这就导致结果的不一致,从而影响到依赖这个判断的相关

《Effective Java》第6章 枚举和注解

第30条:用enum代替int常量 将加班工资计算移到一个私有的嵌套枚举中,将这个策略枚举(strategy enum)的实例传到PayrollDay枚举的构造器中.之后PayrollDay枚举将加班工资计算委托给策略枚举: 以上,方法overtimePay()在每个枚举类示例中实现,对外提供一致的pay()方法. 第31条:用实例域代替序数 永远不要根据枚举的序数导出与它关联的值.而是要将它保存在一个实例域中: 第33条:用EnumMap代替序数索引 现在假设有一个香草的数组.表示一座花园中的

java编程的78条黄金法则

创建和销毁对象 1.考虑用静态工厂方法(返回类的实例的静态方法)代替构造器2.遇到多个构造器参数时要考虑用构造器3.用私有构造器或者枚举类型强化Singleton属性4.通过私有构造器强化不可实例化的能力5.避免创建不必要的对象6.消除过期的对象引用7.避免使用终结(final)方法 对于所有对象都通用的方法 8.覆盖equals时请遵守通用约定9.覆盖equals时总要覆盖hashCode10.始终要覆盖toString11.谨慎地覆盖clone12.考虑实现Comparable接口 类和接口

Effective Java总结的78条

1.考虑用静态工厂方法代替构造器 2.遇到多个构造器参数时要考虑用构造器 3.用私有构造器或者枚举类型强化Singleton属性 4.通过私有构造器强化不可实例化的能力 5.避免创建不必要的对象 6.消除过期的对象引用 7.避免使用finalizer方法 8.重写equals方法时遵守通用约定 9.重写equals时总要重写hashCode 10.始终要重写toString 11.谨慎的重写clone 12.考虑实现Comparable接口 13.使类和成员的可访问性最小化 14.在共有类中使用

[Effective Java 读书笔记] 第6章 枚举和注解

第三十条 用enum代替int 总得来说,使用enum有几点好处 1.编译时的类型安全, 2.可以保证就是自己定义的值,不会有月结风险, 3.每个枚举类型有自己的命名空间 4.枚举可以添加任意的方法和域 5.枚举类型是final的无法实例化,也就是实例可控的.. 第三十一条 用实例域替代序数 即不要依赖枚举值得定义顺序来指定他们的值,而应该讲枚举保存在一个实例域中,类似厦门的value值: public enum RewardType { RMB(1), OBJECT(2), ZAN(3), O

Effective Java 阅读笔记——枚举和注解

30:用enum代替int常量 当需要一组固定常量的时候,应该使用enum代替int常量,除了对于手机登资源有限的设备应该酌情考虑enum的性能弱势之外. 31:用实例域代替序数 应该给enum添加int域,而不是使用ordinal方法来导出与枚举关联的序数值.(几乎不应使用ordinal方法,除非在编写像EnumMap这样的基于枚举的通用数据结构) //WRONG public enum Fruit{ APPLE, PEAR, ORANGE; public int numberOfFruit(

创业的36条军规

[创业军规1]创业者,人生之大事也,不可轻启.创业是带着一群未知的人去一个未知的地方干一件未知的事儿,九死一生,如果没有做好破釜沉舟的决心,最好不要启程. [创业军规2]只有20%的人适合创业,适合创业的人之中只有5%的人适合当总经理.敢于创业并且敢于让比自己更适合的人当总经理的创业者成功机会更大.作为创业团队的成员,周恩来与毛泽东作用同样伟大. [创业军规3]创业的机会成本非常大.大凡想创业的的人,都是同辈中的佼佼者,把创业的热情和心思用在好好打工上,很可能会飞速升官发财,选择创业,进入的是一

十几万条数据的表中,基于帝国cms 。自己亲身体验三种批量更新数据的方法,每一种的速度是什么样的

需求是 上传Excel 读取里面的数据.根据Excel中某一个字段,与数据表中的一个字段的唯一性.然后把 Excel表中数据和数据库表中数据一次更改.本次测试一次更新31条数据. 本次测试基于帝国cms 方法1 用一个for徐循环把读取的数据放在一个数组中然后在十几万条的数据表中逐条查询更改,用时35s: $numArr = count($arr);$m = ceil($numArr/10000);for($i=1;$i<=$numArr;$i++){ $n = $i*10000; $j = $

【电子书】Effective Java中文版下载

下载地址: 点击打开链接 (需要资源0分的联系我~) <Effective Java中文版(第2版)>主要内容:在Java编程中78条极具实用价值的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案.通过对Java平台设计专家所使用的技术的全面描述,揭示了应该做什么,不应该做什么才能产生清晰.健壮和高效的代码.第2版反映了Java 5中最重要的变化,并删去了过时的内容. <Effective Java中文版(第2版)>中的每条规则都以简短.独立的小文章形式出现,并