34 使用枚举类型替代整型常量
有时会遇到这样一些场景:要表示一组固定的常量值。如春夏秋冬、八大行星等等。我们最容易想到的是用几个int类型的常量表示,但是这样有许多问题要考虑:
(1)一个数字没有直观的信息,特别是调试时打印出来用处不大。
(2)数字没有类型区分,容易有类型安全问题。如一个函数本来是接收春夏秋冬的某个,假设分别1 2 3 4表示,这时我们传参为5的话就会出现逻辑错误,但是程序不会报错增加隐患。
(3)不易拓展修改,一旦整型值表示的意义变化就需要较大改动,重新编译整个程序。比如之前是1表示春天,现在需要变为0表示春天,则我们需要去程序里把所有的1改成0。
不要想着用字符串代替数字,字符串也有上述问题,而且这样硬编码字符串写错了也是完全能编译成功从而导致运行时出错,且难以排查。
所以,这种场景就要用枚举类型了,枚举的好处如下:
(1)Java的枚举很强大,是一个完整的类,可以有属性、构造函数、方法等,还有几个enum类型自带的方法,携带的信息全面,非常方便
(2)利于修改拓展。程序中使用春天这个枚举量都是直接使用SPRING,当春天的表示从1变为0时,只需要将枚举类SPRING枚举量的值改为0就行,不会影响使用SPRING枚举量的其他代码。
(3)枚举极为可靠,前面也说了它是单例模式的最佳实现。反射都不能破坏。因此,我们例举几个实例,这个枚举类就会有几个实例,不会出错。
35 用实例属性代替序数
我们知道枚举类有一些自带的方法,其中就有 ordinal()方法,返回这个枚举常量的序数。即第一个枚举常量的序数为0,第二个为1...依次类推。但是我们不要贪小便宜图省事去用这个序数表示一些业务上的属性,序数就应该只是序数,乱用会有不好的后果。比如用序数代替表示某个属性A,当前枚举量的序数为6,但我希望添加一个枚举量它的属性A我想要它为10,则不能实现。因为序数只能是一个一个递增,我们还不得不在6到10中间增加几个无意义的枚举量,才能定义我们想要的枚举量。
大多数程序员没有需要用ordinal()方法。它被设计用于基于枚举的通用数据结构,如EnumSet和EnumMap。除非在编写这样数据结构的代码,否则最好避免使用ordinal方法