Java 枚举型为什么是静态的,以及是怎么实现的
答案:1 悬赏:40 手机版
解决时间 2021-01-18 22:45
- 提问者网友:我们很暧昧
- 2021-01-18 01:08
Java 枚举型为什么是静态的,以及是怎么实现的
最佳答案
- 五星知识达人网友:西风乍起
- 2021-01-18 02:23
是的,Java枚举型是静态常量,隐式地用static final修饰过。
确切地说,Java枚举型是“静态常量”,这里面包含了两层意思:
枚举型中的实例隐式地用static final修饰过。
枚举型作为某个类中的成员字段也隐式地用static final修饰过。
public class Traffic{
public enum Light{GREEN,YELLOW,RED}
}
还是你上面这个代码,反编译一下,你就能看到--编译器背着你偷偷做了哪些手脚:
package com.ciaoshen.thinkinjava.chapter19;
public class Traffic {
public static final class Light
extends Enum {
public static final Light GREEN = new Light();
public static final Light YELLOW = new Light();
public static final Light RED = new Light();
private static final 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。然后在你不知情的情况下,偷偷加了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");}};
}
反编译的结果如下:
package com.ciaoshen.thinkinjava.chapter18;
import java.io.PrintStream;
public class Light
extends Enum {
public static final Light GREEN = new Light("GREEN", 0){
public void show() {
System.out.println("Green");
}
};
public static final Light YELLOW = new Light("YELLOW", 1){
public void show() {
System.out.println("Yellow");
}
};
public static final Light RED = new Light("RED", 2){
public void show() {
System.out.println("Red");
}
};
private static final 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枚举型是“静态常量”,这里面包含了两层意思:
枚举型中的实例隐式地用static final修饰过。
枚举型作为某个类中的成员字段也隐式地用static final修饰过。
public class Traffic{
public enum Light{GREEN,YELLOW,RED}
}
还是你上面这个代码,反编译一下,你就能看到--编译器背着你偷偷做了哪些手脚:
package com.ciaoshen.thinkinjava.chapter19;
public class Traffic {
public static final class Light
extends Enum
public static final Light GREEN = new Light();
public static final Light YELLOW = new Light();
public static final Light RED = new Light();
private static final 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
然后三个枚举实例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");}};
}
反编译的结果如下:
package com.ciaoshen.thinkinjava.chapter18;
import java.io.PrintStream;
public class Light
extends Enum
public static final Light GREEN = new Light("GREEN", 0){
public void show() {
System.out.println("Green");
}
};
public static final Light YELLOW = new Light("YELLOW", 1){
public void show() {
System.out.println("Yellow");
}
};
public static final Light RED = new Light("RED", 2){
public void show() {
System.out.println("Red");
}
};
private static final 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枚举型整个就是一个大大的“语法糖”。明明是一个完整的类,但只向用户暴露几个静态常量,隐藏掉大部分实现的细节。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