一些程序在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,jdk5以前采用自定义类来解决,jdk5以后可以直接采用枚举来解决

枚举的特性

1、枚举是一种特殊形式的java类
2、枚举类中声明的每一个枚举值代表枚举类的一个实例对象
3、与java中的普通类一样,在声明枚举;类时,也可以声明属性、方法和构造函数,但枚举类的构造函数必须为私有的
4、枚举类也可以实现接口或继承抽象类
5、jdk5中扩展了switch语句,它除了可以接收int,byte,char,short外,还可以接收一个枚举类型

用法一:常量

在jdk1.5之前,我们定义常量都是:public static final….。jdk1.5出现以后,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。

enum Grade{   //Class  
    A,B,C,D;  //Object
}

用法二:switch

jdk1.6之前的switch语句只支持int,byte,char,short,enum类型。

enum Grade{
    A,B,C,D;
}

public class Demo{
    Grade grade=Grade.A;
    public void test(){
        switch(grade){
        case A:
            grade=Grade.A;
            break;
        case B:
            grade=Grade.B;
            break;
        case C:
            grade=Grade.C;
            break;
        case D:
            grade=Grade.D;
            break;
        }
    }
}

用法三:向枚举中添加新方法

如果打算定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且java要求必须先定义enum实例。

enum Grade{
    A("100-80"),B("79-70"),C("69-60"),D("59-0");
    //成员变量
    private String value;//封装每个对象对应的分数

    //构造方法
    public Grade(String value){
        this.value=value;
    }

    //普通方法
    public static String getName(int index){
        for(Grade g:Grade.values()){
            if(g.getValue()==value){
                return g.value;
            }
        }
        return null;
    }

    //get set方法
    public String getValue(){
        return this.value;
    }
    public void setValue(){
        this.value=value;
    }
}

用法四:覆盖枚举的方法

下面是一个toString()方法覆盖的例子

public class Demo{
    enum Grade{
        A("100-80"),B("79-70"),C("69-60"),D("59-0");
        //成员变量
        private String value;

        //构造方法
        private Grade(String name){
            this.value=value;
        }

        //覆盖方法
        @Override
        public String toString(){
            return this.value;
        }
    }

    public static void main(String[] args){
        System.out.println(Grade.A.toString());
    }
}

用法五:实现接口

所有的枚举都继承自java.lang.Enum类。由于java不支持多继承,所以枚举对象不能再继承其他类。

public interface Behaviour {
        void print();

        String getInfo();
    }

    public enum Grade implements Behaviour {
        A("100-80"),B("79-70"),C("69-60"),D("59-0");;
        // 成员变量
        private String value;

        // 构造方法
        private Grade(String value) {
            this.value= value;
        }

        // 接口方法
        @Override
        public String getInfo() {
            return this.value;
        }

        // 接口方法
        @Override
        public void print() {
            System.out.println(this.value);
        }
    }

用法六:使用接口组织枚举

public interface Food {
        enum Coffee implements Food {
            BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO
        }

        enum Dessert implements Food {
            FRUIT, CAKE, GELATO
        }
    }

用法七:

java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的key是enum类型,而value则可以是任意类型,具体可以参考JDK API文档。

枚举和常量定义的区别

1、通常定义常量的方法
通常利用public final static方法定义的代码如下,分别用1表示A,2表示B,3表示C。

public class Grade{
    /*A*/
    public final static int A = 1;

    /*B*/
    public final static int B = 2;

    /*c*/
    public final static int c = 3;
}

2、枚举类型定义常量方法
枚举类型的简单定义方法如下:

enum Grade{
    A,B,C;
}