java枚举类型高级用法_枚举及其高级用法

Enum源码:

Enum.java

/** Copyright (c) 2003, 2009, Oracle and/or its affiliates. All rights reserved.

* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.*/

packagejava.lang;importjava.io.Serializable;importjava.io.IOException;importjava.io.InvalidObjectException;importjava.io.ObjectInputStream;importjava.io.ObjectStreamException;/*** This is the common base class of all Java language enumeration types.

*

* More information about enums, including descriptions of the

* implicitly declared methods synthesized by the compiler, can be

* found in section 8.9 of

* The Java™ Language Specification.

*

*

Note that when using an enumeration type as the type of a set

* or as the type of the keys in a map, specialized and efficient

* {@linkplainjava.util.EnumSet set} and {@linkplain* java.util.EnumMap map} implementations are available.

*

*@param The enum type subclass

*@authorJosh Bloch

*@authorNeal Gafter

*@seeClass#getEnumConstants()

*@seejava.util.EnumSet

*@seejava.util.EnumMap

*@since1.5*/

public abstract class Enum>

implements Comparable, Serializable {/*** The name of this enum constant, as declared in the enum declaration.

* Most programmers should use the {@link#toString} method rather than

* accessing this field.*/

private finalString name;/*** Returns the name of this enum constant, exactly as declared in its

* enum declaration.

*

* Most programmers should use the {@link#toString} method in

* preference to this one, as the toString method may return

* a more user-friendly name. This method is designed primarily for

* use in specialized situations where correctness depends on getting the

* exact name, which will not vary from release to release.

*

*@returnthe name of this enum constant*/

public finalString name() {returnname;

}/*** The ordinal of this enumeration constant (its position

* in the enum declaration, where the initial constant is assigned

* an ordinal of zero).

*

* Most programmers will have no use for this field. It is designed

* for use by sophisticated enum-based data structures, such as

* {@linkjava.util.EnumSet} and {@linkjava.util.EnumMap}.*/

private final intordinal;/*** Returns the ordinal of this enumeration constant (its position

* in its enum declaration, where the initial constant is assigned

* an ordinal of zero).

*

* Most programmers will have no use for this method. It is

* designed for use by sophisticated enum-based data structures, such

* as {@linkjava.util.EnumSet} and {@linkjava.util.EnumMap}.

*

*@returnthe ordinal of this enumeration constant*/

public final intordinal() {returnordinal;

}/*** Sole constructor. Programmers cannot invoke this constructor.

* It is for use by code emitted by the compiler in response to

* enum type declarations.

*

*@paramname - The name of this enum constant, which is the identifier

* used to declare it.

*@paramordinal - The ordinal of this enumeration constant (its position

* in the enum declaration, where the initial constant is assigned

* an ordinal of zero).*/

protected Enum(String name, intordinal) {this.name =name;this.ordinal =ordinal;

}/*** Returns the name of this enum constant, as contained in the

* declaration. This method may be overridden, though it typically

* isn't necessary or desirable. An enum type should override this

* method when a more "programmer-friendly" string form exists.

*

*@returnthe name of this enum constant*/

publicString toString() {returnname;

}/*** Returns true if the specified object is equal to this

* enum constant.

*

*@paramother the object to be compared for equality with this object.

*@returntrue if the specified object is equal to this

* enum constant.*/

public final booleanequals(Object other) {return this==other;

}/*** Returns a hash code for this enum constant.

*

*@returna hash code for this enum constant.*/

public final inthashCode() {return super.hashCode();

}/*** Throws CloneNotSupportedException. This guarantees that enums

* are never cloned, which is necessary to preserve their "singleton"

* status.

*

*@return(never returns)*/

protected final Object clone() throwsCloneNotSupportedException {throw newCloneNotSupportedException();

}/*** Compares this enum with the specified object for order. Returns a

* negative integer, zero, or a positive integer as this object is less

* than, equal to, or greater than the specified object.

*

* Enum constants are only comparable to other enum constants of the

* same enum type. The natural order implemented by this

* method is the order in which the constants are declared.*/

public final intcompareTo(E o) {

Enum other=(Enum)o;

Enum self= this;if (self.getClass() != other.getClass() && //optimization

self.getDeclaringClass() !=other.getDeclaringClass())throw newClassCastException();return self.ordinal -other.ordinal;

}/*** Returns the Class object corresponding to this enum constant's

* enum type. Two enum constants e1 and e2 are of the

* same enum type if and only if

* e1.getDeclaringClass() == e2.getDeclaringClass().

* (The value returned by this method may differ from the one returned

* by the {@linkObject#getClass} method for enum constants with

* constant-specific class bodies.)

*

*@returnthe Class object corresponding to this enum constant's

* enum type*/

public final ClassgetDeclaringClass() {

Class clazz=getClass();

Class zuper=clazz.getSuperclass();return (zuper == Enum.class) ?clazz : zuper;

}/*** Returns the enum constant of the specified enum type with the

* specified name. The name must match exactly an identifier used

* to declare an enum constant in this type. (Extraneous whitespace

* characters are not permitted.)

*

*

Note that for a particular enum type {@codeT}, the

* implicitly declared {@codepublic static T valueOf(String)}

* method on that enum may be used instead of this method to map

* from a name to the corresponding enum constant. All the

* constants of an enum type can be obtained by calling the

* implicit {@codepublic static T[] values()} method of that

* type.

*

*@param The enum type whose constant is to be returned

*@paramenumType the {@codeClass} object of the enum type from which

* to return a constant

*@paramname the name of the constant to return

*@returnthe enum constant of the specified enum type with the

* specified name

*@throwsIllegalArgumentException if the specified enum type has

* no constant with the specified name, or the specified

* class object does not represent an enum type

*@throwsNullPointerException if {@codeenumType} or {@codename}

* is null

*@since1.5*/

public static > T valueOf(ClassenumType,

String name) {

T result=enumType.enumConstantDirectory().get(name);if (result != null)returnresult;if (name == null)throw new NullPointerException("Name is null");throw newIllegalArgumentException("No enum constant " + enumType.getCanonicalName() + "." +name);

}/*** enum classes cannot have finalize methods.*/

protected final voidfinalize() { }/*** prevent default deserialization*/

private void readObject(ObjectInputStream in) throwsIOException,

ClassNotFoundException {throw new InvalidObjectException("can't deserialize enum");

}private void readObjectNoData() throwsObjectStreamException {throw new InvalidObjectException("can't deserialize enum");

}

}

