前言

枚举是 Java1.5 引入的新特性,通过关键字 enum 来定义枚举类。

应用

定义

  • 关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用。
enum WeekEnum {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend
}

基本Enum特性

  • 枚举类的定义
enum WeekEnum {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend; public static void main(String[] args) {
for (WeekEnum item : WeekEnum.values()) {
System.out.println(item.ordinal());
System.out.println(item.name());
System.out.println(item.getDeclaringClass());
System.out.println(Enum.valueOf(WeekEnum.class, item.name()));
}
}
}
  • 常用方法
方法 说明
values() 可以遍历enum实例,其返回enum实例的数组
ordinal() 返回每个实例在声明时的次序
name() 返回enum实例声明时的名称
getDeclaringClass() 返回其所属的enum类
Enum.valueOf() 根据给定的名称返回相应的enum实例

Enum的静态导入

  • static import 可以将 enum 实例的标识符带入当前类,无需再用enum类型来修饰 enum 实例
import static com.coisini.springbootlearn.WeekEnum.*;

public class WeekEnumTest {

    public static void main(String[] args) {
System.out.println(Monday.name()); // Monday
System.out.println(Tuesday.name()); //Tuesday
} }

Enum中添加新方法

  • Enum 可以看做是一个常规类(除了不能继承自一个enum),enum 中可以添加方法和 main 方法。

public enum WeekEnum { Monday(1, "周一"),
Tuesday(2, "周二"),
Wednesday(3, "周三"),
Thursday(4, "周四"),
Friday(5, "周五"),
Saturday(6, "周六"),
weekend(7, "周天"); private Integer value;
private String description; /**
* 构造方法
* @param value
* @param description
*/
WeekEnum(Integer value, String description) {
this.value = value;
this.description = description;
} /**
* 获取value
* @return
*/
public Integer getValue() { return this.value; } /**
* 获取Desc
* @return
*/
public String getDesc() { return this.description; } /**
* 重写ToString方法
* @return
*/
public String toString() {
return this.getValue() + " " + this.getDesc();
} public static void main(String[] args) {
for (WeekEnum item : WeekEnum.values()) {
System.out.println(item);
}
} }

Switch语句中的Enum

  • 正确用法
WeekEnum weekEnum = WeekEnum.Friday;

switch (weekEnum) {
case Friday:
System.out.println(weekEnum);
break;
case Saturday:
break;
}
  • 错误用法
WeekEnum weekEnum = WeekEnum.Friday;

switch(weekEnum) {
// An enum switch case label must be the unqualified name of an enumeration constant
case WeekEnum.Friday:
break;
default:
break;
}
  • 常规情况下必须使用 enum 类型来修饰 enum 实例,但在 case 语句中不必如此。

Enum的继承

  • 所有的enum都继承自java.lang.Enum类,由于Java不支持多重继承,所以enum不能继承其他类,但可以实现一个或多个接口。
public interface Period {

    enum WeekEnum implements Period{
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend
} enum MonthEnum implements Period{
January, February, March, April, May, June
} class PeriodTest {
public static void main(String[] args) {
Period week = WeekEnum.Friday;
Period month = MonthEnum.April; System.out.println(month + " " + week); // April Friday
}
} }

EnumSet的使用

  • enum 中不能删除和添加元素,Java SE5 引入了EnumSet,其元素必须来自一个 enum 。
import java.util.EnumSet;

enum EnumSetTest {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend; public static void main(String[] args) {
EnumSet<EnumSetTest> points = EnumSet.noneOf(EnumSetTest.class);
points.add(Monday);
System.out.println(points); // [Monday] points.addAll(EnumSet.of(Tuesday, Wednesday));
System.out.println(points); // [Monday, Tuesday, Wednesday] points = EnumSet.allOf(EnumSetTest.class);
System.out.println(points); // [Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend] points.removeAll(EnumSet.of(Monday, Tuesday));
System.out.println(points); // [Wednesday, Thursday, Friday, Saturday, weekend] points = EnumSet.complementOf(points);
System.out.println(points); // [Monday, Tuesday]
}
}

EnumMap的使用

  • EnumMap 是一种特殊的 Map,其 key 值必须来自一个 enum,enum 实例定义的次序决定了其在EnumMap中的顺序。
import java.util.EnumMap;
import java.util.Map; public enum EnumMapTest {
MON, TUE, WED, THU, FRI, SAT, WEE; public static void main(String[] args) {
EnumMap<EnumMapTest, String> enumMap = new EnumMap<EnumMapTest, String>(EnumMapTest.class);
enumMap.put(MON, "Monday");
enumMap.put(TUE, "Tuesday"); for (Map.Entry<EnumMapTest, String> em : enumMap.entrySet()) {
System.out.println(em.getKey() + " " + em.getValue()); // MON Monday TUE Tuesday
}
}
}

常量相关方法

  • enum 允许为 enum 实例编写方法,为每个 enum 实例赋予不同的行为,要实现常量的相关方法需要为 enum 定义- 实现 abstract 方法。
public enum EnumAbstract {
MON {
void getDetail() {
System.out.println("Monday");
}
},
TUE {
void getDetail() {
System.out.println("Tuesday");
}
},
WED {
void getDetail() {
System.out.println("Wednesday");
}
}; abstract void getDetail(); public static void main(String[] args) {
for (EnumAbstract ea : EnumAbstract.values()) {
ea.getDetail();
}
} }

枚举值向枚举类型转换

import java.util.stream.Stream;

public enum WeekEnum {

