用enum 代替int (30)

1、int 枚举模式

  • 在类型安全性和使用方便性没有任何帮助
  • apple_ 和orange_ 之间比较,编译器不会有任何警告报出
  • 十分脆弱,编译枚举时常量,编译到使用他们的客户端(int关联发生变化需要重新编译)

4461556a31d57645ec60ae691cc398c3100.jpg

2、String 枚举模式

  • int 枚举模式变体
  • 常量可打印(int 枚举模式打印出来就是数字),打印出来是字符串
  • 会引来性能问题,因为依赖字符串比较
  • 会使字符串硬编码到客户端代码中(初级编码会这样,而不是使用适当域(field)名)
  • 如果字符串有错误,运行时才会发现,编译时不会有任何警告

3、jdk 1.5以后的新枚举

  • 这种模式本质上是int 值
  • 基本思想:通过公有静态 final 类为每个枚举实例导出常量
  • 没有可以访问的构造器,枚举是真正的final 类
  • 枚举实例是受控的,客户端不能生成枚举实例,不能扩展,只有声明过的枚举常量

2d866cb9050d66eb40d7e484287597f6344.jpg

4、枚举提供了编译时的类型安全

  • 传递错误类型会导致编译时报错
  • 试图 == 比较时,各个常量是严格区分的
  • 可以增加或者重新编排枚举类型代码,无需修改客户端代码(因为常量值没有被编译到客户端代码中,存在int 模式中)

5、枚举类型允许添加任意方法和域,实现任意接口

  • 提供了所有Object 方法的高级实现,实现了Comparable 接口和 Serializable 接口
  • 并针对枚举类型的可任意改变性,设计了序列化方式

6、方法或域添加到枚举类型中

  • 将数据和常量关联起来(枚举常量的属性值)
  • 可以使用适当的方法增强枚举类型(枚举类型先成为一个简单集合,慢慢演变成全功能的抽象)
  • 如下,星球枚举类型,传入质量和半径创建常量
  • 将数据与枚举常量关联起来,声明实例域,编写带有数据,并将数据保存在域中的构造器
  • 枚举天生不可变,所有域都应该是final 

be855723fb3e2cf16e985ba981f6a0e1ed2.jpg

7、不同行为与每个枚举常量关联起来,可以使用如下抽象方法

  • 注意不带参数的几个常量写法

27929075d80984fec8f130ed3c2fd1feef7.jpg

  • 带参数的

042c9073f0543b3c1d309f616a348e23428.jpg

  • 客户端调用

6737dd1cf0b9a4cc2ac973deb3e539869e8.jpg

8、枚举类型有一个自动产生的方法

  • valueOf 方法,将常量的名字转变为常量本身
  • 如果在枚举类型中覆盖toString 方法,要考虑编写一个fromString 方法(实现字符串变回相应枚举)

4f23a5a332d06c160380f0594391ef8b66b.jpg

  • 枚举构造器不可以访问枚举的静态域,编译时常量除外(枚举不允许在其构造函数中使用静态引用
  • 枚举类型语法要求:仅仅私有构造方法是允许的(如下)

9ab04a09429f54e1f9c1defd5c60ec89e19.jpg

9、枚举常量中共享代码更加困难

私有嵌套枚举:策略枚举

01a780bfcedf58b6737f8373f02f3c25bd9.jpg

10、枚举中的switch 语句,适合给外部的枚举类型,增加特定于常量的行为

9c0ec1a7b303fd5ef4b64a50a4424c30633.jpg

11、枚举性能缺陷

  • 装载和初始化时会有空间和时间成本
  • 枚举优先使用 Comparable 而非 int常量

12、每当需要固定常量数组的时候,使用枚举

  • 与int 相比,枚举易读、安全、功能强大
  • 特定于常量的方法,优先启用自有值枚举
  • 多个枚举常量共享相同的行为,考虑策略枚举

转载于:https://my.oschina.net/u/3847203/blog/1832733

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值