我们自定义一个枚举类:

并且需要注意的是枚举类不允许继承别的类

public enumWeek {

MONDAY,

TUESDAY,

WEDNESDAY,

THURSDAY,

FRIDAY

}

测试结果:

System.out.println(Week.TUESDAY);  // TUESDAY

System.out.println(Week.TUESDAY.name());  // TUESDAY

System.out.println(Week.TUESDAY.ordinal());  // 1

System.out.println(Arrays.asList(Week.values()));  // [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY]

System.out.println(Week.valueOf("TUESDAY"));  // TUESDAY

可以看到,我们不用创建枚举类的对象(也不允许创建实例),直接用枚举类名即可访问其枚举元素,且Java自动给按照枚举值出现的顺序,从0开始分配了序号,

通过name()可以获得枚举值的名称,通过ordinal可以获得枚举值的编号。

使用javap反编译后的代码为

public final class enums.Week extends java.lang.Enum{public static finalenums.Week MONDAY;public static finalenums.Week TUESDAY;public static finalenums.Week WEDNESDAY;public static finalenums.Week THURSDAY;public static finalenums.Week FRIDAY;public staticenums.Week[] values();public staticenums.Week valueOf(java.lang.String);static{

MONDAY=new Week("MONDAY",0);

TUESDAY=new Week("TUESDAY",1);

WEDNESDAY=new Week("WEDNESDAY",2);

THURSDAY=new Week("THURSDAY",3);

FRIDAY=new Week("FRIDAY",4);

}

}

1、可以看到enum类型的类在经过编译后生成了一个继承了Enum的类

2、枚举类是final的,这也是为什么其不能再继承其他类的原因,Java不允许多继承

3、我们定义的每个枚举值都是该类中的一个静态final成员,且成员类型为enums.Week

4、默认提供了value()、valueOf()静态方法。

5、在static方法内为我们定义的枚举值都生成了枚举类的对象【MONDAY=new Week("MONDAY",0)】

