JAVA enum 枚举

提出问题

当变量的值是 红灯 时,打印 红灯停;值是 绿灯 时,打印 绿灯行;值是 黄灯 时,打印 黄灯警示

实现:

public static void main(String args[]) {
    String color = "红灯";
    if( "红灯".equals( color ) ){
        System.out.println("红灯停");
    }else if( "绿灯".equals( color ) ){
        System.out.println("绿灯行");
    }else{
        System.out.println("黄灯警示!");
    }
}

缺点

变量 color 可以是 不合理的值,如:

String color = "白灯";

或者

String color = "李雷";

解决

使用枚举

概述

枚举是一组 固定的可选值

jdk1.5开始添加了枚举数据类型

在Java中,被 enum 关键字修饰的类型就是枚举类型

enum 的全称为 enumeration

应用场景

作为类型,如:

  • 限制变量值只能是 星期一、星期二、星期三、星期四、星期五、星期六、星期日,是固定的,只能选择之一

  • 限制变量值只能是 交通灯的 红、绿、黄,是固定的,只能选择之一

好处

可以做 校验,当传入其他值时,会报错

常用方法

在enum中,提供了一些基本方法:

  • values():静态方法,返回 enum 实例的数组,而且该数组中的元素严格保持在 enum 中声明时的顺序。

  • name():返回实例名。

  • ordinal():返回实例声明时的次序,从0开始。

  • getDeclaringClass():返回实例所属的 enum 类型。

  • equals() :判断是否为同一个对象。

可以使用 == 来比较enum实例。

此外,java.lang.Enum 实现了 Comparable 和 Serializable 接口,所以也提供 compareTo() 方法。

例子

1. 简单使用

定义枚举,红绿黄灯:


public enum Color {
    RED,
    GREEN,
    BLUE;
}

使用:

public static void main(String args[]) {
    Color color = Color.RED; // 只能是枚举成员,不能是其他值
    if(color == Color.RED){
        System.out.println("红灯停");
    }else if(color == Color.GREEN){
        System.out.println("绿灯行");
    }else{
        System.out.println("黄灯警示!");
    }
}

遍历枚举:

public static void main2(String args[]) {
    for (Color c : Color.values()) {
        System.out.println(c + " : " + c.ordinal());
    }

}

2. 设置值

public enum Dir {

    E("东方"),S("南方"),W("西方"),N("北方");
    String name = "";
    Dir(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
}

public class TestDir {

    public static void main(String[] args) {
        Dir dir = Dir.E;
        switch (dir) {
            case E:
                System.out.println(dir.getName());
                break;
            case S:
                System.out.println(dir.getName());
                break;
            case W:
                System.out.println(dir.getName());
                break;
            case N:
                System.out.println(dir.getName());
                break;
            default:
                break;
        }
    }

}

注意事项:

  1. 枚举类型的第一行有效代码必须是声明的枚举
  2. 枚举应用曾经只应用到TestDir类中的内容,重新构造方法,声明属性等都是出现在考题中

原文出处:/show_1EF4seWyx2Pd.html