前言
枚举是 Java1.5 引入的新特性,通过关键字 enum 来定义枚举类。
应用
定义
关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用。
1 2 3 |
enum WeekEnum { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend } |
基本Enum特性
枚举类的定义
1 2 3 4 5 6 7 8 9 10 11 12 |
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 实例
1 2 3 4 5 6 7 8 9 10 |
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 方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
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
正确用法
1 2 3 4 5 6 7 8 9 |
WeekEnum weekEnum = WeekEnum.Friday;
switch (weekEnum) { case Friday: System.out.println(weekEnum); break ; case Saturday: break ; } |
错误用法
1 2 3 4 5 6 7 8 9 |
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不能继承其他类,但可以实现一个或多个接口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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中的顺序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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 方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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(); } }
} |
枚举值向枚举类型转换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
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 }
} |
以上就是java枚举类型-Enum的详细内容,更多关于java Enum的资料请关注其它相关文章!
原文链接:https://www.cnblogs.com/maggieq8324/p/15177334.html