所以,我们使用enum定义的枚举类型,会在编译后转化为一个继承了java.lang.Enum的类,而我们定义的每个枚举值都会在类的初始化阶段被实例化为我们所定义的枚举类的一个对象。

Enum抽象类常见方法

Enum抽象类的方法,会被定义的枚举类继承。而最终的枚举值被实例化成了Enum对象,因此枚举元素拥有以下的方法。

ordinal()方法:该方法获取的是枚举变量在枚举类中声明的顺序,下标从0开始。位置发生变化,那么ordinal()方法获取到的值也随之变化。

compareTo(E o)方法:比较枚举的大小,注意其内部实现是根据每个枚举的ordinal大小进行比较的

name()方法与toString():几乎是等同的,都是输出变量的字符串形式

getDeclaringClass():返回该枚举变量所在的枚举类

默认的构造方法:

protected Enum(String name, intordinal) {this.name =name;this.ordinal =ordinal;

}

枚举类型的其他应用:

1、扩展枚举值与自定义构造函数

我们可以给每个枚举值赋予更多的属性,然后覆盖原来默认的构造方法即可。

最简单的枚举值的默认构造是枚举值字符串和顺序下标,使用这两个值为我们定义的枚举值生成枚举类的对象,如【MONDAY=new Week("MONDAY",0)】

public enumWeek {

MONDAY("周一", "1"),

TUESDAY("周二", "2"),

WEDNESDAY("周三", "3"),

THURSDAY("周四", "4"),

FRIDAY("周五", "5");privateString name;privateString value;publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}publicString getValue() {returnvalue;

}public voidsetValue(String value) {this.value =value;

}

Week(String name, String value) {this.name =name;this.value =value;

}

@OverridepublicString toString() {return "Week{" +

"name='" + name + '\'' +

", value='" + value + '\'' +

'}';

}

}

2、覆盖enum类的方法

枚举类最终继承了java.lang.Enum抽象类,我们也可以覆盖其中的方法。

3、枚举类中定义抽象方法

编译期最终将每个枚举值声明为了枚举类的实例,那么在枚举类中定义的抽象方法也可以让枚举值去实现该方法。如:

public enumWeek {

MONDAY("周一", "1") {

@OverridevoidsayHello() {

System.out.println("11");

}

},

TUESDAY("周二", "2") {

@OverridevoidsayHello() {

System.out.println("22");

}

},

WEDNESDAY("周三", "3") {

@OverridevoidsayHello() {

System.out.println("33");

}

},

THURSDAY("周四", "4") {

@OverridevoidsayHello() {

System.out.println("44");

}

},

FRIDAY("周五", "5") {

@OverridevoidsayHello() {

System.out.println("55");

}

};privateString name;privateString value;publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}publicString getValue() {returnvalue;

}public voidsetValue(String value) {this.value =value;

}

Week(String name, String value) {this.name =name;this.value =value;

}abstract voidsayHello();

@OverridepublicString toString() {return "Week{" +

"name='" + name + '\'' +

", value='" + value + '\'' +

'}';

}

}

4、枚举实现单例

利用枚举值是枚举类的一个实例,且在类加载的初始化阶段调用相应的构造方法进行初始化

1)只定义一个枚举值

2)枚举类的属性类型为单例类

3)重写构造方法创建单例对象

public enumSingletonEnum {

INSTANCE;privateInstance instance;/*** 重写枚举类的构造方法*/

privateSingletonEnum(){

instance=newInstance();

}publicInstance getInstance() {returninstance;

}public voidsetInstance(Instance instance) {this.instance =instance;

}

}

获取单例对象:

SingletonEnum.INSTANCE.getInstance();

应用实例:

MongoDB连接只需一个MongoClient 实例

importcom.mongodb.MongoClient;importcom.mongodb.MongoClientURI;importcom.mongodb.client.MongoDatabase;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.core.io.support.PropertiesLoaderUtils;importjava.io.IOException;importjava.util.Properties;/***@authoryangyongjie

* @date 2021/1/25

* @desc*/

