Java之枚举的原理
2017-08-09 17:42
169 查看
转载自:Java 枚举型为什么是静态的,以及是怎么实现的?中的一个回答
Java枚举型是静态常量,隐式地用static final修饰过。
确切地说,Java枚举型是“静态常量”,这里面包含了两层意思:
1.枚举型中的实例隐式地用static final修饰过。
2.枚举型作为某个类中的成员字段也隐式地用static final修饰过。
还是你上面这个代码,反编译一下,你就能看到–编译器背着你偷偷做了哪些手脚:
首先,枚举型Light是个实实在在的类。继承自基类Enum< Light >。然后在你不知情的情况下,偷偷加了static final修饰词。
然后三个枚举实例GREEN, YELLOW, RED也确确实实是Light的实例。然而前面也加上了static final。
然后构造器也被偷偷地阉割成private。这种实例控制手段,是不是在单例器模式里也见过?所以枚举也是实现单例器的一种方法。
然后编译器还偷偷合成了Light[]数组,一个values( )方法,一个valueOf( )方法。这个values( )在Enum的文档里都找不到。
如果在Enum里定义一个相关方法,你还会看到一个匿名内部类:
反编译的结果如下:
总之,Java的Enum枚举型整个就是一个大大的“语法糖”。明明是一个完整的类,但只向用户暴露几个静态常量,隐藏掉大部分实现的细节。
Java枚举型是静态常量,隐式地用static final修饰过。
确切地说,Java枚举型是“静态常量”,这里面包含了两层意思:
1.枚举型中的实例隐式地用static final修饰过。
2.枚举型作为某个类中的成员字段也隐式地用static final修饰过。
public class Traffic { public enum Light {GREEN, YELLOW, RED} }
还是你上面这个代码,反编译一下,你就能看到–编译器背着你偷偷做了哪些手脚:
/* * Decompiled with CFR 0_118. */ package com.ciaoshen.thinkinjava.chapter19; public class Traffic { public static final class Light extends Enum<Light> { public static final /* enum */ Light GREEN = new Light(); public static final /* enum */ Light YELLOW = new Light(); public static final /* enum */ Light RED = new Light(); private static final /* synthetic */ Light[] $VALUES; public static Light[] values() { return (Light[])$VALUES.clone(); } public static Light valueOf(String string) { return Enum.valueOf(Light.class, string); } private Light() { super(string, n); } static { $VALUES = new Light[]{GREEN, YELLOW, RED}; } } }
首先,枚举型Light是个实实在在的类。继承自基类Enum< Light >。然后在你不知情的情况下,偷偷加了static final修饰词。
然后三个枚举实例GREEN, YELLOW, RED也确确实实是Light的实例。然而前面也加上了static final。
然后构造器也被偷偷地阉割成private。这种实例控制手段,是不是在单例器模式里也见过?所以枚举也是实现单例器的一种方法。
然后编译器还偷偷合成了Light[]数组,一个values( )方法,一个valueOf( )方法。这个values( )在Enum的文档里都找不到。
如果在Enum里定义一个相关方法,你还会看到一个匿名内部类:
public enum Light{ GREEN{public void show(){System.out.println("Green");}}, YELLOW{public void show(){System.out.println("Yellow");}}, RED{public void show(){System.out.println("Red");}}; }
反编译的结果如下:
/* * Decompiled with CFR 0_118. */ package com.ciaoshen.thinkinjava.chapter18; import java.io.PrintStream; public class Light extends Enum<Light> { public static final /* enum */ Light GREEN = new Light("GREEN", 0){ public void show() { System.out.println("Green"); } }; public static final /* enum */ Light YELLOW = new Light("YELLOW", 1){ public void show() { System.out.println("Yellow"); } }; public static final /* enum */ Light RED = new Light("RED", 2){ public void show() { System.out.println("Red"); } }; private static final /* synthetic */ Light[] $VALUES; public static Light[] values() { return (Light[])$VALUES.clone(); } public static Light valueOf(String string) { return Enum.valueOf(Light.class, string); } private Light() { super(string, n); } static { $VALUES = new Light[]{GREEN, YELLOW, RED}; } }
总之,Java的Enum枚举型整个就是一个大大的“语法糖”。明明是一个完整的类,但只向用户暴露几个静态常量,隐藏掉大部分实现的细节。
相关文章推荐
- java 枚举的原理与使用枚举设计单例
- Java Enum Trick(Java枚举实现原理)
- java普通类模拟枚举实现原理
- 黑马程序员------java5的枚举(枚举的原理、枚举的应用)
- Java学习-枚举-底层实现原理初探
- java 枚举原理
- Java之实现枚举原理
- Java枚举(用Java普通类模拟枚举的实现原理及JDK枚举API使用示例)
- 黑马程序员-java枚举实现原理及应用
- Java枚举类型enum的原理
- Java枚举(用Java普通类模拟枚举的实现原理及JDK枚举API使用示例)
- java再复习-枚举的使用及其实现原理
- Java枚举(用Java普通类模拟枚举的实现原理及JDK枚举API使用示例)
- java中枚举的实现原理
- Java 枚举实现原理
- Java多线程读写锁ReentrantReadWriteLock原理详解
- Java中的线程池原理
- java的线程池框架及线程池的原理
- JAVA 并发类(二) ConcurrentHashMap 原理分析
- 第八章JAVA CAS原理深度分析