一、概述

一、枚举型常量

首先枚举是一个特殊的class,这个class相当于final static修饰,不能被继承;
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类;
他的构造方法强制被私有化,下面有一个默认的构造方法private ColorEnum();

/**
* 每个枚举变量都是枚举类ColorEnum的实例,相当于RED=new ColorEnum(1),按序号来;
* 每个成员变量都是final static修饰;
*/
enum ColorEnum {
RED, GREEN, BLANK, YELLOW;
} //测试
public class Test {
public static void main(String[] args) {
//ordinal返回枚举变量的序号
for(ColorEnum color:ColorEnum.values()) {
System.out.println(color+" ordinal:"+color.ordinal()+" name:"+color.name());
}
// RED ordinal:0 name:RED
// GREEN ordinal:1 name:GREEN
// BLANK ordinal:2 name:BLANK
// YELLOW ordinal:3 name:YELLOW
}
}

二、带一个参数的枚举

enum TypeEnum {

    FIREWALL("firewall"),
SECRET("secretMac"),
BALANCE("f5"); private String typeName; TypeEnum(String typeName) {
this.typeName = typeName;
} /**
* 根据类型的名称,返回类型的枚举实例。
* @param typeName 类型名称
*/
public static TypeEnum fromTypeName(String typeName) {
for (TypeEnum type : TypeEnum.values()) {
if (type.getTypeName().equals(typeName)) {
return type;
}
}
return null;
} public String getTypeName() {
return this.typeName;
}
} /**
* 测试
* type:是TypeEnum类实例化对象
* typeName:实例化对象type的值
* ordinal:实例化对象type的序号(int), 排序值(默认自带的属性 ordinal 的值)
* name:实化对象的名字(String),枚举名称(即默认自带的属性 name 的值)
*/
public class Test {
public static void main(String[] args) {
String typeName = "f5";
TypeEnum type = TypeEnum.fromTypeName(typeName); System.out.println(type+",typeName:"+type.getTypeName()+",ordinal:"+type.ordinal()+",name:"+type.name());
//BALANCE,typeName:f5,ordinal:2,name:BALANCE
}
}

实际开发该怎么用呢?

package niing;

//状态封装 (0 禁用 1启用 2删除)
enum DataStatus {
DISABLE("1")
,ENABLE("2")
,DELETE("3"); private final String status; DataStatus(String status){
this.status = status;
}
public String getStatus(){
return this.status;
}
} public class Test {
public static void main(String[] args) {
//DataStatus.DELETE获得的枚举对象 相当于 new DataStatus("3") 获得的对象;
System.out.println(DataStatus.DELETE); //DELETE
//在实际开发中这样去获取枚举中定义的常量,这就好比以前在接口或者公共类中定义的 private statis final String DELETE = "2";
System.out.println(DataStatus.DELETE.getStatus()); //3
}
}

三、向枚举中添加新方法

enum SeasonEunm {
//每一个枚举变量都是枚举类SeasonEunm的实例化;
//SeasonEunm.SPRING获得的对象相当于new SeasonEunm("春","春困") 获得的对象;
SPRING("春","春困"),SUMMER("夏","夏睡"),AUTUMN("秋","秋乏"),WINTER("冬","冬眠"); //强制私有化的构造方法,因为枚举类默认继承Eunm类,被final static修饰,不能被继承;
//由于被强制private,所以不能使用new去生成枚举对象;
//在SeasonEunm.SPRING获得对象,隐式调用了下面的构造方法;
// 构造方法 ,赋值给成员变量
private SeasonEunm(String name, String value) {
this.name = name;
this.value = value;
} //添加成员变量的原因是,方便够着方法赋值,使用SeasonEunm.SPRING.getName就能获取对应的值;
private String name;
private String value; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
} //测试
public class Test {
public static void main(String[] args) {
//ordinal返回枚举变量的序号
for(SeasonEunm seasion:SeasonEunm.values()) {
System.out.println(seasion+",ordinal:"+seasion.ordinal()+",name:"+seasion.name());
System.out.println("枚举变量值:"+seasion.getName()+",枚举变量值:"+seasion.getValue());
} // SPRING,ordinal:0,name:SPRING
// 枚举变量值:春,枚举变量值:春困
// SUMMER,ordinal:1,name:SUMMER
// 枚举变量值:夏,枚举变量值:夏睡
// AUTUMN,ordinal:2,name:AUTUMN
// 枚举变量值:秋,枚举变量值:秋乏
// WINTER,ordinal:3,name:WINTER
// 枚举变量值:冬,枚举变量值:冬眠
}
}

四、覆盖枚举的方法

enum RGBEnum {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
// 成员变量
private String name;
private int index;
// 构造方法 ,赋值给成员变量
private RGBEnum(String name, int index) {
this.name = name;
this.index = index;
} //覆盖方法 :只能使用toString方法来输出枚举变量值
@Override
public String toString() {
return this.index+"_"+this.name;
}
} //测试
public class Test {
public static void main(String[] args) {
for(RGBEnum rgb:RGBEnum.values()) {
System.out.println(rgb.toString());
}
// 1_红色
// 2_绿色
// 3_白色
// 4_黄色
}
}

二、使用

1. 根据值获取到枚举对象

定义了一个枚举:

