java 中enum的使用方法详解
java 中enum的使用方法详解
enum 的全称为 enumeration, 是 jdk 1.5 中引入的新特性,存放在 java.lang 包中。
下面是我在使用 enum 过程中的一些经验和总结。
原始的接口定义常量
public interface iconstants { string mon = "mon"; string tue = "tue"; string wed = "wed"; string thu = "thu"; string fri = "fri"; string sat = "sat"; string sun = "sun"; }
语法(定义)
创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.enum 类的子类(java.lang.enum 是一个抽象类)。枚举类型符合通用模式 class enum
package com.hmw.test; /** * 枚举测试类 * @author <a href="mailto:hemingwang0902@126.com" rel="external nofollow" rel="external nofollow" >何明旺</a> */ public enum enumtest { mon, tue, wed, thu, fri, sat, sun; }
这段代码实际上调用了7次 enum(string name, int ordinal):
new enum<enumtest>("mon",0); new enum<enumtest>("tue",1); new enum<enumtest>("wed",2); ... ...
遍历、switch 等常用操作
对enum进行遍历和switch的操作示例代码:
public class test { public static void main(string[] args) { for (enumtest e : enumtest.values()) { system.out.println(e.tostring()); } system.out.println("----------------我是分隔线------------------"); enumtest test = enumtest.tue; switch (test) { case mon: system.out.println("今天是星期一"); break; case tue: system.out.println("今天是星期二"); break; // ... ... default: system.out.println(test); break; } } }
输出结果:
mon tue wed thu fri sat sun ----------------我是分隔线------------------ 今天是星期二
enum 对象的常用方法介绍
int compareto(e o)
比较此枚举与指定对象的顺序。
class getdeclaringclass()
返回与此枚举常量的枚举类型相对应的 class 对象。
string name()
返回此枚举常量的名称,在其枚举声明中对其进行声明。
int ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
string tostring()
返回枚举常量的名称,它包含在声明中。
static
/** * java学习交流qq群:589809992 我们一起学java! */ public class test { public static void main(string[] args) { enumtest test = enumtest.tue; //compareto(e o) switch (test.compareto(enumtest.mon)) { case -1: system.out.println("tue 在 mon 之前"); break; case 1: system.out.println("tue 在 mon 之后"); break; default: system.out.println("tue 与 mon 在同一位置"); break; } //getdeclaringclass() system.out.println("getdeclaringclass(): " + test.getdeclaringclass().getname()); //name() 和 tostring() system.out.println("name(): " + test.name()); system.out.println("tostring(): " + test.tostring()); //ordinal(), 返回值是从 0 开始 system.out.println("ordinal(): " + test.ordinal()); } }
输出结果:
tue 在 mon 之后 getdeclaringclass(): com.hmw.test.enumtest name(): tue tostring(): tue ordinal(): 1
给 enum 自定义属性和方法
给 enum 对象加一下 value 的属性和 getvalue() 的方法:
package com.hmw.test; /** * 枚举测试类 * * @author <a href="mailto:hemingwang0902@126.com" rel="external nofollow" rel="external nofollow" >何明旺</a> */ public enum enumtest { mon(1), tue(2), wed(3), thu(4), fri(5), sat(6) { @override public boolean isrest() { return true; } }, sun(0) { @override public boolean isrest() { return true; } }; private int value; private enumtest(int value) { this.value = value; } public int getvalue() { return value; } public boolean isrest() { return false; } } public class test { public static void main(string[] args) { system.out.println("enumtest.fri 的 value = " + enumtest.fri.getvalue()); } }
输出结果:
enumtest.fri 的 value = 5
enumset,enummap 的应用
/** * java学习交流qq群:589809992 我们一起学java! */ public class test { public static void main(string[] args) { // enumset的使用 enumset<enumtest> weekset = enumset.allof(enumtest.class); for (enumtest day : weekset) { system.out.println(day); } // enummap的使用 enummap<enumtest, string> weekmap = new enummap(enumtest.class); weekmap.put(enumtest.mon, "星期一"); weekmap.put(enumtest.tue, "星期二"); // ... ... for (iterator<entry<enumtest, string>> iter = weekmap.entryset().iterator(); iter.hasnext();) { entry<enumtest, string> entry = iter.next(); system.out.println(entry.getkey().name() + ":" + entry.getvalue()); } } }
原理分析
enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.enum。enumtest 经过反编译(javap com.hmw.test.enumtest 命令)之后得到的内容如下:
public class com.hmw.test.enumtest extends java.lang.enum{ public static final com.hmw.test.enumtest mon; public static final com.hmw.test.enumtest tue; public static final com.hmw.test.enumtest wed; public static final com.hmw.test.enumtest thu; public static final com.hmw.test.enumtest fri; public static final com.hmw.test.enumtest sat; public static final com.hmw.test.enumtest sun; static {}; public int getvalue(); public boolean isrest(); public static com.hmw.test.enumtest[] values(); public static com.hmw.test.enumtest valueof(java.lang.string); com.hmw.test.enumtest(java.lang.string, int, int, com.hmw.test.enumtest); }
所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。
总结
可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.enum(java是单一继承)。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
上一篇: mysql数据库应付大流量网站的的3种架构扩展方式介绍
下一篇: spring boot日志管理配置