Java枚举类型的背后

    技术2022-06-28  98

    Java 1.5新增了枚举类型,解决了原有利用int或String常量表示枚举所带来的非类型安全问题。 public static final int ENUM1 = 0; public static final int ENUM2 = 1; 如果在Java 1.5之前,想构造类型安全的枚举,所利用的方式如下: package Test; public class EnumExample { public static final EnumExample ENUM1 = new EnumExample(); public static final EnumExample ENUM2 = new EnumExample(); private EnumExample() { } } 在Java 1.5,则只要写成如下形式即可: enum EnumType { ENUM1, ENUM2; } 这种枚举背后的思想是什么呢?其实和类型安全的枚举的思想是一样的。 如下代码: package Test; public class TestEnum { public static void main(String[] args) { System.out.println(EnumType.ENUM1); System.out.println(EnumType.ENUM2); } } enum EnumType { ENUM1, ENUM2; } javac TestEnum.java javap Test.TestEnum > a javap -c Test.EnumType > b 查看文件a Compiled from "TestEnum.java" final class Test.EnumType extends java.lang.Enum{ public static final Test.EnumType ENUM1; public static final Test.EnumType ENUM2; static {}; public static Test.EnumType[] values(); public static Test.EnumType valueOf(java.lang.String); } 可以看到EnumType中的枚举ENUM1是以类型安全的枚举形式实现的,即public static final Test.EnumType,另外Test.EnumType继承于java.lang.Enum类型,因此java 1.5新支持的枚举是在编译时将其转换成类似于在Java 1.5之前写的类型安全的枚举的形式 ,方便了程序的书写。 查看文件b Compiled from "TestEnum.java" public class Test.TestEnum extends java.lang.Object{ public Test.TestEnum(); Code: 0: aload_0 1: invokespecial #8; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: getstatic #16; //Field java/lang/System.out:Ljava/io/PrintStream; 3: getstatic #22; //Field Test/EnumType.ENUM1:LTest/EnumType; 6: invokevirtual #28; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V 9: getstatic #16; //Field java/lang/System.out:Ljava/io/PrintStream; 12: getstatic #34; //Field Test/EnumType.ENUM2:LTest/EnumType; 15: invokevirtual #28; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V 18: return } 可以看到getstatic    #22; //Field Test/EnumType.ENUM1:LTest/EnumType; 这句,表示得到Test.EnumType.ENUM1这个静态域,也验证了ENUM1是以静态域的形式存在的。


    最新回复(0)