@NoArgsConstructor
@AllArgsConstructor
@Getter
public enum StarEnum {
LiuYiFei("刘亦菲", 23),
ChenShu("陈数", 24),
WangOu("王鸥", 25); private String name;
private Integer age;
}

获取枚举对象:

package myEnum;

import org.apache.commons.lang3.EnumUtils;
import java.util.List; /**
* @author zls
* @date 2020/3/6
*/
public class EnumTest {
public static void main(String[] args) {
List enumList = EnumUtils.getEnumList(StarEnum.class);
System.out.println("enumList = " + enumList);
// enumList = [LiuYiFei, ChenShu, WangOu] StarEnum chenShu = EnumUtils.getEnum(StarEnum.class, "ChenShu");
System.out.println("chenShu = " + chenShu); // chenShu = ChenShu }
}

建议使用lang3提供的枚举工具类,而不要使用lang,使用lang会报错,此外,你也可以利用反射自己封装适用于自己的工具类。

转载:https://blog.csdn.net/newbie_907486852/article/details/81027512

java 枚举使用教程的更多相关文章

  1. 秒懂系列,超详细Java枚举教程!!!

    所有知识体系文章,GitHub已收录,欢迎Star!再次感谢,愿你早日进入大厂! GitHub地址: https://github.com/Ziphtracks/JavaLearningmanual ...

  2. Java 枚举用法详解

    概念 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性. 在Java中,被 enum 关键字修饰的类型就是枚举类型.形式如下: enum Color { RED, GR ...

  3. Java log4j详细教程

    Java log4j详细教程 http://www.jb51.net/article/74475.htm

  4. java 枚举类型分析

    最近做android开发,需要用到枚举值,这样可以连续赋值,我按之前c++那样书写,如下所示: public enum ColorSelect { RED_BAGE = 0, GREEN_BAGE, ...

  5. [转] java书籍(给Java程序猿们推荐一些值得一看的好书 + 7本免费的Java电子书和教程 )

    7本免费的Java电子书和教程 1. Thinking in Java (Third Edition) 本书的作者是Bruce Eckel,它一直都是Java最畅销的免费电子书.这本书可以帮助你系统的 ...

  6. 【转】java枚举类型enum的使用

    原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...

  7. 学习笔记之Java程序设计实用教程

    Java程序设计实用教程 by 朱战立 & 沈伟 学习笔记之JAVA多线程(http://www.cnblogs.com/pegasus923/p/3995855.html) 国庆休假前学习了 ...

  8. 【转】Java 枚举7常见种用法

    原文网址:http://softbeta.iteye.com/blog/1185573 Java 枚举7常见种用法 博客分类: java java枚举enmu  原创地址:http://blog.li ...

  9. 【转】掌握java枚举类型(enum type)

    原文网址:http://iaiai.iteye.com/blog/1843553 1   背景 在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量.之前我们通常利用 ...

随机推荐

  1. 【Mac】-NO.161.Mac.1 -【MacOS Error running 'Tomcat 8.5.371': Cannot run program Permission denied】

    Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...

  2. 兼容不同浏览器的CSS前缀-webkit-,-ms-,-moz-,-o-

    笔者在工作实践中发现当需要CSS兼容不同的浏览器时,需要在CSS样式前加上不同的前缀,从而使其他浏览器也能够达到相同的页面效果. 那么我们怎么去加上这些前缀呢?我们一起带着疑问来进行学习: 1.前缀分 ...

  3. Maven 学习笔记-maven属性

    Maven有六类属性: 1)内置属性 主要有两个常用内置属性 ${basedir}:表示项目根目录,即包含pom.xml文件的目录: ${version}:表示项目版本: 2)POM属性 ${M2_H ...

  4. web框架实现购物车数量加减

    企业开发中经常是团队协作,每个人分配一个小的模块,比如说购物车模块,数量加减这一块人们首先想到的就是通过jquery实现,其实作为一个后端接口开发的程序猿也可以用自己更擅长的后端的逻辑代码来实现,那我 ...

  5. openssl源代码结构

    Openssl整个软件包主要包括三个主要的功能模块:密码算法库,SSL协议库,应用程序: 应用程序:主要包括密钥生成,证书管理,格式转换,数据加密,签名,SSL测试等. evp,对称算法,非对称算法, ...

  6. maven 控制台 打包

    maven打包方法1.打开cmd,进入到项目的根目录2.执行命令:mvn clean package等待结束.结束后到目录的target子目录中找jar文件即可

  7. 【JavaScript】对JS的封装

    以下方法封装了获取ID元素的JS代码,调用以下代码方法并传值,则可以直接获取id所指元素 function $id(x) { //此处x只是形参,代表传进来的:要获取元素的id字符串 return d ...

  8. SQL中sysname数据类型的含义(转)

    sysname SQL Server 实例包括用户定义的名为 sysname 的数据类型.sysname 用于表列.变量以及用于存储对象名的存储过程参数.sysname 的精确定义与标识符规则相关:因 ...

  9. vue前端面试题知识点整理

    vue前端面试题知识点整理 1. 说一下Vue的双向绑定数据的原理 vue 实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫 ...

  10. 获取某个元素第一次出现在数组(json数组)的索引

    function firstIndex(arr, text) { // 若元素不存在在数组中返回-1 let firstVal = -1; for (let i = 0; i < arr.len ...