参考:http://www.cnblogs.com/mxmbk/articles/5091999.html
http://www.cnblogs.com/hyl8218/p/5088287.html
enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。
在Java SE5之前,我们要使用枚举类型时,通常会使用static final 定义一组int常量来标识,代码如下
public static final int MAN = 0;
public static final int WOMAN = 1;
相信很多小伙伴,在实际开发中也是那么干的,既然这样已经能实现枚举的功能,为什么还要引入枚举呢?我们接着往下看当我们需要是同这组“int枚举”是代码如下
public void showSex(int sex){
switch(sex){
case MAN:
System.out.println("this is a boy");
break;
case WOMAN:
System.out.println("this is a Girl");
break;
}
}
看起来这些貌似也没什么问题,但是我们知道,一个项目基本都是基于团队开发,或许只有你自己知道int类型的1代表 gril,0代表Boy。其他同事看到这个函数根本不知道其中的含义,这样的代码很明显阅读性很差,从而会造成沟通成本很高。我们接着往下看,现在你为你 的func写了很nice的注释,傻子都能看得懂(0 boy,1 gril)。但是项目组不可避免的总会出现那么一两个傻子,非要给你传个3进来,而且这样的错误编译器不会报任何错误,运行时会造成什么bug,这个只有 乔老爷知道了。所以这样的代码是极不安全的。使用枚举就能很好的避免上面的问题,接下来我们就来理一理枚举的用法。
枚举用于存储数量有限的一组固定的数据集。使用场景:上面说到的性别的表示,一年四级春夏秋冬的表示,一周七天的表示,颜色的表示等等。
语法(定义)
创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum<E>>
,而 E
表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal)
构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
package com.hmw.test;
/** * 枚举测试类
* @author <a href="mailto:hemingwang0902@126.com">何明旺</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<E>
getDeclaringClass()
返回与此枚举常量的枚举类型相对应的 Class 对象。
String
name()
返回此枚举常量的名称,在其枚举声明中对其进行声明。
int
ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
String
toString()
返回枚举常量的名称,它包含在声明中。
static
<T extends Enum<T>> T
valueOf(Class<T> enumType, String name)
返回带指定名称的指定枚举类型的枚举常量。
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">何明旺</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 的应用
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<E>。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的好处主要在于很好的阅读性和安全性。我们基本上可以把枚举类当成一个常规的Java类,可以往其中添加新的方法, 包括抽象方法甚至main方法。 不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承);enum也不能被其它类继承。
相关推荐
Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类...
"Java Enum 枚举学习资料" Java Enum 枚举学习资料是 Java 编程语言中的一种特殊类型,它主要用来实现一组固定的常量。 Enum 枚举类型是 Java 5 中引入的一种新特性,旨在解决传统的 int 枚举常量的缺陷。 1. 枚举...
Java中的枚举(enum)类型是在JDK 1.5版本引入的一个强大的特性,它用于定义一组相关的常量。在C/C++等语言中,枚举通常用来表示一组具有固定值的常量集合,但在Java中,枚举不仅限于此,它提供了更多的功能和灵活性...
enum枚举的方法
【7enum枚举字函数程序案例VC共4页.pdf】 这个压缩包文件包含了一个关于“7enum枚举字函数”的程序案例,适用于Visual C++(VC)开发环境。7enum,顾名思义,可能是一种自定义的枚举类型或者一个特定的枚举工具,...
### Java中的Enum枚举用法详解 #### 一、引言 在Java编程语言中,枚举(Enum)是一种特殊的数据类型,它被用来表示一组固定的常量集合。相比于使用常量接口或字符串来表示固定集合,枚举提供了更加安全且易于管理的...
10-enum枚举
在Java编程语言中,枚举(`enum`)是一种强大的工具,它允许我们定义一组预定义的常量。在Spring Boot 2.x框架中,枚举的使用可以帮助我们更好地管理和组织代码,提供类型安全和可读性。本篇将深入探讨如何在Spring ...
java简单的 enum枚举类介绍
在Java编程语言中,`Enum`(枚举)是一种特殊的类类型,用于定义固定的、预定义的常量集合。它们在程序设计中扮演着重要的角色,特别是在需要表示一组固定值时,如状态、颜色、星期等。本资源包提供了一些关于`Enum`...
包含了关于枚举类的应用,以及枚举类和接口的组合应用,扩展映射关系。很有用的工具类。
enum day {Sun,Mon,Tue,Wed,Thu,Fri,Sat}; 默认情况下,枚举符的值从0开始,其后值总是前面一个+1。 即Sun=0,Mon=1,Tue=2,Wed=3,Thu=4,Fri=5,Sat=6 也可以自己定义数值,其后值总是前面一个+1 例如: enum day {Sun=...
Java枚举(enum)是Java语言提供的一种特殊的数据类型,用于定义一组有限的常量,这些常量在程序中作为固定的值使用。枚举在Java中是类的子类型,因此,它们具备类的一些特性,比如可以有方法、变量以及实现接口。...
枚举类型以`enum`关键字开始,后跟枚举名,然后是花括号{},里面列举出枚举常量。例如: ```c enum Color {Red, Green, Blue}; ``` 这里定义了一个名为`Color`的枚举类型,包含三个枚举常量:Red、Green和Blue...
在Java编程语言中,`enum`(枚举)是一种特殊的类,用于定义一组固定的常量。枚举在很多场景下非常有用,例如表示状态、颜色、星期等有限且不变的集合。下面我们将深入探讨`enum`枚举类的使用方法,并通过具体的代码...
本文实例总结了python模拟enum枚举类型的方法。分享给大家供大家参考。具体分析如下: python中没有enum枚举类型,可能python认为这玩意压根就没用,下面列举了三种方法模拟enum枚举类型 方法1. 使用自定义类 class...
以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码 代码如下: # way1 class Directions: up = 0 down = 1 left = 2 right =3 print Directions.down # way2 dirUp, dirDown, dirLeft, dirRight =...
给刚学C#的同学一些帮助 public enum CardColor : byte { 红桃, 方片, 梅花, 黑桃, }