本章目标
掌握enum关键字与Enum类的关系
了解Enum类中提供的常用方法
Enum
从前面已经清楚的知道,使用enum关键字可以定义一个枚举,实际上此关键字表示的是java.lang.Enum类型,即:使用enum声明的枚举类型,就相当于定义一个类,而此类则默认继承java.lang.Enum类。java.lang.Enum类的定义如下:
public abstract class Enum<E extends Enum<E>>
extends Object
implements Comparable<E>, java.io.Serializable
枚举类的主要操作方法
有如下的枚举类
public enum Color {//定义枚举类型
RED,GREEN,BLUE;//定义枚举的 3 个类型
}
取得枚举的信息
在枚举类建立完成之后,实际上都会为其调用枚举类中的构造方法,为其赋值,在Enum类的构造方法中的第一个参数name就是定义的枚举的名称,第二个参数ordinal则会从0开始依次进行编号。之后可以使用Enum类中提供的name()和ordinal()方法取得名字和编号。
验证name()和ordinal()方法
public class GetEnumInfo {
public static void main(String[] args) {
for(Color c : Color.values()){//枚举.values() 表示得到全部枚举的内容
System.out.println(c.ordinal() +" --> "+c.name());
}
}
/* 结果:
* 0 --> RED
* 1 --> GREEN
* 2 --> BLUE
* */
}
为枚举类的每一个对象赋值
可以通过构造方法和setter方法两种方式为枚举中的每个属性赋值:
——每个枚举类中都有其指定好的若干对象,当然,每一个枚举对象中也可以包含多个属性。而这些属性也可以通过构造方法为其赋值。
——以上是通过构造方法的方式为属性赋值的,当然也可以通过调用setter()的方式为指定的属性赋值,但是这样一来就必须明确好每一个枚举类的对象,如果操作的对象是RED,则名字应该为“红色”,如果操作的对象是GREEN,则名字应该为“绿色”等。
通过构造方法为属性赋值
enum Color{
RED("红色"),GREEN("绿色"),BLUE("蓝色");//定义枚举的 3 个类型
private String name;//定义 name 属性
private Color(String name) {//定义构造方法
this.name = name;//设置名字
}
public String getName() {//取得 name 属性
return name;
}
public void setName(String name) {//设置 name 属性
this.name = name;
}
}
public class ConstrutorEnum {
public static void main(String[] args) {
for(Color c : Color.values()){//枚举.values() 表示得到全部枚举的内容
System.out.println(c.ordinal() +" --> "+c.name()+"("+c.getName()+")");//输出
}
}
/* 结果:
* 0 --> RED(红色)
* 1 --> GREEN(绿色)
* 2 --> BLUE(蓝色)
* */
}
通过setter方法为属性赋值
enum Color{
RED,GREEN,BLUE;//定义枚举的 3 个类型
private String name;//定义 name 属性
public String getName() {
return name;
}
public void setName(String name) {
switch(this){
case RED:{//判断是否是红色
if("红色".equals(name)){
this.name = name;//设置名称
}else{
System.out.println("设置内容错误。");
}
break;
}
case GREEN:{//判断是否是绿色
if("绿色".equals(name)){
this.name = name;//设置名称
}else{
System.out.println("设置内容错误。");
}
break;
}
case BLUE:{//判断是否是蓝色
if("蓝色".equals(name)){
this.name = name;//设置名称
}else{
System.out.println("设置内容错误。");
}
break;
}
}
}
}
public class SetEnum {
public static void main(String[] args) {
Color c = Color.BLUE;
c.setName("兰色");//设置一个错误的名字
c.setName("蓝色");//设置一个正确的名字
System.out.println(c.getName());
}
/* 结果:
* 设置内容错误。
* 蓝色
* */
}
valueof()
如果不想通过“枚举类.对象”的形式取得每一个枚举类的对象,也可以使用Enum类定义的“枚举类.valueof()”方法的形式进行调用。
使用vlaueof()方法找到一个枚举对象
public class ValueOfDemo {
public static void main(String[] args) {
Color c = Enum.valueOf(Color.class, "BLUE");
c.setName("兰色");//设置一个错误的名字
c.setName("蓝色");//设置一个正确的名字
System.out.println(c.getName());
}
/* 结果:
* 0 --> RED
* 1 --> GREEN
* 2 --> BLUE
* */
}
使用比较器
在Enum类的定义中已经实现好了Comparable接口,所以枚举类的内容本身是可以进行排序的,下面通过TreeSet演示枚举的排序操作。
在类集部分曾经介绍过TreeSet可以直接进行排序,排序的规则是通过Comparable接口完成的。
验证枚举比较器
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
enum Color{
RED,GREEN,BLUE;//定义枚举的 3 个类型
}
public class ComparableEnum {
public static void main(String[] args) {
Set<Color> t = new TreeSet<Color>();//只能加入 Color 类型
t.add(Color.GREEN);//增加绿色的枚举对象
t.add(Color.BLUE);//增加蓝色的枚举对象
t.add(Color.RED);//增加红色的枚举对象
Iterator<Color> iter = t.iterator();//使用迭代输出
while(iter.hasNext()){
System.out.print(iter.next()+"、");
}
}
/* 结果:
* RED、GREEN、BLUE、
* */
}