    Monday(1, "周一"),
Tuesday(2, "周二"),
Wednesday(3, "周三"),
Thursday(4, "周四"),
Friday(5, "周五"),
Saturday(6, "周六"),
weekend(7, "周天"); private Integer value;
private String description; /**
* 构造方法
* @param value
* @param description
*/
WeekEnum(Integer value, String description) {
this.value = value;
this.description = description;
} /**
* 枚举值向枚举类型转换
* @param value
* @return
*/
public static WeekEnum toWeekEnum(int value) {
return Stream.of(WeekEnum.values())
.filter(item -> item.value == value)
.findAny()
.orElse(null);
} public static void main(String[] args) {
System.out.println(WeekEnum.toWeekEnum(1)); // Monday
} }

- End -



梦想是咸鱼
关注一下吧

Java - Enum 枚举类型的更多相关文章

  1. Java enum枚举类型

    java的枚举类型详解: 简单示例: public enum Color{ RED,BLUE,BLACK,YELLOW,GREEN } 复杂示例(带自定义构造方法与类型) public enum En ...

  2. 161208、Java enum 枚举还可以这么用

    在大部分编程语言中,枚举类型都会是一种常用而又必不可少的数据类型,Java中当然也不会例外.然而,Java中的Enum枚举类型却有着许多你意想不到的用法,下面让我们一起来看看. 先来看一段代码示例: ...

  3. 深度分析 Java 的枚举类型:枚举的线程安全性及序列化问题(转)

    写在前面: Java SE5 提供了一种新的类型 Java的枚举类型,关键字 enum 可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能 ...

  4. 深度分析Java的枚举类型—-枚举的线程安全性及序列化问题

    原文:深度分析Java的枚举类型--枚举的线程安全性及序列化问题 枚举是如何保证线程安全的 要想看源码,首先得有一个类吧,那么枚举类型到底是什么类呢?是enum吗?答案很明显不是,enum就和clas ...

  5. (转)java enum枚举

    转载自: 原理:http://singleant.iteye.com/blog/686349 应用:http://www.cnblogs.com/happyPawpaw/archive/2013/04 ...

  6. Java的枚举类型使用方法详解

    1.背景在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量.之前我们通常利用public final static 方法定义的代码如下,分别用1 表示春天,2表示夏 ...

  7. 简单认识java enum枚举

    什么是枚举 枚举是java5中新增的特性,他是一个特殊的数据类型,他的特殊性在于他既是一种类类型,又比类类型多了安全性,简洁性,便捷性.java枚举类型是功能十分强大齐全的类,功能比其他语言中的对等物 ...

  8. Python中模拟enum枚举类型的5种方法分享

    这篇文章主要介绍了Python中模拟enum枚举类型的5种方法分享,本文直接给出实现代码,需要的朋友可以参考下   以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码代码如下: # way1 ...

  9. enum枚举类型的定义

    enum枚举类型的定义方式与某种用法 #include <iostream> using namespace std; int main() { enum TOT{ zero, one, ...

随机推荐

  1. WPF DataGrid RowDetailsTemplate 鼠标滚动通知到 DataGrid 滚动

    前言:上次做了数据驱动UI虽然已经实现,但是在明细中鼠标滚动并不能带动外部 DataGrid 滚动条滚动,上文地址  https://www.cnblogs.com/luguangguang/p/14 ...

  2. ROS踩坑笔记总结

    2019-07-12 11:32:16 我的第一篇原创博客(当然是站在巨人肩膀上,有些内容参考了其他大神的博客,都一一做了说明),这些是我之前在学习ROS期间经历的一些坑,以及相对应的解决方案,希望可 ...

  3. Java | 日期类型的绍介和操作

    Date类 Date类在java.util.Date,Date类表示特定的瞬间,精确到毫秒.(毫秒是千分之一秒)毫秒可以对时间和日期进行计算,可以把日期转换为毫秒进行计算,计算完毕,再把毫秒转换为日期 ...

  4. [008] - JavaSE面试题(八):集合

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [008] - JavaSE面试题(八):集合 第1问:说一下集合的体系? 单列集合: 双列集合: ...

  5. java网络编程基础——TCP网络编程三

    AIO实现非阻塞通信 java7 NIO2 提供了异步Channel支持,这种异步Channel可以提供更高效的IO,这种基于异步Channel的IO被称为异步IO(Asynchronous IO) ...

  6. Python + unittest知识点回顾

    postman 安装Newman 先安装node.js,把npm添加到环境变量中. npm install newman --registry=https://registry.npm.taobao. ...

  7. C语言变量为何先定义后使用

    C语言中,对变量的使用,首先要先定义.说明其数据类型.原因可能如下: 1不同类型的变量,其编码表示方式可能不同. 2不同类型的变量,其占有的空间大小不同.不事先说明无法在内存中开辟空间.

  8. 《手把手教你》系列技巧篇(十一)-java+ selenium自动化测试-元素定位大法之By tag name(详细教程)

    1.简介 按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍By ClassName.看到ID,NAME这些方法的讲解,小伙伴们和童鞋们应该知道,要做好Web自动化测试,最好是需要了 ...

  9. Java字节码增强技术

    简单介绍下几种java字节码增强技术. ASM ASM是一个Java字节码操控框架,它能被用来动态生成类或者增强既有类的功能.ASM可以直接产生class文件,也可以在类被加载入Java虚拟机之前动态 ...

  10. 【秒懂音视频开发】26_RTMP服务器搭建

    从本节开始,正式开启流媒体相关的内容. 流媒体 基本概念 流媒体(Streaming media),也叫做:流式媒体. 是指将一连串的多媒体数据压缩后,经过互联网分段发送数据,在互联网上即时传输影音以 ...