enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。
下面是我在使用 enum 过程中的一些经验和总结,主要包括如下内容:
1.原始的接口定义常量
2.语法(定义)
3.遍历、switch 等常用操作
4.enum 对象的常用方法介绍
5.给 enum 自定义属性和方法
6.EnumSet,EnumMap 的应用
7.enum 的原理分析
8.总结
原始的接口定义常量
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<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;
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 ;
}
System.out.println( "getDeclaringClass():
" +
test.getDeclaringClass().getName());
System.out.println( "name():
" +
test.name());
System.out.println( "toString():
" +
test.toString());
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());
}
}
|
输出结果:
EnumSet,EnumMap 的应用
public class Test
{
public static void main(String[]
args) {
EnumSet<EnumTest>
weekSet = EnumSet.allOf(EnumTest. class );
for (EnumTest
day : weekSet) {
System.out.println(day);
}
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 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)
分享到:
相关推荐
Java中的枚举(enum)是自JDK 1.5版本引入的一种强大的类型,它用于定义一组相关的常量。枚举在Java中被设计为一种特殊的类,它们默认继承自`java.lang.Enum`抽象类,并且是单继承的,这意味着它们无法再继承其他类...
在Java编程语言中,枚举(enum)是一种特殊的类,用于定义一组固定的常量。它在许多场景下比使用常量或int类型的硬编码值更安全、更具可读性。本篇文章将深入探讨Java枚举的特性、用法以及如何在实际开发中充分利用...
Java enum 的用法详解 Java enum(枚举)是一种特殊的数据类型,用于定义一组固定的常量。从 JDK 1.5 开始,Java 引入了 enum 机制,解决了传统的常量定义方式的不足。 用法一:常量 在 JDK 1.5 之前,我们定义...
### Java 枚举类型 enum 的使用详解 #### 一、枚举类型概述 在 Java 中,枚举(enum)是一种特殊的类,它被用来表示一组固定的常量值。枚举类型自 JDK 1.5 开始引入,为开发者提供了一种更加安全、简洁的方式来...
Java 枚举(enum)是Java 1.5 引入的一种新的数据类型,它用于表示一组相关的值,这些值可以被当作常量来使用。枚举类型比传统的静态常量更加安全,可读性更好,并且允许进行更丰富的定制。下面我们将详细探讨Java ...
总结来说,Java 枚举提供了一种强类型、安全且易于使用的机制,用于表示一组固定数量的值。它简化了代码,提高了程序的可读性和可维护性,同时也避免了传统的常量类或单例模式的一些潜在问题。通过深入理解和灵活...
### Java中的Enum枚举用法详解 #### 一、引言 在Java编程语言中,枚举(Enum)是一种特殊的数据类型,它被用来表示一组固定的常量集合。相比于使用常量接口或字符串来表示固定集合,枚举提供了更加安全且易于管理的...
Java 中枚举类 enum 的 values() 方法详解 Java 中的枚举类 enum 是一种特殊的类,通过使用 enum 关键字来定义。枚举类 enum 中有一个特殊的方法,values(),这个方法可以将枚举类转换为一个枚举类型的数组。通过...
Java中的枚举(enum)是自JDK 1.5版本引入的一种强大的类型,它用于定义固定的、不可变的值集合。枚举类型是`java.lang.Enum`抽象类的子类,提供了一种安全且类型化的常量表示方式。下面我们将深入探讨enum的使用...
Java 枚举类型 enum 的详解及使用 Java 枚举类型 enum 是 Java 语言中的一种特殊的数据类型,自从 JDK 1.5 引入枚举类型以来,它已经成为了 Java 程序员中的一种常用工具。本文将对 Java 枚举类型 enum 进行详解,...
Java中的枚举(enum)是自JDK 1.5版本引入的一种强大的常量表示机制。它不仅仅是一个简单的数据类型,而是一种特殊的类,能够帮助我们更好地管理和组织一组相关的常量。枚举类型使得代码更加清晰,易于理解和维护,...
总结起来,Java枚举类型是一个强大的工具,它可以替代`static final`常量来表示一组固定的值,提供类型安全、易于维护的代码。通过枚举,我们可以更方便地管理常量,减少错误,并增加代码的灵活性。枚举是Java中一个...
总结起来,Java枚举类型提供了丰富的功能,包括但不限于定义常量、属性、方法,以及实现抽象方法。这种类型使得代码更加规范,提高了代码的可读性和可维护性,减少了错误的可能性。在处理一组固定不变的值时,使用...
### Java的Enum知识点详解 #### 一、枚举的基本概念 在Java中,`enum`(枚举)是一种特殊的类,用于定义一组常量值。它可以帮助开发者限制一个变量的可能值,使其只能从预定义的一组选项中选择。枚举提供了一种更...
java初学者内容对于enum类型,可能仅仅停留在枚举项只有一个字段的数据,在实际开发中可能对着每个枚举项包含几个信息,key value,学生姓名,年龄,身高等,样例详细定义了包含多个值enum类型并使用,请参考文件
### Java枚举类型详解 #### 一、引言 在Java编程语言中,枚举(Enum)作为一种重要的数据类型,在程序设计中扮演着不可或缺的角色。本文将深入探讨Java枚举类型的特性和用法,并通过具体实例说明其优势所在。枚举...
### Java中的“枚举类型”知识点详解 #### 一、引言 在Java编程语言中,枚举(Enum)作为一种特殊的类,其设计初衷是为了更好地处理一组固定不变的常量集合。相较于传统的使用`static final`字段来表示常量的做法...
Java 5 引入的枚举类型(enum)是面向对象编程中的一种重要特性,它为表示一组固定值提供了类型安全且强大的方式。在本文中,我们将深入探讨枚举类的概念、用法以及其与传统常量定义的区别。 1. 枚举类的定义与常量...