一、枚举的引入原因

1、定义常量

  在枚举出现之前,如果想要表示一组特定的离散值,往往使用一些常量。

public static final int SEASON_SPRING = 1;
public static final int SEASON_SUMMER = 2;
public static final int SEASON_FALL = 3;
public static final int SEASON_WINTER = 4;

  使用常量会造成类型不安全。若一个方法中要求传入季节这个参数,用常量的话,形参就是 int 类型,开发者传入任意类型的 int 类型值就行,但是如果是枚举类型的话,就只能传入枚举类中包含的对象。

2、手动实现枚举类

  在 Java5 以前需要手动实现枚举类,这样实现枚举类会造成代码臃肿,每个实例化对象也没有独立的方法。如果想实现每个实例对象拥有独立的方法,就必须给每个实例化对象一个唯一的标识,还需要一直维护 characteristic()方法。如:

class SeasonEnumeration {
    private final String seasonName;
    private final String seasonDesc;
    private final int id;
    public static final SeasonEnumeration SPRING = new SeasonEnumeration(1, "春天", "春暖花开");
    public static final SeasonEnumeration SUMMER = new SeasonEnumeration(2, "夏天", "夏日炎炎");
    public static final SeasonEnumeration AUTUMN = new SeasonEnumeration(3, "秋天", "秋高气爽");
    public static final SeasonEnumeration WINTER = new SeasonEnumeration(4, "冬天", "白雪皑皑");

    /**
     * 将构造方法私有不允许外部创建实例化对象
     */
    private SeasonEnumeration(int id, String seasonName, String seasonDesc) {
        this.id = id;
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }

    @Override
    public String toString() {
        return "seasonName='" + seasonName + '\'' + ", seasonDesc='" + seasonDesc + '\'';
    }

    public void characteristic() {
        switch (id) {
            case 1:
                System.out.println("晒太阳");
                break;
            case 2:
                System.out.println("吃雪糕");
                break;
            case 3:
                System.out.println("收粮食");
                break;
            case 4:
                System.out.println("玩雪球");
                break;
            default:
        }
    }
}

public class Test {
    public static void main(String[] args) {
        System.out.println(SeasonEnumeration.SPRING);
        SeasonEnumeration.SPRING.characteristic();
        System.out.println(SeasonEnumeration.SUMMER);
        SeasonEnumeration.SUMMER.characteristic();
        System.out.println(SeasonEnumeration.AUTUMN);
        SeasonEnumeration.AUTUMN.characteristic();
        System.out.println(SeasonEnumeration.WINTER);
        SeasonEnumeration.WINTER.characteristic();
    }
}

二、枚举类的定义

  语法:

public  enum 枚举类名{
	枚举项0,枚举项1,枚举项2,枚举项3..;
}

注意事项:
  ① 所有枚举类都是 Enum 的子类。
  ② 枚举项必须放在第一行,自动添加 public static final 修饰,枚举项就是该枚举类的实例化对象。如果枚举项后面没有东西分号可以省略(建议不要省略)。
  ③ 枚举类也可以有构造方法,但是都自动被 private 修饰。
  ④ 枚举类可以写抽象方法,但是枚举项必须重写。
  ⑤ 枚举项如果调用无参数构造方法,无需加括号。
  ⑥ 枚举类不可以被继承也不可以继承其他类,因为所有枚举类都继承 java.lang.Enum,Java 不支持多继承,但可以实现接口。

三、枚举类的实例

  使用枚举类不仅可以减少代码量,而且还可以在枚举类中定义抽象方法,每个枚举项进行不同的重写。

enum SeasonEnumeration {
    SPRING("春天", "春暖花开") {
        @Override
        public void characteristic() {
            System.out.println("晒太阳");
        }
    },
    SUMMER("夏天", "夏日炎炎") {
        @Override
        public void characteristic() {
            System.out.println("吃雪糕");
        }
    },
    AUTUMN("秋天", "秋高气爽") {
        @Override
        public void characteristic() {
            System.out.println("收粮食");
        }
    },
    WINTER("冬天", "白雪皑皑") {
        @Override
        public void characteristic() {
            System.out.println("玩雪球");
        }
    };
    private final String seasonName;
    private final String seasonDesc;

    SeasonEnumeration(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    @Override
    public String toString() {
        return "seasonName='" + seasonName + '\'' + ", seasonDesc='" + seasonDesc + '\'';
    }

    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }

    public abstract void characteristic();
}

四、枚举类的常用方法

  ① enumType 传入枚举类的 class,name 传入枚举项的名字,返回枚举项的实例对象,没有则抛出IllegalArgumentException异常。

public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)

  ② 隐藏方法,返回该枚举类的所有枚举项。

public static <T extends Enum<T>>[] values()

  ③ 返回此枚举项的名称。

public final String name()

  ④ 返回此枚举项在枚举类中的下标(从 0 开始)。

public final int ordinal()

  ⑤ 返回此枚举项的 Class 对象。

public final Class<E> getDeclaringClass() 

  ⑥ 比较此枚举与指定对象的顺序。

public final int compareTo(E o)

五、使用枚举类代替魔法值


标题:Java中枚举的应用
作者:Yi-Xing
地址:http://47.94.239.232:10014/articles/2019/10/24/1571883525662.html
博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!