java枚举类型-Enum
作者:Maggieq8324 时间:2021-07-11 00:56:47
目录
前言
应用
定义
基本Enum特性
Enum的静态导入
Enum中添加新方法
Switch语句中的Enum
Enum的继承
EnumSet的使用
EnumMap的使用
常量相关方法
枚举值向枚举类型转换
前言
枚举是 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
}
}
来源:https://www.cnblogs.com/maggieq8324/p/15177334.html
标签:java,Enum,枚举类型
0
投稿
猜你喜欢
Android非XML形式动态生成、调用页面的方法
2022-11-11 11:26:01
C# 游戏外挂实现核心代码
2021-12-28 14:47:40
Android MotionEvent中getX()和getRawX()的区别实例详解
2023-01-24 22:06:42
Android ViewPager导航小圆点实现无限循环效果
2022-07-09 13:10:33
RabbitMQ开启SSL与SpringBoot连接测试的配置方法
2023-09-25 14:40:30
Android Studio中生成aar文件及本地方式使用aar文件的方法
2022-06-14 23:43:59
Java8中关于Function.identity()的使用
2021-11-16 16:05:15
Android 使用 Scroller 实现平滑滚动功能的示例代码
2022-01-20 22:49:35
VisualStudio2019安装C#环境的实现方法
2021-11-02 18:36:31
浅谈如何在项目中使用Spring Cloud Alibaba Sentinel组件
2022-07-12 14:32:17
C#实现创建,删除,查找,配置虚拟目录实例详解
2022-09-27 06:38:16
springboot 整合hbase的示例代码
2023-02-11 19:35:20
Android应用启动白屏处理方案详解
2022-06-24 23:09:18
Hibernate用ThreadLocal模式(线程局部变量模式)管理Session
2021-10-01 18:50:10
C# List 并发丢数据问题原因及解决方案
2023-06-18 17:53:54
普通类注入不进spring bean的解决方法
2021-06-07 19:22:41
浅析如何截获C#程序产生的日志
2023-06-24 12:24:50
Android 实现视频字幕Subtitle和横竖屏切换示例
2023-02-06 07:29:37
详解EventBus 3.x 的快速使用
2021-09-04 21:00:29
spring循环注入异常问题的解决方案
2021-06-29 02:21:18