您的位置:首页 > 编程语言 > Java开发

Java枚举类型的背后

2011-01-09 22:01 295 查看
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是以静态域的形式存在的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: