概述
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());
}
}
运行结果:
枚举的本质
枚举的本质其实是一个类,继承了java.lang.Enum这个类。我们可以用idea的插件看下生成的字节码如下:
- 继承了java.lang.Enum
- ENABLE、DISABLE最终转换为静态字段,类型其实StatusEnum这个类
- 类加载的时候初始化ENABLE、DISABLE这两个属性。
方法是类加载的初始化阶段就是执行的,它这里的主要逻辑就是创建了两个对象,设置到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;
}
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
JAVA
+关注
关注
19文章
2904浏览量
103001 -
JAVA语言
+关注
关注
0文章
138浏览量
19944
发布评论请先 登录
相关推荐
C语言中枚举的基本概念和常见用法
在C语言中,枚举是一种方便组织和表示一组相关常量的工具。枚举类型有助于提高代码的可读性和可维护性。本文将介绍C语言枚举的基本概念、语法和用法,以及一些高级技巧。
发表于 08-17 15:32
•777次阅读
Java多线程的用法
本文将介绍一下Java多线程的用法。 基础介绍 什么是多线程 指的是在一个进程中同时运行多个线程,每个线程都可以独立执行不同的任务或操作。 与单线程相比,多线程可以提高程序的并发性和响应
java语言的十一大特点你知道吗?
、Java语言是解释型的 如前所述,Java程序在Java平台上被编译为字节码格式,然后可以在实现这个Java平台的任何系统中运行。在运行时
发表于 06-17 09:39
Java中的常用异常处理方法 java推荐
在Java中,异常情况分为Exception(异常)和Error(错误)两大类,Java异常通常是指程序运行过程中出现的非正常情况,如用户输入错误、除数为零、需要处理的文件不存在、数组下标越界等
发表于 01-19 17:26
深入理解java枚举类型enum用法
; StringFRI = Fri; StringSAT = Sat; StringSUN = Sun; } 语法(定义) 创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java
发表于 09-27 11:49
•0次下载
java并发编程实战之辅助类用法
二.CyclicBarrier用法 三.Semaphore用法 若有不正之处请多多谅解,并欢迎批评指正。 一.CountDownLatch用法 CountDownLatch类位于java
发表于 09-27 16:50
•0次下载
Java数组的常用方法_Java:数组工具类Arrays类的常用方法的用法及代码
本文主要详细介绍了Java数组的常用方法以及数组工具类Arrays类的常用方法的用法及代码。
发表于 01-29 10:25
•2733次阅读
浅述C语言中枚举enum的用法
本文举例说明C语言中enum枚举关键字的用法。 用来同时定义多个常量 利用enum定义月份的例子如下。 #includestdio.henum week {Mon=1,Tue,Wed,Thu,Fri
SystemVerilog中枚举类型的使用建议
SystemVerilog中枚举类型虽然属于一种“强类型”,但是枚举类型还是提供了一些“不正经”的用法可以实现一些很常见的功能,本文将示例一些在枚举类型使用过程中的一些“不正经”
如何正确区分Java中super函数用法
Java中super函数有很多方法,在使用的时候我们应该如何正确区分?
2 方法
三种用法:
访问父类的方法。
调用父类构造方法。
访问父类中的隐藏成员变量。
Java枚举的特点及用法
在 Java 枚举出现之前,通常会使用常量类来表示一组固定的常量值,直到Java 1.5之后推出了枚举,那么枚举类型有哪些特点,它比常量类又
java中obj类型的实战用法
类型具有许多实战用法,下面将详细介绍一些常见的使用场景。 作为方法参数和返回值的类型 在Java中,可以使用obj类型作为方法的参数或返回值类型。这种用法可以使方法具有更广泛的适用性,因为obj类型可以接受任何对象作为参数或返回
java switch case值能为枚举值吗
Java中的switch语句可以接受枚举类型的值作为参数。在Java中,枚举是一种特殊的数据类型,它定义了一个固定数量的命名常量。因此,可以将枚举
评论