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. codeforces 128B. String

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  2. Gym 102263 ArabellaCPC 2019 J - Thanos Power (DP,数学)

    题意:有一个整数\(n\),每次可以对加\(10^x\)或减\(10^x\),问最少操作多少次能得到\(n\). 题解:对于某一位上的数,我们可以从\(0\)加几次得到,或者从前一位减几次得到.所以对 ...

  3. Java基础(第一期)

    Java基础 1.注释 Java中注释有三种: 单行注释 // 多行注释 /* */ 文本注释(用的较少) /** */ 书写注释是一个非常好的习惯 BAT 平时写代码一定要注意规范 //有趣的代码注 ...

  4. 动态链接库(DLL)的创建和使用

    最近想做个记录日志的C++库,方便后续使用.想着使用动态库,正好没用过,学习下.概念这里不赘述.学习过程中碰到的几点,记录下来.学习是个渐进的过程,本文也是一个逐渐完善的过程. 一.Static Li ...

  5. 自己动手实现springboot运行时执行java源码(运行时编译、加载、注册bean、调用)

    看来断点.单步调试还不够硬核,根本没多少人看,这次再来个硬核的.依然是由于apaas平台越来越流行了,如果apaas平台选择了java语言作为平台内的业务代码,那么不仅仅面临着IDE外的断点.单步调试 ...

  6. k8s二进制部署 - harbor安装

    harbor安装 # 目录说明: # /opt/src : 源码.文件下载目录 # /opt/release : 各个版本软件存放位置 # /opt/apps : 各个软件当前版本的软链接 [root ...

  7. centos7源码编译安装lamp/lnmp

    centos7源码编译安装lamp/lnmp 进程:是包工头(相当于是个门,只管开门关门,不管门内的事儿) 线程:是各种工种(cpu调度的是线程) 进程 是一件事情, 线程 是 同一个时间范围内 同时 ...

  8. 左神算法第一节课:复杂度、排序(冒泡、选择、插入、归并)、小和问题和逆序对问题、对数器和递归(Master公式)

    第一节课 复杂度 排序(冒泡.选择.插入.归并) 小和问题和逆序对问题 对数器 递归 1.  复杂度 认识时间复杂度常数时间的操作:一个操作如果和数据量没有关系,每次都是固定时间内完成的操作,叫做常数 ...

  9. 009.NET5_程序的发布运行

    发布 相差了web.config文件 脚本启动 cmd,进入程序根目录. 带参启动 其实,最终与web.config中效果一样

  10. Shell 编程快速上手

    Shell 编程快速上手 test.sh #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do touch ...