网站首页 > 基础教程 正文
概述
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;
}
}
总结
本文主要讲解了枚举的本质,以及枚举的常见用法,希望对你们有帮助。
猜你喜欢
- 2025-06-09 Java开发不可不知的20个技术点(java开发有哪些技术)
- 2025-06-09 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 2025-06-09 一个字符串中到底能有多少个字符?我竟然算错了
- 2025-06-09 JAVA字符串算法——KMP算法(java字符串算法题)
- 2025-06-09 你只会用 SB?试试 StringJoiner,真香
- 2025-06-09 Java基础之String与int两者之间如何相互转换?
- 2025-06-09 Java之String对象深入理解(java中string对象特点)
- 2025-06-09 吊打面试官(十)--Java语言中字符串相关处理一文全掌握
- 2025-06-09 Java Array 和 String 的转换(java array转set)
- 2025-06-09 JAVA面试|String、StringBuffer、StringBuilder区别以及场景应用
- 06-09Socioeconomic growth goals high on meetings' agenda
- 06-09Cities Along Middle Reaches of Yangtze River Agree on 63 Cooperation Items
- 06-09Scientists to make flag flutter on moon
- 06-09CBN丨Foreign-funded institutions bullish on Chinese assets
- 06-09Full Text: Joint Statement between the People's Republic of China and the French Republic on Climate Change on the occasion of the Tenth Anniversary of the Paris Agreement
- 06-092022年底总结,温暖和激励自己的文案
- 06-09百度实时推送代码解决方案(百度实时推送工具)
- 06-09PHP漏洞之跨网站请求伪造(php跨站脚本攻击)
- 最近发表
-
- Socioeconomic growth goals high on meetings' agenda
- Cities Along Middle Reaches of Yangtze River Agree on 63 Cooperation Items
- Scientists to make flag flutter on moon
- CBN丨Foreign-funded institutions bullish on Chinese assets
- Full Text: Joint Statement between the People's Republic of China and the French Republic on Climate Change on the occasion of the Tenth Anniversary of the Paris Agreement
- 2022年底总结,温暖和激励自己的文案
- 百度实时推送代码解决方案(百度实时推送工具)
- PHP漏洞之跨网站请求伪造(php跨站脚本攻击)
- ThinkPHP后台入口地址查找(thinkphp build.php)
- PHP新手如何提高代码质量(php新手如何提高代码质量的方法)
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- queryselectorall (63)
- location.search (79)
- bootstrap教程 (74)
- deletesql (62)
- linuxgzip (68)
- 字符串连接 (73)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)