以上程序的执行结果为:
RED:红色假如不使用枚举在枚举没有诞生之前 , 也就是 JDK 1.5 版本之前 , 我们通常会使用 int 常量来表示枚举 , 实现代码如下:
public static final int COLOR_RED = 1;public static final int COLOR_BLUE = 2;public static final int COLOR_GREEN = 3;
但是使用 int 类型可能存在两个问题:第一 , int 类型本身并不具备安全性 , 假如某个程序员在定义 int 时少些了一个 final 关键字 , 那么就会存在被其他人修改的风险 , 而反观枚举类 , 它“天然”就是一个常量类 , 不存在被修改的风险(原因详见下半部分);
第二 , 使用 int 类型的语义不够明确 , 比如我们在控制台打印时如果只输出 1...2...3 这样的数字 , 我们肯定不知道它代表的是什么含义 。
那有人就说了 , 那就使用常量字符呗 , 这总不会还不知道语义吧?实现示例代码如下:
public static final String COLOR_RED = "RED";public static final String COLOR_BLUE = "BLUE";public static final String COLOR_GREEN = "GREEN";
但是这样同样存在一个问题 , 有些初级程序员会不按套路出牌 , 他们可能会直接使用字符串的值进行比较 , 而不是直接使用枚举的字段 , 实现示例代码如下:public class EnumTest { public static final String COLOR_RED = "RED"; public static final String COLOR_BLUE = "BLUE"; public static final String COLOR_GREEN = "GREEN"; public static void main(String[] args) { String color = "BLUE"; if ("BLUE".equals(color)) { System.out.println("蓝色"); } }}
这样当我们修改了枚举中的值 , 那程序就凉凉了 。枚举使用场景枚举的常见使用场景是单例 , 它的完整实现代码如下:
public class Singleton { // 枚举类型是线程安全的 , 并且只会装载一次 private enum SingletonEnum { INSTANCE; // 声明单例对象 private final Singleton instance; // 实例化 SingletonEnum() { instance = new Singleton(); } private Singleton getInstance() { return instance; } } // 获取实例(单例对象) public static Singleton getInstance() { return SingletonEnum.INSTANCE.getInstance(); } private Singleton() { } // 类方法 public void sayHi() { System.out.println("Hi,Java."); }}class SingletonTest { public static void main(String[] args) { Singleton singleton = Singleton.getInstance(); singleton.sayHi(); }}
因为枚举只会在类加载时装载一次 , 所以它是线程安全的 , 这也是《Effective Java》作者极力推荐使用枚举来实现单例的主要原因 。知识扩展枚举为什么是线程安全的?这一点要从枚举最终生成的字节码说起 , 首先我们先来定义一个简单的枚举类:
推荐阅读
- Java中读取File文件内容转为String类型
- 淘宝店铺分几种 淘宝店铺分为几种类型
- 在 JavaScript 中替换所有指定字符 3 种方法
- 搞懂 面向对象 的核心思想,JAVA中封装、包和访问权限的知识点
- 您应该了解的顶级JavaScript库
- javascript自学记录:递归
- 阿里的垃圾怎么回收?Java G1源码分析与调优手册
- JavaScript代码整洁之道
- 陈香铁观音的制作工序,安溪铁观音的三大类型
- 一文带你弄懂 Java 动态代理