java枚举类型,为什么强烈推荐使用?看看它的7种场景方法( 四 )

以上程序的执行结果为:

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》作者极力推荐使用枚举来实现单例的主要原因 。
知识扩展枚举为什么是线程安全的?这一点要从枚举最终生成的字节码说起 , 首先我们先来定义一个简单的枚举类:


推荐阅读