Java之枚举的原理

转载自:Java 枚举型为什么是静态的,以及是怎么实现的?中的一个回答

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枚举型整个就是一个大大的“语法糖”。明明是一个完整的类,但只向用户暴露几个静态常量,隐藏掉大部分实现的细节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值