Java枚举类型的背后
2011-01-09 22:01
295 查看
Java 1.5新增了枚举类型,解决了原有利用int或String常量表示枚举所带来的非类型安全问题。
如果在Java 1.5之前,想构造类型安全的枚举,所利用的方式如下:
在Java 1.5,则只要写成如下形式即可:
这种枚举背后的思想是什么呢?其实和类型安全的枚举的思想是一样的。
如下代码:
javac TestEnum.java
javap Test.TestEnum > a
javap -c Test.EnumType > b
查看文件a
可以看到EnumType中的枚举ENUM1是以类型安全的枚举形式实现的,即public static final Test.EnumType,另外Test.EnumType继承于java.lang.Enum类型,因此java 1.5新支持的枚举是在编译时将其转换成类似于在Java 1.5之前写的类型安全的枚举的形式
,方便了程序的书写。
查看文件b
可以看到getstatic #22; //Field Test/EnumType.ENUM1:LTest/EnumType; 这句,表示得到Test.EnumType.ENUM1这个静态域,也验证了ENUM1是以静态域的形式存在的。
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是以静态域的形式存在的。
相关文章推荐
- java枚举类型enum的使用 分类: Android 2015-07-23 17:36 12人阅读 评论(0) 收藏
- Effective Java之用私有构造器或者枚举类型强化Singleton属性(三)
- Java枚举类型详解(原理+用法)
- Java Enum 枚举类型
- JAVA 枚举类型简单应用
- 【转】java枚举类型ENUM
- java的枚举类型
- java的枚举类型(enum)实例
- 转载 java枚举类型enum的使用 (原文地址:http://blog.csdn.net/wgw335363240/article/details/6359614)
- java枚举类型 4000 学习
- Java学习之常用类(三.Math类;四File类 五.枚举类型)
- 【转】java枚举类型enum的使用
- Java笔试题解-枚举类型(1)
- java枚举类型使用举例
- Java中的枚举类型
- Java枚举类型的使用
- 理解java枚举类型
- Effective Java -- 用私有构造器或者枚举类型强化Singleton属性
- 黑马程序员_Java基础枚举类型
- java中的enum枚举类型的适用范围