Java枚举你真的会用吗

简介: Java枚举你真的会用吗

概述


Java中枚举,大家在项目中经常使用吧,主要用来定义一些固定值,在一个有限的集合内,比如在表示一周的某一天,一年中的四季等。那你了解枚举的本质吗?了解枚举的一些常见用法吗?


枚举介绍和使用


枚举主要用来定义一个有限集合内的固定值。

枚举定义方式如下:

// 简单的定义
enum WeekEnum {
    MONDAY, TUESDAY
}
// 有属性的定义
enum StatusEnum {
    ENABLE("1", "启用"), DISABLE("0", "禁用");
    private String code;
    private String name;
    StatusEnum(String code, String name) {
        this.code = code;
        this.name = name;
    }
}

枚举编译后实际上继承了java.lang.Enum这个类,后面详细讲解,我们看下这个类的关键方法:

  • static Enum valueOf(Class enumClass, String name)

返回指定名字、给定类的枚举常量

  • String toString()

返回枚举常量名

  • int ordinal()

返回枚举常量在enum中的位置,从0开始

  • int compareTo(E other)

如果枚举场景出现在other之前,则返回一个负值,如果this == other,则返回0,否则返回正值。

public static void main(String[] args) {
        // 根据字符串获取枚举
        StatusEnum enable = Enum.valueOf(StatusEnum.class, "ENABLE");
        System.out.println(enable);
        //枚举比较直接用==
        System.out.println(enable == StatusEnum.ENABLE);
        // values方法获取所有的枚举
        StatusEnum[] values = StatusEnum.values();
        for (StatusEnum statusEnum : values) {
            // 打印枚举的位置
            System.out.println(statusEnum.ordinal());
        }
    }

运行结果:

1671186744774.jpg


枚举的本质


枚举的本质其实一个类,继承了java.lang.Enum这个类。我们可以用idea的插件看下生成的字节码如下:

  1. 继承了java.lang.Enum

1671186753428.jpg

  1. ENABLE、DISABLE最终转换为静态字段,类型其实StatusEnum这个类

1671186759782.jpg

  1. 类加载的时候初始化ENABLE、DISABLE这两个属性。

1671186765605.jpg

方法是类加载的初始化阶段就是执行的,它这里的主要逻辑就是创建了两个对象,设置到ENABLE,DISABLE上。

这下你明白枚举是怎么一会事情了吧。


枚举常见用途


枚举创建单例


枚举可以作为单例模式的最佳方式,能够保证单例对象的唯一性。

public class User {
    //私有化构造函数
    private User(){ }
    //定义一个静态枚举类
    static enum SingletonEnum{
        //创建一个枚举对象,该对象天生为单例
        INSTANCE;
        private User user;
        //私有化枚举的构造函数
        private SingletonEnum(){
            user = new User();
        }
        public User getInstnce(){
            return user;
        }
    }
    //对外暴露一个获取User对象的静态方法
    public static User getInstance(){
        return SingletonEnum.INSTANCE.getInstnce();
    }
}
  • 枚举INSTANCE会在类加载初始化的时候创建,而Java类的加载和初始化过程都是线程安全的。
  • 枚举可避免反序列化破坏单例。


枚举抽象方法


枚举类可以定义抽象方法,然后让各个具体的枚举实现,可以通过枚举实现不同的策略实现。

enum OperEnum {
    ADD(1, 2) {
        @Override
        public Integer operate() {
            return this.getA() + this.getB();
        }
    }, MULTIPY(1, 2) {
        @Override
        public Integer operate() {
            return this.getA() * this.getB();
        }
    };
    private Integer a;
    private Integer b;
    OperEnum(Integer a, Integer b) {
        this.a = a;
        this.b = b;
    }
    public abstract Integer operate();
    public Integer getA() {
        return a;
    }
    public void setA(Integer a) {
        this.a = a;
    }
    public Integer getB() {
        return b;
    }
    public void setB(Integer b) {
        this.b = b;
    }
}


总结


本文主要讲解了枚举的本质,以及枚举的常见用法,希望对你们有帮助。

目录
相关文章
|
2月前
|
安全 Java
Java 枚举(Enums)解析:提高代码可读性与易维护性
在 Java 中,实现抽象的另一种方式是使用接口。 接口定义 接口是一个完全抽象的类,用于将具有空方法体的相关方法分组:
93 1
|
2月前
|
Java
java枚举的使用
java枚举的使用
34 0
|
2月前
|
安全 Java 程序员
Java语言枚举(Enum)的深入探索
Java语言枚举(Enum)的深入探索
|
1月前
|
安全 Java 编译器
Java基础14-深入理解Java枚举类(二)
Java基础14-深入理解Java枚举类(二)
13 4
|
1月前
|
Java 编译器
31. 【Java教程】枚举类
31. 【Java教程】枚举类
16 1
|
20天前
|
Java
java编写枚举校验类
java编写枚举校验类
11 0
|
1月前
|
安全 Java
Java 对象创建与使用:你真的会用吗?
【6月更文挑战第15天】在Java中,对象创建涉及`new`关键字和构造器,用于初始化。使用对象时注重属性和方法的访问,遵循命名规范。关注对象生命周期,避免过度创建,如在循环内,以减少内存消耗和提高性能。还要考虑线程安全,尤其在多线程环境下,确保正确同步以防止数据不一致。通过优化对象的创建与使用,提升代码效率和可靠性。
|
1月前
|
安全 Java
比较java枚举成员使用equal还是==
比较java枚举成员使用equal还是==
13 0
|
1月前
|
Java 编译器
Java基础14-深入理解Java枚举类(一)
Java基础14-深入理解Java枚举类(一)
20 0
|
2月前
|
存储 算法 Java
滚雪球学Java(20):Java泛型与枚举:提升代码灵活性与可读性
【4月更文挑战第9天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
37 1
滚雪球学Java(20):Java泛型与枚举:提升代码灵活性与可读性