public enumMongoUtil {/*** 定义一个枚举元素,代表此类的一个实例*/INSTANCE;private static final Logger LOGGER = LoggerFactory.getLogger(MongoUtil.class);privateMongoClient mongoClient;/*** 重写枚举类的构造方法,枚举类经编译后会在将其放在静态代码块中,在类加载的初始化阶段被调用*/

privateMongoUtil() {

Properties properties= null;try{

properties= PropertiesLoaderUtils.loadAllProperties("application.properties");

}catch(IOException e) {

e.printStackTrace();

}if (properties != null) {

MongoClientURI connectionString= new MongoClientURI(properties.getProperty("mongo.url"));//MongoClient实例表示与数据库的连接池。即使有多个线程,您也只需要一个MongoClient类的实例。//所以我们可以在给定的数据库集群创建一个MongoClient实例,并在整个应用程序中使用它

this.mongoClient = newMongoClient(connectionString);

}

}/*private static MongoClient mongoClient;

static {

Properties properties = new Properties();

try {

InputStream is = ClassLoader.getSystemResourceAsStream("application.properties");

properties.load(is);

} catch (IOException e) {

e.printStackTrace();

}

if (properties != null) {

MongoClientURI connectionString = new MongoClientURI(properties.getProperty("mongo.url"));

// MongoClient实例表示与数据库的连接池。即使有多个线程,您也只需要一个MongoClient类的实例。

// 所以我们可以在给定的数据库集群创建一个MongoClient实例,并在整个应用程序中使用它

mongoClient = new MongoClient(connectionString);

}

}*/

publicMongoDatabase getDB(String dbName) {if (dbName != null && !"".equals(dbName)) {

MongoDatabase database=mongoClient.getDatabase(dbName);returndatabase;

}return null;

}

}

END.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/442579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 解析http返回的xml_Java解析调用webservice服务的返回XML串详解

本文由Markdown语法编辑器编辑完成。1. 需求分析;已知当在调用某一webservice的服务时,如果调用成功,会接受到该服务的返回XML串。后端在获取了该XML原始串时,需要进行解析,将其解析为JSON格式,以便于发送到…

java车次信息_从火车站车次公示栏来学Java读写锁

