Java语法糖系列四:枚举类型

目录:
Java语法糖系列一:可变长度参数和foreach循环
//www.greatytc.com/p/628568f94ef8

Java语法糖系列二:自动装箱/拆箱和条件编译
//www.greatytc.com/p/946b3c4a5db6

Java语法糖系列三:泛型与类型擦除
//www.greatytc.com/p/4de08deb6ba4

Java语法糖系列四:枚举类型
//www.greatytc.com/p/ae09363fe734

Java语法糖系列五:内部类和闭包
//www.greatytc.com/p/f55b11a4cec2


枚举

在JVM字节码文件结构中,并没有“枚举”这个类型。
Java的枚举类型,会在编译期被编译成一个普通了类。直接看代码吧:

package lab;
public enum JavaSugarEnum {
Enum1(1, "Enum1"),
Enum2(2, "Enum2"),
Enum3(3, "Enum3");
private int key;
private String value;

public int getKey() {
    return key;
}

public String getValue() {
    return value;
}

private JavaSugarEnum(int key, String value){
    this.key = key;
    this.value = value;
}

public String get(int key) {
    for(JavaSugarEnum item : JavaSugarEnum.values()){
        if(item.getKey() == key)
            return item.getValue();
    }
    return "";
}}

编译出来的代码:

package lab;

public enum JavaSugarEnum
{
  Enum1, Enum2, Enum3;

  private int key;
  private String value;

  public int getKey()
  {
    return this.key;
 }

  public String getValue() {
    return this.value;
 }

  public String get(int paramInt)
      {
JavaSugarEnum[] arrayOfJavaSugarEnum = values(); 
int i = arrayOfJavaSugarEnum.length; 
for (int j = 0; j < i; ++j) { 
    JavaSugarEnum localJavaSugarEnum =arrayOfJavaSugarEnum[j];
  if (localJavaSugarEnum.getKey() == paramInt)
            return localJavaSugarEnum.getValue();
}
    return "";
  }
}

用JD打开class文,代码并没有什么变化,唯一引起注意的是

JavaSugarEnum.values()  

变成了

 JavaSugarEnum[] arrayOfJavaSugarEnum = values();

说明编译出来的字节码会有values()函数,那我们用javap命令再反编译一下看一看字节码

javap -c JavaSugarEnum

去掉汇编代码得到:

Compiled from "JavaSugarEnum.java"
public final class lab.JavaSugarEnum extends java.lang.Enum{
public static final lab.JavaSugarEnum Enum1;
public static final lab.JavaSugarEnum Enum2;
public static final lab.JavaSugarEnum Enum3;
public static lab.JavaSugarEnum[] values();
public static lab.JavaSugarEnum valueOf(java.lang.String);
public int getKey();
public java.lang.String getValue();
public java.lang.String get(int);
static {};
}

可以看到Java枚举编译后实际上是生成了一个类,该类继承了 java.lang.Enum<E>,并添加了一个返回枚举数组的values()方法和valueOf()方法。

所以Enum类型就是一个语法糖,编译器帮我们做了语法的解析和编译。
完全也可以自己实现一个枚举类型。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,705评论 25 709
  • 目录:Java语法糖系列一:可变长度参数和foreach循环//www.greatytc.com/p/62...
    Eric新之助阅读 3,077评论 1 6
  • 以下为转载,作者:张大虎 原文名:自我成长的正确打开方式 1967年,美国心理学家马丁·赛里格曼(Martin S...
    龙畅天下阅读 445评论 3 1
  • 一 夜家有女初长成,名唤夜魅,取倾国倾城之意。世人皆知,夜魅倾心于当朝太子,可偏偏天意弄人,十七岁那一年,嫁...
    喵妹lora阅读 839评论 2 1
  • 如果胡适要说先秦没有法家之名,这应该是毫无争议的,同理,先秦亦无道家、阴阳家之名。但要说先秦没有法家之实、无道家之...
    曹无伤阅读 327评论 0 0