java枚举类的定义,使用,本质

Java面向对象(高级)-- 枚举类的使用 阅读详情

关于枚举类

参考反编译那些事儿(二)—枚举的反编译
Java枚举类,你真的了解吗?

定义枚举类
public enum ResultCode {

    /** 有没有发现写枚举类的这一部分就像是在调用构造方法 */
    SUCCESS(1, "成功"),
    PARAM_IS_INVALID(10001, "参数无效"),
    PARAM_IS_BLANK(10002, "参数为空"),
    PARAM_TYPE_BIND_ERROR(10003, "参数类型错误"),
    PARAM_NOT_COMPLETE(10004, "参数缺失"),
    //上面的逗号可去可不去, 并不会导致编译错误
    ;

    private Integer code;

    private String message;

    //构造函数默认并且必须是private
    ResultCode(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public Integer code() {
        return this.code;
    }

    public String message() {
        return this.message;
    }
}
枚举类的使用

所有的枚举类在编译之后会自动继承enum类, 并且会自动生成一个values()方法

//只放出部分常见代码
public abstract class Enum<E extends Enum<E>>
        implements Comparable<E>, Serializable {

	/**
	实例的名字, 类型为字符串
	即ResultCode.SUCCESS为SUCCESS, ResultCode.PARAM_IS_INVALID为PARAM_IS_INVALID
	*/
    private final String name;

    public final String name() {
        return name;
    }

	/**
	实例的索引, 从0开始
	即ResultCode.SUCCESS.ordinal()为0, ResultCode.PARAM_IS_INVALID.ordinal()为1
	*/
    private final int ordinal;

    public final int ordinal() {
        return ordinal;
    }
    //toString方法与name()一样
    public String toString() {
        return name;
    }
	//判断两个枚举实例是否一样, 注意这里使用的是==, 直接比引用, 说明枚举类的实例是单例的
    public final boolean equals(Object other) {
        return this==other;
    }
    /**
    比较两个枚举实例的索引详见, 返回的int
    上面我们知道ResultCode.SUCCESS.ordinal()为0, ResultCode.PARAM_IS_INVALID.ordinal()为1
    所以ResultCode.SUCCESS.compareTo(ResultCode.PARAM_IS_INVALID)为0-1=-1
    */
    public final int compareTo(E o) {
		//略去实现代码
    }
}

验证:

//ResultCode.values()会返回ResultCode这个枚举类的所有实例, 类型为ResultCode[]
for (ResultCode resultCode : ResultCode.values()) {
            System.out.println(resultCode.name());
            System.out.println(resultCode.ordinal());
            System.out.println(resultCode.compareTo(ResultCode.SUCCESS));
}
//ResultCode.valueOf()会返回name与参数相等的枚举实例
ResultCode SUCCESS = ResultCode.valueOf("SUCCESS");
System.out.println(SUCCESS.equals(ResultCode.SUCCESS));   //输出为true
枚举类中定义抽象方法
/**
 * 枚举类可以有抽象方法,但是必须在它的实例中实现
 */
public enum AbstractWeek {

    MONDAY(0,"星期一") {
        @Override
        public AbstractWeek getNextDay() {
            return TUESDAY;
        }
    }, TUESDAY(1,"星期二") {
        @Override
        public AbstractWeek getNextDay() {
            return WEDNESDAY;
        }
    }, WEDNESDAY(2,"星期三") {
        @Override
        public AbstractWeek getNextDay() {
            return THURSDAY;
        }
    }, THURSDAY(3,"星期四") {
        @Override
        public AbstractWeek getNextDay() {
            return FRIDAY;
        }
    }, FRIDAY(4,"星期五") {
        @Override
        public AbstractWeek getNextDay() {
            return SATURDAY;
        }
    }, SATURDAY(5,"星期六") {
        @Override
        public AbstractWeek getNextDay() {
            return SUNDAY;
        }
    }, SUNDAY(6,"星期日") {
        @Override
        public AbstractWeek getNextDay() {
            return MONDAY;
        }
    };

