枚举enum的特性

深入学习Java基础知识
2021-05-17 14:29 · 阅读时长4分钟
小课

枚举可以看作中特殊的类,经常用于表示一组固定大小的常量,但是它的功能可比常量强大多了,因为枚举是根据面向对象的思维设计的,它具备大部分面向对象的优点,下面就看看枚举有那些特性。

首先看一个简单的枚举类型,在编译前后有什么不同,编译之前的源码如下

public enum CourseType {
    Math, Art
}

编译之后使用javap命令查看结果如下

public final class CourseType extends java.lang.Enum<CourseType> {
  public static final CourseType Math;
  public static final CourseType Art;
  private static final CourseType[] $VALUES;
  public static CourseType[] values();
  public static CourseType valueOf(java.lang.String);
  private CourseType();
  static {};
}

通过上面的示例,我们可以得出以下几点。

  1. 实际上枚举类型也是一个类,并且默认继承java.lang.Enum类,所以枚举类型不能再继承其它类。
  2. 枚举类型的构造方法是private修饰,外部无法实例化,实际上就算在枚举内部开发者也是不能自己实例化。
  3. 枚举类型的常量是public static final修饰,开发者不能对枚举常量进行重新赋值。

除了以上提到的几点外,枚举类型还有这些特性。

4、枚举类型可以实现接口,比如上面示例中的CourseType枚举类型,我们可以让它实现Runnable接口。

public enum CourseType implements Runnable {

    Math, Art;

    @Override
    public void run() { }
}

我们还可以让某个枚举变量单独实现接口定义的方法。

1public enum CourseType implements Runnable {
2
3    Math {
4        @Override
5        public void run() { }
6    },
7    Art {
8        @Override
9        public void run() { }
10    }
11}

5、自定义构造方法和普通方法和成员变量,和普通类一样,还可以重写父类方法,还有一点比较特别的是枚举类型可以定义抽象方法让枚举常量来实现。

1public enum CourseType {
2
3    Math("数学") {
4        @Override
5        public void showDetail() { }
6    },
7    Art("艺术") {
8        @Override
9        public void showDetail() { }
10    };
11
12    public int priority;
13    public String displayName;
14
15    CourseType(String displayName) {
16        this(displayName, 0);
17    }
18
19    CourseType(String displayName, int priority) {
20        this.displayName = displayName;
21        this.priority = priority;
22    }
23
24    public void showDisplayName() {
25        System.out.println("displayName: " + displayName);
26    }
27
28    @Override
29    public String toString() {
30        return "displayName: " + displayName + ", priority: " + priority;
31    }
32
33    public abstract void showDetail();
34}

另外枚举类型可以用来实现单例模式,因为枚举类型的构造方法是私有的,开发者无法实例化,而且还可以保证线程安全。

public enum Singleton {
    INSTANCE;

    public void doSomething() {
        
    }
}
enum枚举