Java多线程并发之读写锁本文主要内容:读写锁的理论;通过生活中例子来理解读写锁;读写锁的代码演示;读写锁总结。通过理论(总结)-例子-代码-然后再次总结,这四个步骤来让大家对读写锁的深刻理解。本篇是《凯哥(凯哥Java…

java构建xml参数_Java中使用XML创建EMAIL模板

邮件模板让我们来看看邮件模板的格式。模板是XML文件,它包含一个根元素和一系列根的子元素。根元素是。必要的子元素是, , 和 。可选的子元素是 , , 和 。如果你使用过邮件系统,那么你可以推导出这些元素实际包含的内容。可选的元素有多个实例&#xff0…

java 多目录 编译jar_javac编译多个包下的、依赖其他jar包的java文件

问题:多个*.java文件编译*.java文件依赖其他的jar包如下文件结构:F:\jar_prachild--child01--MyChild.java--child02--MyChild.javaparent--MyParent.javaMyParent.javapackage parent;public class MyParent{public void show(){System.out.println(&qu…

java11创建项目_2019-04-11 使用IDEA创建SpringBoot项目

一. 使用IDEA新建项目根据需要选择starter这样使用IDEA搭建的一个SpringBoot项目就可以了。同样可以通过https://start.spring.io/构建。二. 结构分析1.Springboot01Application:运行Springboot01Application就可以启动Spring Boot工程。2. pom.xml中则配置好了选中的starter的…

微博php sdk,php sdk微博第三方授权登入简单使用

简单说一下OAuth协议:OAUTH是一种开放的协议,为桌面、手机或web应用提供了一种简单的,标准的方式去访问需要用户授权的API服务。下面我们去微博开发者平台登入微博。如图填写信息:网站接入->创建新应用填写信息后可以拿到微博给…

php xml数据拼接,在PHP中合并XML文件

我有2个文件,1.xml并且2.xml两个文件的结构相似,我想拥有一个。我尝试了许多解决方案,但只有错误-坦白地说,我不知道这些脚本是如何工作的。1.xml:1Title 1Author 1...2.xml:190Title 190Author 190...我想…

java中document解析jsp,JSP基于dom解析xml实例详解

本文实例讲述了JSP基于dom解析xml的方法。分享给大家供大家参考,具体如下:初次学习用dom操作xml文件,有很多不足之处,牛人多给点建议,练习时我没对中文做乱码处理,也没做验证哦!O(∩_∩)O~实体类…

php导出excel不完整,急:php导出excel时,因数据比较多,经常导出不完整就结束了【php系统数据导出excel表格】...

急:php导出excel时,因数据比较多,经常导出不完整就结束了设置超在服务器上设置也可以,在当前文件写代码也可以服务器上找到php安装下的php.ini找到max_execution_time这句,将值改为你想要的时间,或者该为0表…

php禁用eval,zp blog

最新版的suhosin需要php版本大于5.4,对于5.4以下版本则需要安装补丁,尴尬之处在于安装补丁需要重新编译PHP并安装…… 总感觉莫名的不好干货:1、suhosin-0.9.36版本可以支持PHP5.3 且不用安装补丁2、安装步骤wget https://download.suhosin.…

php 堵塞 消息队列,PHP的并发处理

PHP如何处理并发什么是进程、线程、协程进程 Process计算机中的程序关于某数据集合上的一次运行活动,“一个执行中的程序”系统进行资源分配和调度的基本单位三态模型:多道程序系统中,进程在处理器上交替运行,状态不断地发生变化运…

php中节点值怎么获取,php – 节点更新:获取旧值

我正在使用nodeapi更新更新节点,但是我需要在幕后进行更多操作,这需要我知道字段的旧值/是否有一种方法可以在覆盖之前获取字段的旧值. 最佳答案 编辑hook_nodeapi()只对新的$node对象起作用,所以我之前的回答对你没用.相反,您需要在提交时访问节点.为此,您需要注册自己的提交处…

php 购物车封装代码,PHP中封装Redis购物车功能

// 服务层namespace Common\Service;use Vendor\Func\Red;class CartService extends CommonService {protected $redis;protected $pre_key;public function __construct(){parent::__construct();$this->redis Red::create();$this->pre_key C(USER.CART).C(APPID).:…

matlab pca和逆pca函数,matlab_PCA,训练集与测试集分开,原理和用法

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼PCA基本流程:1、训练集矩阵算协方差矩阵A;2、算协方差矩阵特征值与特征向量;3、按特征值的大小排列特征矩阵,得B,对应的特征值(按从大到小排列)组成向量a;4、A*B得到去关联的新矩阵C,…

w3cschool php 调整图片尺寸,PHP_php修改上传图片尺寸的方法,本文实例讲述了php修改上传图 - phpStudy...

php修改上传图片尺寸的方法本文实例讲述了php修改上传图片尺寸的方法。分享给大家供大家参考。具体实现方法如下:// This is the temporary file created by PHP$uploadedfile $_FILES[uploadfile][tmp_name];// Create an Image from it so we can do the resize$…

matlab频域低通滤波程序,低通频域滤波器在Matlab中的设计与实现.pdf

低通频域滤波器在Matlab中的设计与实现’ … … … … … ’ ’实用第一..智‘‘慧密集. . . . . . . . … … . . . … &…

matlab做比例积分微分控制,PID控制器的微积分分析matlab代码

PID 控制器由比例环节(Proportional)、积分环节(Integral )和微分环节(Differential )组成,连续PID 控制器的一般形式:dt de K d e K t e K t u D tI p )()()()()(0τττ? 一、比例控制及性能分析比例控制器的传递函数为:p p K s G )( 例题…

php引用对象方法吗,在PHP中引用容器对象的方法?

您必须修改代码才能提供关系.在OOP中,我们称之为aggregation.假设PHP 4,以及“一系列条形图”的想法class foo {var $bars array();function __construct() {"Foo Exists!";}function magic_bullet($id) {switch($id) {case 1:echo "There is no spoon! "…

数据合并计算php,各位大神,求助如果用VBA实现以下数据合并以及数量计算

Option ExplicitModuleName"模块1"Dim aData, dic As Object, aResSub start()Dim i&, n&, aTmp, minNum, maxNumDim spNum&, strData, id, numaData Range("a1").CurrentRegionSet dic CreateObject("Scripting.Dictionary")For …

python执行文件函数,python如何运行函数

运行Python的函数,只需要调用函数名,在传递参数就可以,不必关心函数体内部的代码块。函数是带名字的代码块,用于完成具体的工作需要在程序中多次执行同一项任务时,你无需反复编写完成该任务的代码,而只需调…