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

 

posted @ 2017-01-08 01:12  美好的明天  阅读(515)  评论(0编辑  收藏  举报