java 枚举使用教程
一、概述
一、枚举型常量
首先枚举是一个特殊的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 枚举使用教程的更多相关文章
- 秒懂系列,超详细Java枚举教程!!!
所有知识体系文章,GitHub已收录,欢迎Star!再次感谢,愿你早日进入大厂! GitHub地址: https://github.com/Ziphtracks/JavaLearningmanual ...
- Java 枚举用法详解
概念 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性. 在Java中,被 enum 关键字修饰的类型就是枚举类型.形式如下: enum Color { RED, GR ...
- Java log4j详细教程
Java log4j详细教程 http://www.jb51.net/article/74475.htm
- java 枚举类型分析
最近做android开发,需要用到枚举值,这样可以连续赋值,我按之前c++那样书写,如下所示: public enum ColorSelect { RED_BAGE = 0, GREEN_BAGE, ...
- [转] java书籍(给Java程序猿们推荐一些值得一看的好书 + 7本免费的Java电子书和教程 )
7本免费的Java电子书和教程 1. Thinking in Java (Third Edition) 本书的作者是Bruce Eckel,它一直都是Java最畅销的免费电子书.这本书可以帮助你系统的 ...
- 【转】java枚举类型enum的使用
原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...
- 学习笔记之Java程序设计实用教程
Java程序设计实用教程 by 朱战立 & 沈伟 学习笔记之JAVA多线程(http://www.cnblogs.com/pegasus923/p/3995855.html) 国庆休假前学习了 ...
- 【转】Java 枚举7常见种用法
原文网址:http://softbeta.iteye.com/blog/1185573 Java 枚举7常见种用法 博客分类: java java枚举enmu 原创地址:http://blog.li ...
- 【转】掌握java枚举类型(enum type)
原文网址:http://iaiai.iteye.com/blog/1843553 1 背景 在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量.之前我们通常利用 ...
随机推荐
- Oracle 11g R2性能优化 tkprof
另一篇博文总结了关于SQL TRACE工具的使用方式,但是产生的trace文件格式阅读起来并不是十分友好,为了更好的分析trace文件,Oracle也自带了一个格式化工具tkprof.tkprof工具 ...
- OOA/OOD/OOP
转载自https://www.cnblogs.com/zzyoucan/p/3576932.html Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了 ...
- PostMessage发送WM_CLOSE消息,实现关闭任意程序
#include <Windows.h> #include <tchar.h> int WINAPI _tWinMain(HINSTANCE hInstance, HINSTA ...
- react使用create-react-app创建的项目部署
一.在所有的项目代码编写完成后,react项目直接部署是无法正常访问的 1.问题一 网页无法正常的浏览器刷新,刷新会报404错,路由找不到页面 2.问题二 路由跳转后,浏览器后退按钮点击后,页面不刷新 ...
- 执行curl 提示curl: (35) SSL connect error
安装acme证书时,执行如下 curl https://get.acme.sh | sh 提示如下报错: curl: (35) SSL connect error curl -v 跟踪时 发现 NSS ...
- laravel blog edit
模板复制create的模板 主要修改的地方 <form action="{{ url('admin/article/'.$article->id) }}" method ...
- FineReport中日期时间函数使用总结
说明:凡函数中以日期作为参数因子的,其中日期的形式都必须是yy/mm/dd.而且必须用英文环境下双引号(" ")引用. DATE DATE(year,month,day):返回一个 ...
- vivo Xplay 5的Usb调试模式在哪里,打开vivo Xplay 5Usb调试模式的经验
在我们使用安卓手机链接PC的时候,如果手机没有开启Usb调试模式,PC则无办法成功检测到我们的手机,部分app也无办法正常使用,因此我们需要找处理方法将手机的Usb调试模式开启,如下内容我们介绍viv ...
- Linux系统的目录结构及常见目录总结
Linux系统的目录结构(必须掌握的内容) 所有目录只有一个顶点/(根),所有目录的起点. 只有一棵树 Linux的目录结构也是有规律的,而且也是按照类别组织的. 应用程序 /usr/bin 数据文件 ...
- java线程学习之notify方法和notifyAll方法
notify(通知)方法,会将等待队列中的一个线程取出.比如obj.notify();那么obj的等待队列中就会有一个线程选中并且唤醒,然后被唤醒的队列就会退出等待队列.活跃线程调用等待队列中的线程时 ...