    private int num;
    private String desc;

    AbstractWeek(int num,String desc) {
        this.num = num;
        this.desc=desc;
    }

    //一个抽象方法
    public abstract AbstractWeek getNextDay();
}
反编译与语法糖
public enum Weather {
	
	Sunny(1, "晴天") {
		@Override
		public String test() {
			return "今天阳光明媚!!!\n";
		}
	},
	Rainy(2, "雨天") {
		@Override
		public String test() {
			return "出门别忘带把雨伞哦!!!\n";
		}
	},
	Cloudy(3, "多云") {
		@Override
		public String test() {
			return "别出去登高望远了,你看不远的,呵呵呵!!!\n";
		}
	};
 
	private int value;
	private String label;
 
	private Weather(int value, String label) {
		this.value = value;
		this.label = label;
	}
 
	public int getValue() {
		return value;
	}
 
	public String getLabel() {
		return label;
	}
 
	public abstract String test();

}

我们将上述代码进行反编译:

import java.io.PrintStream;
import java.util.*;
 
//枚举类继承了Enum, 所以我们在定义的时候不能再继承其他的类了
//非抽象枚举类默认是final的, 所以不要去继承非抽象的枚举类
public abstract class Weather extends Enum {
 
    //这里s表示name, i表示ordinal
    //构造函数为私有的
	private Weather(String s, int i, int value, String label) {
		super(s, i);
		this.value = value;
		this.label = label;
	}
 
	public int getValue() {
		return value;
	}
 
	public String getLabel() {
		return label;
	}
 
    //我们自己定义的抽象方法
	public abstract String test();

 	//values()返回所有枚举类的实例
	public static Weather[] values() {
		Weather aweather[];
		int i;
		Weather aweather1[];
		System.arraycopy(aweather = ENUM$VALUES, 0, aweather1 = new Weather[i = aweather.length], 0, i);
		return aweather1;
	}
 
	public static Weather valueOf(String s) {
		return (Weather) Enum.valueOf(Weather, s);
	}
 
	Weather(String s, int i, int j, String s1, Weather weather) {
		this(s, i, j, s1);
	}
 
    //这是我们所定义的枚举类实例, 这也是为什么我们在定义枚举类的时候就像是在调用构造函数
    //每一个变量都是public static final
	public static final Weather Sunny;
	public static final Weather Rainy;
	public static final Weather Cloudy;
    
	private int value;
	private String label;
    
	private static final Weather ENUM$VALUES[];
 
