Java - Enum 枚举类型
前言
枚举是 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 枚举类型的更多相关文章
- Java enum枚举类型
java的枚举类型详解: 简单示例: public enum Color{ RED,BLUE,BLACK,YELLOW,GREEN } 复杂示例(带自定义构造方法与类型) public enum En ...
- 161208、Java enum 枚举还可以这么用
在大部分编程语言中,枚举类型都会是一种常用而又必不可少的数据类型,Java中当然也不会例外.然而,Java中的Enum枚举类型却有着许多你意想不到的用法,下面让我们一起来看看. 先来看一段代码示例: ...
- 深度分析 Java 的枚举类型:枚举的线程安全性及序列化问题(转)
写在前面: Java SE5 提供了一种新的类型 Java的枚举类型,关键字 enum 可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能 ...
- 深度分析Java的枚举类型—-枚举的线程安全性及序列化问题
原文:深度分析Java的枚举类型--枚举的线程安全性及序列化问题 枚举是如何保证线程安全的 要想看源码,首先得有一个类吧,那么枚举类型到底是什么类呢?是enum吗?答案很明显不是,enum就和clas ...
- (转)java enum枚举
转载自: 原理:http://singleant.iteye.com/blog/686349 应用:http://www.cnblogs.com/happyPawpaw/archive/2013/04 ...
- Java的枚举类型使用方法详解
1.背景在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量.之前我们通常利用public final static 方法定义的代码如下,分别用1 表示春天,2表示夏 ...
- 简单认识java enum枚举
什么是枚举 枚举是java5中新增的特性,他是一个特殊的数据类型,他的特殊性在于他既是一种类类型,又比类类型多了安全性,简洁性,便捷性.java枚举类型是功能十分强大齐全的类,功能比其他语言中的对等物 ...
- Python中模拟enum枚举类型的5种方法分享
这篇文章主要介绍了Python中模拟enum枚举类型的5种方法分享,本文直接给出实现代码,需要的朋友可以参考下 以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码代码如下: # way1 ...
- enum枚举类型的定义
enum枚举类型的定义方式与某种用法 #include <iostream> using namespace std; int main() { enum TOT{ zero, one, ...
随机推荐
- Docker部署Redis集群(主从复制 高可用)
环境 vmware12+centos7 关于环境安装可以参考我的另一篇博客 https://www.cnblogs.com/pengboke/p/13063168.html 1.清理环境 我这里用的虚 ...
- ESP32-默认事件循环
默认的事件循环是一个事件循环的系统应用发布和处理事件(例如,Wi-Fi无线事件). 基于ESP-IDF4.1 1 #include "esp_log.h" 2 #include & ...
- python使用笔记23--面向对象编程
1.面向对象编程概念 面向对象是包含面向过程 面向过程编程 买车: 1.4s看车,买车 2.上保险 保险公司 3.交税 地税局 4.交管所 上牌 面向对象编程 卖车处: 1.4s 2.保险 3.交税 ...
- C语言:转义字符 ++a例子
#include <stdio.h> int main() { printf("a\bwhat\'s\tyour\tname\n"); int k; printf(&q ...
- python twain
self.SD.SetCapability(twain.CAP_DUPLEXENABLED, twain.TWTY_BOOL, 0) #单面扫描 self.SD.SetCapability(twain ...
- 高校表白App-团队冲刺第六天
今天要做什么 在引导页的基础上添加小红点,并且在滑动时进行增强用户体验的修饰 做了什么 在布局中成功添加小红点,并在activity中得到实现;滑动在3/4时发生渐变,增强用户体验;滑动可回退;在最后 ...
- Jmeter任在运行,线程数上不去
问题 jmeter在运行,但是线程数上不去(本来模型设计了100个总线程,但运行时线程只能上到5,根据图上观察总共也只能运行5个线程) 之前更新了random csv插件 解决办法 查看jmeter. ...
- [JS]闭包和词法环境
词法环境 词法环境(lexical environment)由两个部分组成: 环境记录--一个存储所有局部变量作为其属性的对象. 对外部词法环境的引用,与外部代码相关联. 全局词法环境在脚本执行前创建 ...
- 我去!爬虫遇到JS逆向AES加密反爬,哭了
今天准备爬取网页时,遇到『JS逆向AES加密』反爬.比如这样的: 在发送请求获取数据时,需要用到参数params和encSecKey,但是这两个参数经过JS逆向AES加密而来. 既然遇到了这个情况,那 ...
- 微信小程序账号注册
想要开发微信小程序,先注册账号申请APPID. 第一步:百度搜索"微信公众平台" 第二步:立即注册 进入注册页面 区别: 订阅号: 订阅号在文件夹里,订阅号消息 一天只能推送一次, ...