← 返回首页
JavaSE系列教程(八十四)
发表时间:2020-02-27 15:58:06
讲解枚举类型

1.什么是枚举类型

枚举其实就是特殊的常量类, 且构造方法被默认和强制是私有。

java.lang.Enum是在JDK1.5定义的. 定义为:

pubulic abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable{...}

枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是默认继承Object类,因此枚举类不能显示继承其他父类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口。

关于enum与Enum的区别可以简单总结以下两点: 1).enum 是一个关键字,Enum是一个抽象类 2).用enum关键字定义的枚举类就相当于继承了Enum抽象类.

根据编程规范,枚举类型成员名称需要全大写, 多个单词组成的,中间使用下划线隔开。

例如:定义一个颜色枚举类型。

public enum Colors {
    RED,GRENN,BLUE,BLACK,WHITE;
}

2.枚举类型的使用

在switch-case语句中经常会判断枚举类型变量。 例如:

public enum Colors {

    RED,GREEN,BLUE,BLACK,WHITE;
}

public class EnumerationDemo {

    public static void main(String[] args) {

        Colors color1 = Colors.BLUE;

        switch (color1) {
            case RED:
                System.out.println("颜色是红色");
                break;
            case GREEN:
                System.out.println("颜色是绿色");
                break;
            case BLUE:
                System.out.println("颜色是蓝色");
                break;
            case BLACK:
                System.out.println("颜色是黑色");
                break;
            case WHITE:
                System.out.println("颜色是白色");
                break;
            default:
                System.out.println("其它颜色");
                break;

        }

    }
}

运行结果:
颜色是蓝色

也可以使用Enum 来声明枚举类型变量,上面例子改写如下:

public enum Colors {

    RED,GREEN,BLUE,BLACK,WHITE;
}

public class EnumerationDemo {

    public static void main(String[] args) {

        Enum color1 = Colors.BLUE;

        if(color1 == Colors.RED){
            System.out.println("颜色是红色");
        }else if(color1 == Colors.GREEN){
            System.out.println("颜色是绿色");
        }else if(color1 == Colors.BLUE){
            System.out.println("颜色是蓝色");
        }else if(color1 == Colors.BLACK){
            System.out.println("颜色是黑色");
        }else if(color1== Colors.WHITE){
            System.out.println("颜色是白色");
        }else{
            System.out.println("其它颜色");
        }

    }
}

运行结果:
颜色是蓝色

注意:枚举类型中定义的每一个枚举成员,都可以理解为一个静态的常量对象。 例如:RED 等同于 public static final Color red = new Color(0); 而且每一个枚举类型成员都有一个整型编号,默认从0开始。比如:RED=0,GREEN=1,BLUE=2. 可以使用ordinal()获取编号。

通过代码测试如下:

public enum Colors {

    RED,GREEN,BLUE,BLACK,WHITE;
}

public class EnumerationDemo {

    public static void main(String[] args) {

        Colors color1 = Colors.RED;
        Colors color2 = Colors.WHITE;
        System.out.println(color1.ordinal());
        System.out.println(color2.ordinal());

    }
}

运行结果:
0
4

3.自定新的构造方法

枚举类型也可以自定义新的构造方法,但是所有构造方法默认都是使用private修饰,离开本类是无法实例化的。

例如:

public enum Colors {

    RED(1,"红色"),
    GREEN(2,"绿色"),
    BLUE(3,"蓝色"),
    BLACK(4,"黑色"),
    WHITE(5,"白色");

    Colors(int flag,String name){
        this.flag = flag;
        this.name = name;
    }

    private int flag;
    private String name;

    public int getFlag() {
        return flag;
    }

    public String getName() {
        return name;
    }

}

public class EnumerationDemo {

    public static void main(String[] args) {

        //Colors color = new Colors(10,"灰色");//错误,枚举类型构造方法都是私有,不能实例化。
        Colors color1 = Colors.RED;

        System.out.println(color1.getFlag());
        System.out.println(color1.getName());

    }
}

运行结果:
1
红色

4.使用枚举实现单例

实例:

class SingletonObject{

}

public enum  SingletonFactory {

    INSTANCE;

    private SingletonObject instance;
    SingletonFactory() {
        instance = new SingletonObject();
    }
    public SingletonObject getInstance() {
        return instance;
    }
}

public class SingletonObjectDemo {

    public static void main(String[] args) {

        SingletonObject obj1 = SingletonFactory.INSTANCE.getInstance();
        SingletonObject obj2 = SingletonFactory.INSTANCE.getInstance();

        System.out.println(obj1 == obj2);
    }
}

运行结果:
true