`
chaoyi
  • 浏览: 290383 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Enum

 
阅读更多

本章目标
掌握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、
 * */
}

 

 

 

  • 大小: 59.2 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics