【Java】深入了解枚举类的来源和本质

fe4ab3c3-aea7-42e2-84a1-455ff77fc9e9.jpeg

一、什么是枚举类

1.概念

枚举的意思就是一个一个地列举出来。
枚举类就是起到了把对象一个一个列举出来的作用,枚举类是java5中提出的新概念,但是到现在也有很多人不懂这个枚举类,这些人也包括我,以下是我对枚举类的学习总结。

2.为什么会有枚举类

枚举类出现之前

列举对象一般都是使用static和final来实现的

package model;

public class Person{
    public static final Person a=new Person("a");
    public static final Person b=new Person("b");
    private String name;
    private Person(String name){
        this.name=name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

复制代码

如果每次列举一个对象都要去创建一个staticfinal对象,这就很麻烦,所以枚举类就诞生了。

枚举类出现之后

package model;

/**
 * @author xxj
 * 枚举类
 */
public enum  EnumPerson {
    A("A"),B("B");
    private String name;
    EnumPerson(String name){
        this.name=name;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
复制代码

使用枚举类就不用再去一个个地敲static final了。

3.什么地方需要使用枚举类

  1. 在需要列举一下固定的对象
  2. 单例模式也可以使用。

4.使用枚举类的优缺点

优点

  1. 创建对象方便。省去了创建对象的代码,这些都已经是规定好的了。
  2. 便于管理。全部静态对象都在枚举类中,直接在枚举类里修改即可。

缺点

  1. 需要有语法基础
  2. 初始化缓慢。静态区的数据是在类加载的时候,就会去创建的。

二、枚举类的使用

1.语法

  1. 需要将class换成enum
  2. 枚举类的成员不能使用修饰符
  3. 枚举类的成员后面可以直接接构造方法的参数
  4. 枚举类的构造方法不能是public
  5. 枚举类不能继承和被继承,但是可以实现接口

2.代码

这就直接看上面的,枚举类出现之后的代码了。

三、枚举类的实现

1.原理

其实,枚举类跟普通的类是没有任何区别的,只不过编译器会自动地识别enum这个标识符,然后把它转换成一个class

2.枚举类的字节码

让我们看一下,我们刚刚编写的枚举类的字节码是怎么样的

public final enum model/EnumPerson extends java/lang/Enum {
  // compiled from: EnumPerson.java
  // access flags 0x4019
  public final static enum Lmodel/EnumPerson; A
  // access flags 0x4019
  public final static enum Lmodel/EnumPerson; B
复制代码

通过idea的view->show bytecode就可以看到了
我这里就只截取了开头的一部分内容,可以看出这里默认继承了一个Enum类,而且还有final标识符,这就是为什么枚举类不能继承和被继承的原因了。
而我们创建的两个对象就自动改成了public final static···一长串标识符声明的对象,这不就跟在没有出现枚举类之前的代码差不多嘛。

四、总结

枚举类本质上和普通的class一样,只不过java帮我们做了封装。(跟语法糖的概念差不多)而,枚举类中的对象都是枚举类的实现
在需要一开始就创建而且不会再改变一系列对象时,就可以使用枚举类。
语法

  1. 需要将class换成enum
  2. 枚举类的成员不能使用修饰符
  3. 枚举类的成员后面可以直接接构造方法的参数
  4. 枚举类的构造方法不能是public
  5. 枚举类不能继承和被继承,但是可以实现接口

——————————————————————————————

你知道的越多,不知道的越多。

如果本文章内容有问题,请直接评论或者私信我。如果觉我得写的还不错的话,点个赞也是对我的支持哦

未经允许,不得转载!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享