1、掌握enum关键字与Enum 类的关系
2、了解Enum类中提供的常用方法
public abstract class Enum<E extends Enum<E>>
extends Object
implements Comparable<E>, Serializable
此类定义的时候使用了泛型机制,而且实现了 Comparable 接口以及 Serializable 接口,证明此种类型是可以比较,可以被序列化的。
Enum 类的构造方法
protected Enum(String name, int ordinal)
构造方法中接收两个参数,一个表示枚举的名字,另外一个表示枚举的序号。
public enum Color{
RED,GREEN,BLUE;
}
RED实际上就表示的是枚举的名称,默认的编号是0
public class GetEnumInfo{
public static void main(String args[]){
for(Color c:Color.values()){
System.out.println(c.ordinal() + " --> " + c.name()) ;
}
}
};
如果此时,希望做一些改进,希望可以使用一些文字表示颜色的信息,则可以按照最早的 Color 类的形式。在枚举类中定义属性及自己的构造方法,但是一旦定义有参构造之后,在声明枚举对象的时候就必须明确的调用构造方法,并传递参数。
enum Color{
RED("红色"),GREEN("绿色"),BLUE("兰色") ;
private Color(String name){
this.setName(name) ;
}
private String name ; // 定义name属性
public void setName(String name){
this.name = name ;
}
public String getName(){
return this.name ;
}
}
public class ConstructorEnum{
public static void main(String args[]){
for(Color c:Color.values()){
System.out.println(c.ordinal() + " --> " + c.name()
+"(" + c.getName() + ")") ;
}
}
};
如果现在不想通过构造设置内容,而是希望通过 setter() 方法设置内容,则就必须按如下的方式执行;
enum Color{
RED,GREEN,BLUE ;
private String name ; // 定义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 ;
}
}
this.name = name ;
}
public String getName(){
return this.name ;
}
}
public class SetEnum{
public static void main(String args[]){
Color c = Color.BLUE ; // 得到兰色
c.setName("兰色") ; // 名字错误
c.setName("蓝色") ; // 名字正确
System.out.println(c.getName()) ;
}
};
发现,使用构造方法似乎更方便一些。
enum Color{
RED,GREEN,BLUE ;
private String name ; // 定义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 ;
}
}
this.name = name ;
}
public String getName(){
return this.name ;
}
}
public class ValueOfEnum{
public static void main(String args[]){
Color c = Color.valueOf(Color.class,"BLUE") ; // 得到兰色
c.setName("兰色") ; // 名字错误
c.setName("蓝色") ; // 名字正确
System.out.println(c.getName()) ;
}
};
对于枚举 .class 是随后要讲解的 java 反射机制中的内容,现在只需要按照此格式编写即可。
在枚举中实际上已经实现好了 Comparable 接口,所以枚举中的内容是可以排序的。
import java.util.Iterator;
import java.util.Set ;
import java.util.TreeSet ;
enum Color{
RED,GREEN,BLUE ;
}
public class ComparableEnum{
public static void main(String args[]){
Set<Color> t = new TreeSet<Color>() ; // 设置类型
t.add(Color.GREEN) ; // 加入绿色
t.add(Color.RED) ; // 加入红色
t.add(Color.BLUE) ; // 加入蓝色
Iterator<Color> iter = t.iterator() ;
while(iter.hasNext()){
System.out.print(iter.next() + "、") ;
}
}
};
可以发现,按照序号进行排序的操作。
总结:
1、Enum 类的作用
2、enum 关键字与 Enum od r 关系。