目录
定义
enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。
关键词enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件来使用 。
《Java编程思想第四版》
通俗理解,枚举指一个经过排序的、被打包成一个单一实体的项列表。一个枚举的实例可以使用枚举项列表中任意单一项的值 。枚举在各个语言当中都有着广泛的应用,通常用来表示诸如颜色、方式、类别、状态等等数目有限、形式离散、表达又极为明确的量 。
语法
创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是java.lang.Enum
类的子类(java.lang.Enum
是一个抽象类)。枚举类型符合通用模式Class Enum<E extends Enum<E>>
,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal)
构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
package enums;
/**
* 季节枚举类
*
* @author zhaiaxin
* @time: 2017/8/9 16:22.
*/
public enum SeasonEnums {
SPRING,SUMMER,AUTUMN,WINTER;
}
这段代码实际上调用了4次 Enum(String name, int ordinal)构造方法:
new Enum<SeasonEnums>("SPRING",0);
new Enum<SeasonEnums>("SUMMER",1);
… …
new Enum<SeasonEnums>("WINTER",3);
常用方法
int compareTo(E o)
Compares this enum with the specified object for order
boolean equals(Object other)
Returns true if the specified object is equal to this enum constant.
Class<E> getDeclaringClass()
Returns the Class object corresponding to this enum constant’s enum type.
String name()
Returns the name of this enum constant, exactly as declared in its enum declaration.
int ordinal()
Returns the ordinal of this enumeration constant (its position in its enum declaration, where the initial constant is assigned an ordinal of zero).
String toString()
Returns the name of this enum constant, as contained in the declaration.
static <T extends Enum<T>> valueOf(Class<T> enumType, String name)
Returns the enum constant of the specified enum type with the specified name.
方法测试:
import enums.SeasonEnums;
/**
* 测试SeasonEnums枚举的一些常用方法
*
* @author zhaiaxin
* @time: 2017/8/9 16:24.
*/
public class testSeasonEnums {
public static void main(String[] args){
//int compareTo(E o)
int result1 = SeasonEnums.SUMMER.compareTo(SeasonEnums.SPRING);
int result2 = SeasonEnums.SUMMER.compareTo(SeasonEnums.SUMMER);
int result3 = SeasonEnums.SUMMER.compareTo(SeasonEnums.AUTUMN);
System.out.println("----------测试int compareTo(E o)方法----------");
System.out.println("\nSUMMER 与 SPRING 比较结果为" + result1 + "\nSUMMER 与 SUMMER 比较结果为" + result2 + "\nSUMMER 与 AUTUMN 比较结果为" + result3);
//boolean equals(Object other)
boolean a = SeasonEnums.SUMMER.equals(SeasonEnums.SPRING);
boolean b = SeasonEnums.SUMMER.equals(SeasonEnums.SUMMER);
System.out.println("\n----------测试boolean equals(Object other)方法----------");
System.out.println("\nSUMMER 与 SPRING 是否相等的结果为" + a + "\nSUMMER 与SUMMER 是否相等的结果为" + b);
//Class<E> getDeclaringClass()
Class class1 = SeasonEnums.SUMMER.getDeclaringClass();
System.out.println("\n----------测试Class<E> getDeclaringClass()方法----------");
System.out.println("\nclass1 的类型是" + class1);
//String name()
String name = SeasonEnums.AUTUMN.name();
System.out.println("\n----------测试String name()方法----------");
System.out.println("\nAUTUMN 的name()是" + name);
//int ordinal()
int ordinal = SeasonEnums.SPRING.ordinal();
System.out.println("\n----------测试int ordinal()方法----------");
System.out.println("\nSPRING 的次序是" + ordinal);
//String toString()
String string = SeasonEnums.AUTUMN.toString();
System.out.println("\n----------测试String toString()方法----------");
System.out.println("\nAUTUMN 的toString()是" + string);
//static <T extends Enum<T>> valueOf(Class<T> enumType, String name)
System.out.println("\n----------测试static <T extends Enum<T>> valueOf(Class<T> enumType, String name)方法----------");
System.out.println("\nAUTUMN 的valueOf是" + SeasonEnums.valueOf("AUTUMN"));
}
}
运算结果:
----------测试int compareTo(E o)方法----------
SUMMER 与 SPRING 比较结果为1
SUMMER 与 SUMMER 比较结果为0
SUMMER 与 AUTUMN 比较结果为-1
----------测试boolean equals(Object other)方法----------
SUMMER 与 SPRING 是否相等的结果为false
SUMMER 与SUMMER 是否相等的结果为true
----------测试Class<E> getDeclaringClass()方法----------
class1 的类型是class enums.SeasonEnums
----------测试String name()方法----------
AUTUMN 的name()是AUTUMN
----------测试int ordinal()方法----------
SPRING 的次序是0
----------测试String toString()方法----------
AUTUMN 的toString()是AUTUMN
----------测试static <T extends Enum<T>> valueOf(Class<T> enumType, String name)方法----------
AUTUMN 的valueOf是AUTUMN
总结
可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:
enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。
并且,如果在Java中需要表示诸如颜色、方式、类别、状态等等数目有限、形式离散、表达又极为明确的量,应当尽量舍弃常量表示的做法,而将枚举作为首要的选择。
参考博客
http://blog.csdn.net/u014527058/article/details/52751488
http://www.cnblogs.com/hyl8218/p/5088287.html