	static {
		Sunny = new Weather("Sunny", 0, 1, "\u6674\u5929") {
			public String test() {
				return "\u4ECA\u5929\u9633\u5149\u660E\u5A9A\uFF01\uFF01\uFF01\n";
			}
		};
		Rainy = new Weather("Rainy", 1, 2, "\u96E8\u5929") {
			public String test() {
				return "\u51FA\u95E8\u522B\u5FD8\u5E26\u628A\u96E8\u4F1E\u54E6\uFF01\uFF01\uFF01\n";
			}
		};
		Cloudy = new Weather("Cloudy", 2, 3, "\u591A\u4E91") {
			public String test() {
				return "\u522B\u51FA\u53BB\u767B\u9AD8\u671B\u8FDC\u4E86\uFF0C\u4F60\u770B\u4E0D\u8FDC\u7684\uFF0C\u5475\u5475\u5475\uFF01\uFF01\uFF01\n";
			}
		};
		ENUM$VALUES = (new Weather[] { Sunny, Rainy, Cloudy });
	}
}

从上述我们可以看出, 枚举类的实现还是普通的java类, 只不过这个java类的构造函数是私有的, 而且实例的个数是有限个的, 当这个枚举类的实例个数只有一个的时候, 这个类就变成了单例模式了.

基于Landsat-8数据的山西省吕梁市地表温度反演研究过程(大气校正法) 1.数据下载:本实验采用的数据是 ①从地理空间数据云下载的来自landsat8 卫星,云量<=1%,时间为2017年5月12日的山西省吕梁市影像数据。为全面覆盖吕梁市,选用了两片影像。 ②吕梁市边界矢量图 2.数据预处理 ... 阅读详情

相关推荐

论文精读-ReTransformer ReRAM-based Processing-in-MemoryArchitecture for Transformer Acceleration

Transformer已经成为一种流行的深度神经网络(DNN)模型,用于神经语言处理(NLP)应用,并在神经机器翻译、实体识别等方面表现出优异的性能。然而,其在自回归解码器中的规模化点积注意机制在推理过程中带来了性能瓶颈。Transformer也是计算和内存密集型的,需要硬件加速解决方案。

a284365的博客 1922

java枚举invalid,为枚举参数生成的API无效

swagger: "2.0"...- in: "body"name: "sortName"required: falseschema:type: "string"...基于以下Java代码:@ApiOperation(httpMethod = "GET",value = "Selecting a set of default templates",response = GalleryTemplat...

weixin_33394460的博客 425

(遇到问题)(已解决)word敲入的公式转化为mathtype

https://www.mathtype.cn/wenti/wordgongshi-zhuanhuan.html 现在越来越多的人在文档中编辑公式的时候会选择MathType来编辑,因为它包含有众多的数学符号和模板,编辑公式时非常方便。但是也有一些人在编辑公式时没有使用MathType公式编辑器,直接使用Word中自带的公式编辑器来编辑的。当我们需要要共享一份文件的时候,这种用自带公式编辑器编辑出来的文件,在我们安装有MathType公式编辑器的电脑里打开时,双击公式没有反应,是无法对它们进行修改的.

计算机视觉 1万+

html自定义状态码,ResultCode 自定义错误状态码

public class ResultCode {// 成功状态码public static final int SUCCESS = 1;// -------------------失败状态码----------------------// 参数错误public static final int PARAMS_IS_NULL = 10001;// 参数为空public static final i...

weixin_29479879的博客 812

S4HANA - Cost Elements成本要素

SAP这里面的配置逻辑很像,就是先建一个对象,然后不停给这个对象附加一些属性,给一个账户附加编号范围,附加账户组。所有模块的维度都在这个表里,看下图的GL,CO,COPA,AA,ML的都在ACDOCA里。要把这5个类型和六大要素对应,先得把六大要素和账户类型对应下(以下是个人理解,不知道对错):当然那个C是新来的,我觉得放在资产下面也行,就不画图了。S4的嵌入式分析是在业务逻辑都整套嵌入的情况下,预开发了数据模型,所以它能提供的就不仅是原始数据了,它能提供的是包含所有相关联的上下文的信息数据。

weixin_45689053的博客 2394

FCTA/FCTB 前方交通穿行预警/制动系统技术规范

FCTA&FCTB前方交叉路口预警制动系统是针对十字路口和停车场等"鬼探头"场景设计的驾驶辅助系统。系统在自车速度0-40km/h范围内工作,通过角雷达和摄像头检测侧向来车.

未知艺术家的博客 739

Java中枚举的定义

java中关于枚举的定义: 枚举是一种引用数据类型 枚举类型怎么定义: enum 枚举名 { } 结果只有两种情况的,建议使用boolean类型。 结果超过两种,并且还是可以一枚一枚列举出来的,建议使用枚举。 枚举里面的值可以看成常量,值是枚举类型。 名称全部大写,单词以“_”隔开。 各个枚举值之间用“,”隔开,最后一个枚举值后面逗号可有可无。 测试代码: public class Test01 { public static void main(String[] args) { i

pipizhen_的博客 1万+

Claude桌面端安装失败?Retrying无限重试终极解决方案(亲测有效)

Claude桌面端安装卡在Retrying并非网络问题,而是安装器下载源异常导致。本文提供已验证方案:一条命令即可解决问题🚀

XiaoqiangClub的博客 2335

Java项目中枚举定义以及使用

最近写新项目!有很多数据字典常量需要定义和使用、就顺便记录一下、什么是枚举类呢?就是用enum修饰是一种Java特殊的类,枚举是class、底层是继承了java.lang.Enum类的实体类、使用枚举可以很方便的定义数据常量、方便清晰我们使用下面就举例说明一下吧1)出于类型安全考虑,没用枚举类之前,常用静态常量来表示。 比如对于性别的表示: 这种性别定义实际上是一个整数数据类型。首先,这些变量可用于加减运算。当然我们很少这样干 第二,含义不明确。我们调试的时候,最初将“男”输出到,结果为1。因此,我们必

Moonxiyue的博客 2195

搞懂 SAPUI5 Fiori 应用的 OData 授权维护:从 IWSG、IWSV 到 S_SERVICE 的完整实践

本文探讨了SAP Fiori项目中常见的授权问题及其解决方案。文章指出,开发人员常误将OData服务访问问题归咎于前端代码或配置,而实际上多因授权默认值未正确带入角色所致。详细分析了IWSG(前端服务组元数据)和IWSV(后端业务服务)两个关键对象的作用机制,强调应通过PFCG角色的Authorization Default入口维护服务对象,而非直接修改S_SERVICE授权对象。文章还提供了前后端授权配置的具体操作步骤,并特别提醒需同时配置前端和后端授权,才能确保应用完整可用性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 206

【AI Agent系列】【阿里AgentScope框架】深入源码:Msg是如何转变成模型需要的Prompt形式的?多模态Prompt如何构建?

前面咱们学习AgentScope,在使用Agent来对话时,输入为一个 Msg 对象,不能是字符串,然后在Agent内部,会将Msg对象转换为模型接受的Prompt。那 AgentScope 如何根据 Msg 形成相应模型接收的Prompt结构的?如何使用 Msg 带入更多的参数,传递给大模型呢?

同学小张的博客 1534

Java实现枚举通过Code获取相应的Value值

Java实现枚举通过Code获取相应的Value值

一恍过去 3万+

康耐视visionpro-CogBlobTool工具详细说明

康耐视visionpro-CogBlobTool工具详细说明

视觉人机器视觉的博客 1726

Java中的枚举类(Enumeration)是什么(定义、实例)?为什么要用?深度剖析一下枚举类本质

枚举类从初始到深剖

m0_63553261的博客 1188

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java的枚举类

私有化类的构造器,保证不能在类的外部创建其对象在类的内部创建枚举类的实例。,对外暴露这些常量对象// 声明当前类的对象的实例变量// 私有化类的构造器// 提供实例变量的get方法// 创建当前类的实例public static final Season spring = new Season("春天", "春暖花开");public static final Season summer = new Season("夏天", "夏日炎炎");

2302_81034736的博客 1430

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

enum枚举类,java中枚举类的概念,什么是枚举类enum,结合实战案例理解

enum、java

zhangfuping123456789的博客 1万+

Java enum 枚举类

如果针对于某个类,其实例是确定个数,则推荐将此类声明为枚举类。如果枚举类的实例只有一个,则可以看作时单例的实现方式。

qq_35899077的博客 1415

Java中的枚举类

一.枚举类型相当于特殊的类,经过编译之后同样产生一个class文件。枚举类型中可以定义方法(包括构造 方法)、属性、静态的方法和属性、继承接口、重载覆盖等,类似于class。 Java枚举类型本质上 是一种继承java.lang.Enum类,是引用数据类型,因此也称为“枚举类”。 (1)Java中是使用enum关键词声明枚举类,具体定义放在一对大括号内,枚举的语法格式如下: (2)“枚举类”是该枚举类的名称,它首先应该是有效的标识符,其次应该遵守Java命名规范,它应该是一个名称,如果采用英文单词命名,首

weixin_44589643的博客 2681

枚举类总结

`订单状态`:Nonpayment(未付款)、Paid(已付款)、Fulfilled(已配货)、Delivered(已发货)、Checked(已确认收货)、Return(退货)、Exchange(换货)、Cancel(取消)- `支付方式`:Cash(现金)、WeChatPay(微信)、Alipay(支付宝)、BankCard(银行卡)、CreditCard(信用卡)- `就职状态`:Busy(忙碌)、Free(空闲)、Vocation(休假)、Dimission(离职)则推荐将此类声明为枚举类。

m0_59281987的博客 469

java中的枚举类_java中的枚举类

初识枚举类,我们也许会提出疑问,枚举它是一种新的类型吗?不同于基本数据类型,引用类型??为了更好地理解,我们从反编译一个enum类开始:原java代码importjava.util.Arrays;importjava.util.List;publicenumWeather{Sunny(1,"晴天"),Rainy(2,"雨天"),Cloudy(3,"多云");privatein...

weixin_42395171的博客 163

Java中Enum枚举类型在项目中应用

Java中枚举类型的使用方式及通过枚举优化if-else判断

雾林小妖的博客 509

【Java】枚举类

Java 枚举 知识点 概念 enum的全称为 enumeration, 是 JDK 1.5 中引入的新特性。 在Java中,被enum关键字修饰的类型就是枚举类型。形式如下: enum Color { RED, GREEN, BLUE } 如果枚举不添加任何方法,枚举值默认为从0开始的有序数值。以 Color 枚举类型举例,它的枚举常量依次为RED:0,GREEN:1,...

Mr_EvanChen的Blog 563

java-枚举类的定义及使用

文章目录枚举类的定义jdk5.0之前定义枚举类jdk5.0之后定义枚举类使用enum关键字定义枚举类使用enum关键字定义的枚举类实现接口 枚举类的定义 关于枚举类 1 枚举类的理解:类的对象只有有限个,确定的。我们称此类为枚举类 2 当需要定义一组常量时,强烈建议使用枚类类 3 如果枚举类中只有一个对象,则可以作为单例模式的实现方式。 如何定义枚举类 方式一:jdk5.0之前,自定义枚举类 方式二:jdk5.0之后,可以使用enum关键字定义枚举类 jdk5.0之前定义枚举类 /** * jdk5.0之

记录学习点滴 8932

JAVA中的枚举类:如何定义枚举类+枚举类的使用+枚举类中常用方法的介绍+一个枚举类的示例

Java中的枚举类,什么是枚举类、如何定义枚举类、枚举类型在switch中的作用、枚举类中的方法、枚举类的构造器、枚举类可以有哪些成员、如何在枚举类中定义抽象方法、枚举类中的两个特殊的方法:values()和valueOf(),最后写了一个枚举类的小例子,进一步理解枚举类

a289246的博客 7447

枚举类定义与使用

枚举类定义与使用 一、概述 什么是枚举? 其实枚举就是在一个类里定义几个静态变量,每个变量都是这个类的实例。 比如说,类Human有两个静态变量:Man,Woman,每一个变量都是Human类的实例。用的时候就直接写Human.Man,Human.Woman,用的时候就直接用Human.Man.hasXJJ()或者Human.Woman.hasXJJ()方法,这不就是枚举么。 枚举类...

Bruce小鬼 7636

[Java] enum枚举类的定义与使用

简要介绍下enum和枚举类的定义和使用

Pilipilip233的博客 2847

Java枚举类的本质

在idea中使用jclasslib字节码反编译插件分析枚举类的字节码文件 如下所示的一个枚举类: public enum ColorEnum { BLACK("黑色"), RED("红色"), WHITE("白色"), GREEN("绿色"); private final String color; ColorEnum(String color) { this.color = color; } public void desc() {

weixin_44503709的博客 778
上一篇: Maven内置隐含变量
下一篇: tk mybatis通用mapper
AngerWind
博客等级 码龄10年 7粉丝 12原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值