1.关键字:enum。枚举可以定义成单独的文件,也可以定义在其他类内部。

枚举在类内部的示例:

public class EnumInner {
public static void main(String[] args) {
Day day=Day.MONDAY;
} enum Day{
MONDAY,TUESDAY,THIRSDAY,FORTHDAY,FRIDAY
} }

Enum里,需要我们定义实例,定义的实例,返回类型还是Enum这个类本身。实例之间,用逗号隔开。我们也可以给实例添加参数,如MONDAY("参数1","参数2","参数3",,,)。添加参数后,我们在后面,定义成员变量,来接收这些参数。因为MONDAY,TUESDAY这些,都是Enum实例,其定义的参数,就是成员变量,只不过,在Eunm里,实例和成员变量,混在一起来写了。然后,我们提供方法,来获得这些实例的参数。如下代码:

public enum SimpleEnum {

    MONDAY("aaa","AAA"),//一个实例,相当于是一个对象。aaa就是成员变量的值
TUESDAY("bbb");//另一个实例 //实例中写了几个参数,就写几个成员变量
private String param1;//第一个成员变量 private String param2;//第二个成员变量 /**
* 枚举可以定义构造方法,但是构造方法都是私有的,或者是默认修饰符,不能用public修饰符,编译都过不去
* 因为构造方法我们不能手动调用,是编译器自己调用的
* 在实例中,我们有几个参数,定义构造器时,就要写几个参数的构造方法,这是为了给成员变量赋值。
* @param param1
* @param param2
*/
private SimpleEnum(String param1,String param2) {
this.param1=param1;
this.param2=param2;
}
private SimpleEnum(String param){
this.param1=param;
} /**
* 通过提供方法,供外部获得实例的参数值。在调用这些方法时,都是通过枚举.实例.方法调用。直接使用枚举,不.实例,是不能用这些方法的
* @return
*/
public String getParam(){
return param1;
} public String getParam2(){
return param2;
} public static void main(String[] args) {
SimpleEnum.MONDAY.getParam();//通过枚举.实例.方法,获得参数
}
}

2.枚举原理解析

我们定义的所有的枚举,在jdk内部,都会自动继承java.lang.Enum类。这是一个抽象类,我们看源码的构造方法:

//由编译器调用
protected Enum(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
}

枚举的构造方法都是由编译器自己调用的,我们在定义枚举时,无需定义构造方法。

我们说到,枚举在编译器中会自动继承Enum类,因为java是单继承的,所以,我们定义的枚举,是不能手动继承任何类的。但是,在枚举中,可以定义成员变量和方法,甚至可以定义main方法。也可以定义抽象方法,然后在枚举实例中,实现这些抽象方法,如下代码:

public enum SimpleEnum {

    MONDAY("aaa","AAA") {
//实例中实现抽象方法
@Override
public void enumAbatract() {
// TODO Auto-generated method stub
System.out.println("星期一");
}
},//一个实例,相当于是一个对象。aaa就是成员变量的值
TUESDAY("bbb") {
@Override
public void enumAbatract() {
// TODO Auto-generated method stub
System.out.println("星期二");
}
};//另一个实例 //实例中写了几个参数,就写几个成员变量
private String param1;//第一个成员变量 private String param2;//第二个成员变量 /**
* 枚举可以定义构造方法,但是构造方法都是私有的,或者是默认修饰符,不能用public修饰符,编译都过不去
* 因为构造方法我们不能手动调用,是编译器自己调用的
* 在实例中,我们有几个参数,定义构造器时,就要写几个参数的构造方法,这是为了给成员变量赋值。
* @param param1
* @param param2
*/
private SimpleEnum(String param1,String param2) {
this.param1=param1;
this.param2=param2;
}
private SimpleEnum(String param){
this.param1=param;
} /**
* 通过提供方法,供外部获得实例的参数值。在调用这些方法时,都是通过枚举.实例.方法调用。直接使用枚举,不.实例,是不能用这些方法的
* @return
*/
public String getParam(){
return param1;
} public String getParam2(){
return param2;
}
//定义抽象方法,上面每个实例,需要实现这个方法。
public abstract void enumAbatract(); public static void main(String[] args) {
SimpleEnum.MONDAY.getParam();
SimpleEnum.MONDAY.enumAbatract();
}
}

由此可知,enum就是一个java类,类里面的东西,在枚举里都可以有。定义了抽象方法,每个实例实现不同的抽象方法,我们获得每个实例时,也就有了不同的实现方法。

同样的,枚举也能实现接口,然后实现接口里的方法,代码如下:

/**
* 枚举接口,随便定义两个方法
* @author Administrator
*
*/
public interface IEnum { public void method(); public void way(); }
/**
* 枚举实现接口
* @author Administrator
*
*/
public enum EnumImpl implements IEnum{ INSTANCE{
//在实例里,也可以重写实现的接口方法
@Override
public void method() {
// TODO Auto-generated method stub
super.method();
}
};
/**
* 枚举中实现接口方法,那么所有的实例都是走的这个方法
*/
@Override
public void method() {
System.out.println("实现了method方法"); } @Override
public void way() {
System.out.println("实现了way方法"); } }

3.枚举与单例

在《设计模式之单例模式(Singleton Pattern)》文章中提到,枚举实现单例是最安全的,解决了反射和序列化破坏单例的可能。为什么呢?首先,我们看反射处理枚举时是怎么处理的:

这是jdk中new Instance方法的源码,我们可以看出,当通过反射实例化一个枚举时,会抛出异常。所有,我们无法通过反射,来破坏单例模式。

在序列化问题上,jvm对枚举的序列化做了特殊的规定,其序列化时,只是序列化了枚举的name()方法,在反序列化时,也保证了枚举的唯一性。相当于把枚举的唯一性,交给了jvm做保证。具体的原理,可以看这篇文章:https://blog.csdn.net/wang__qin/article/details/79802628

在这里,我们不对其进行过深的研究。

4.总结:

枚举最常用的就是取代我们之前的public static final常量定义,而是通过枚举定义一些常量参数。在枚举中,实例定义在枚举类中,成员属性和成员方法定义在枚举类中,这是一个比较特殊的地方。它不像普通的类,实例是通过new出来的,而是直接就在枚举类中定义实例,然后初始化实例的成员变量,方法等。

JAVA中枚举Enum详解的更多相关文章

  1. Java 枚举(enum) 详解7种常见的用法

    Java 枚举(enum) 详解7种常见的用法 来源 https://blog.csdn.net/qq_27093465/article/details/52180865 JDK1.5引入了新的类型— ...

  2. java中的注解详解和自定义注解

    一.java中的注解详解 1.什么是注解 用一个词就可以描述注解,那就是元数据,即一种描述数据的数据.所以,可以说注解就是源代码的元数据.比如,下面这段代码: @Override public Str ...

  3. Java中dimension类详解

    Java中dimension类详解 https://blog.csdn.net/hrw1234567890/article/details/81217788

  4. [转载]java中import作用详解

    [转载]java中import作用详解 来源: https://blog.csdn.net/qq_25665807/article/details/74747868 这篇博客讲的真的很清楚,这个作者很 ...

  5. Java中日志组件详解

    avalon-logkit Java中日志组件详解 lanhy 发布于 2020-9-1 11:35 224浏览 0收藏 作为开发人员,我相信您对日志记录工具并不陌生. Java还具有功能强大且功能强 ...

  6. Java 枚举(enum) 详解4种常见的用法

    JDK1.5引入了新的类型——枚举.在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便. 大师兄我又加上自己的理解,来帮助各位理解一下. 用法一:常量 在JDK1.5 之前,我们定义常 ...

  7. Java 枚举 enum 详解

    本文部分摘自 On Java 8 枚举类型 Java5 中添加了一个 enum 关键字,通过 enum 关键字,我们可以将一组拥有具名的值的有限集合创建为一种新的类型,这些具名的值可以作为常规的程序组 ...

  8. 关于Java中枚举Enum的深入剖析

    在编程语言中我们,都会接触到枚举类型,通常我们进行有穷的列举来实现一些限定.Java也不例外.Java中的枚举类型为Enum,本文将对枚举进行一些比较深入的剖析. 什么是Enum Enum是自Java ...

  9. Java中反射机制详解

    序言 在学习java基础时,由于学的不扎实,讲的实用性不强,就觉得没用,很多重要的知识就那样一笔带过了,像这个马上要讲的反射机制一样,当时学的时候就忽略了,到后来学习的知识中,很多东西动不动就用反射, ...

随机推荐

  1. HOJ1867 经理的烦恼

    My Tags   (Edit)   Source : HCPC 2005 Spring   Time limit : 2 sec   Memory limit : 32 M Submitted : ...

  2. 六、Python集合定义和基本操作方法

    一.集合的定义方法及特点 1.特点: (1)由不同元素组成 #集合由不同元素构成 s={1,2,3,3,4,3,3,} print(s)#运行结果:{1, 2, 3, 4} (2)集合无序 #集合无序 ...

  3. Xtrabackup 物理备份

    目录 Xtrabackup 安装 Xtrabackup 备份介绍 Xtrabackup全量备份 准备备份目录 全量备份 查看全量备份内容 Xtrabackup 全量备份恢复数据 删除所有数据库 停止数 ...

  4. 内存耗尽后Redis会发生什么

    前言 作为一台服务器来说,内存并不是无限的,所以总会存在内存耗尽的情况,那么当 Redis 服务器的内存耗尽后,如果继续执行请求命令,Redis 会如何处理呢? 内存回收 使用Redis 服务时,很多 ...

  5. 如何在 Apple Watch S6上离线播放音乐

    如何在 Apple Watch S6上离线播放音乐 Apple Watch 离线播放音乐 营销策略,捆绑销售 Apple Watch + AirPods + Apple Music Apple Wat ...

  6. 你所不知道的 JS: null , undefined, NaN, true==1=="1",false==0=="",null== undefined

    1 1 1 === 全相等(全部相等) ==  值相等(部分相等) demo: var x=0; undefined var y=false; undefined if(x===y){ console ...

  7. React & Special Props Warning

    React & Special Props Warning key & ref demo index.js:1 Warning: Comment: key is not a prop. ...

  8. React Hooks: useLayoutEffect All In One

    React Hooks: useLayoutEffect All In One useLayoutEffect https://reactjs.org/docs/hooks-reference.htm ...

  9. HTTPS All In One

    HTTPS All In One HTTPS & web security HTTPS Hypertext Transfer Protocol Secure HTTPS is an exten ...

  10. H.265 & H.264

    H.265 & H.264 HEVC (H.265) vs. AVC (H.264) https://en.wikipedia.org/wiki/High_Efficiency_Video_C ...