emum类(2)
emum定义如下:
public abstract class Enum<E extends Enum<E>>extends Objectimplements Comparable<E>, Serializable
此类定义使用了泛型接口,而且实现了Comparable接口和Serializable接口,证明了此类型是可以被比较和序列化的。
构造方法:
protected Enum(String name, int ordinal) 单独的构造方法。
emun构造方法,中接收的两个参数,一个表示枚举的名字(name()),另一个表示枚举的序号ordinal()。
public enum Color{ RED,GREEN,BLUE ; }
Red实际上就是枚举的名称,默认的编号是0.
例子:
package 类集; enum color1 { red,black,green } public class test1{ public static void main(String args[]){ for(color1 c:color1.values()){ System.out.println(c.ordinal() + " --> " + c.name()) ; } } }
结果:
0 --> red 1 --> black 2 --> green
如果此时希望做点改进,希望使用文字表示 颜色的信息,则可以按照color类形式,在枚举类中定义属性(也就是name)和构造方法,
但是一旦声明有参数构造之后,在声明枚举对象的时候就必须明确地调用构造方法,并传递参数。
如下:
package 类集; 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 test1{ public static void main(String args[]){ for(Color c:Color.values()){ System.out.println(c.ordinal() + " --> " + c.name() +"(" + c.getName() + ")") ; } } }
返回结果:
0 --> RED(红色) 1 --> GREEN(绿色) 2 --> BLUE(兰色)
如果现在不想通过构造方法设置内容,而想通过getter(),setter()方法设置内容,则必须按照如下方式进行。
package 类集; 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 test1{ public static void main(String args[]){ Color c = Color.BLUE ; // 得到兰色 c.setName("兰色") ; // 名字错误 c.setName("蓝色") ; // 名字正确 System.out.println(c.getName()) ; } }
输出结果:
设置内容错误。
蓝色
以上发现通过构造方法更简便一些。
通过valueof()方法,指定枚举名称来得到枚举常量
static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) 返回带指定名称的指定枚举类型的枚举常量。
可以把上面那段代码主方法里的第一句话给替换掉。如下。
package 类集; 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 test1{ 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接口,所以枚举中内容是可以排序的。
package 类集; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; enum Color{ RED,GREEN,BLUE ; } public class test1{ 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() + "、") ; } } }
输出,
RED、GREEN、BLUE、
可以发现,加入TreeSet的时候是无序的,输出的时候是有序的。
通过TreeSet