Java SE Enum(枚举) CAMELLIA 2024-06-08 2024-06-08 !!! note 目录
Enum(枚举) 一、枚举的基础用法 1.1 基本概念
枚举类型 :枚举类型是一种特殊的类,用于表示一组常量。每个枚举常量实际上是该枚举类型的一个实例。
枚举常量 :枚举类型的实例,用于表示枚举类型的固定值。例如,枚举类型 Day
可以有常量 MONDAY
, TUESDAY
等。
类型安全 :使用枚举类型比使用 int
或 String
常量更具类型安全性,因为编译器会检查类型。
1 2 3 4 5 6 7 8 9 10 package com.camellia.Enum;public enum Season { SPRING, SUMMER, AUTUMN, WINTER; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 @Test public void testEnum () { Season season = get(); switch (season){ case SPRING -> System.out.println("地平线·春季" ); case SUMMER -> System.out.println("地平线·夏季" ); case AUTUMN -> System.out.println("地平线·秋季" ); case WINTER -> System.out.println("地平线·冬季" ); } } public Season get () { return Season.AUTUMN; }
1.2 反编译枚举
所有枚举类型都默认继承java.lang.Enum
,因此枚举类型无法继承其他类。
所有枚举类型都被final修饰,所以枚举类型无法继承。
所有枚举值都是常量。
所有枚举类型都有一个values数组(可以通过values()获取所有枚举制值并且遍历)
1 2 3 4 5 6 7 8 @Test public void testEnumValues () { Season[] values = Season.values(); for (Season value:values) System.out.println(value); }
二、枚举的高级用法
对于枚举类型来说,普通类可以定义的,枚举类型也可以。
静态代码块、构造代码块
静态方法、实例方法
静态变量、实例变量
如果一个枚举类型定义了普通类的东西,必须指定枚举值。
枚举值的定义只能出现在类体的最上面。
所有枚举值的后面必须”;”结尾。
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 package com.camellia.Enum;public enum Season { SPRING, SUMMER, AUTUMN, WINTER; static { System.out.println("枚举类型Season的静态代码块执行了" ); } { System.out.println("Season构造代码块执行了" ); } public final static int A = 10 ; private final int b= 20 ; public static int getA () { return A; } public int getB () { return b; } }
枚举类中的构造方法是私有化的(默认就是私有化的,只能在本类调用。)
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 package com.camellia.Enum;public enum SeasonPlus { SPRING("春季" ,"地平线春季赛事" ), SUMMER("夏季" ,"地平线夏季赛事" ), AUTUMN("秋季" ,"地平线秋季赛事" ), WINTER("冬季" ,"地平线冬季赛事" ); private final String name; private final String desc; SeasonPlus(String name, String desc){ this .name=name; this .desc=desc; } public String getName () { return name; } public String getDesc () { return desc; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 package com.camellia.Enum;public class SeasonPlusTest { public static void main (String[] args) { SeasonPlus seasonPlus=SeasonPlusTest.get(); switch (seasonPlus){ case SPRING -> System.out.println(seasonPlus.getDesc()); case SUMMER -> System.out.println(seasonPlus.getDesc()); case AUTUMN -> System.out.println(seasonPlus.getDesc()); case WINTER -> System.out.println(seasonPlus.getDesc()); } SeasonPlus[] values = SeasonPlus.values(); for (SeasonPlus value: values) System.out.println(value.getName()+" ====> " +value.getDesc()); } public static SeasonPlus get () { return SeasonPlus.SPRING; } }
三、枚举类型继承接口 3.1 整个枚举类型实现接口 这种方法是让整个枚举类型实现接口,并为所有枚举常量提供统一的实现。
1 2 3 public interface Eatable { public void eat () ; }
1 2 3 4 5 6 7 8 9 10 11 12 public enum Season implements Eatable { SPRING, SUMMER, AUTUMN, WINTER; @Override public void eat () { System.out.println("吃点水果" ); } }
3.2 每个枚举常量分别实现接口 这种方法是让每个枚举常量分别实现接口,从而为每个枚举常量提供不同的实现。
1 2 3 public interface Eatable { public void eat () ; }
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 public enum SeasonPlus implements Eatable { SPRING("春季" ,"地平线春季赛事" ){ @Override public void eat () { System.out.println("春季吃苹果" ); } }, SUMMER("夏季" ,"地平线夏季赛事" ){ @Override public void eat () { System.out.println("夏季吃西瓜" ); } }, AUTUMN("秋季" ,"地平线秋季赛事" ){ @Override public void eat () { System.out.println("秋季吃杏桃" ); } }, WINTER("冬季" ,"地平线冬季赛事" ){ @Override public void eat () { System.out.println("冬季吃橘子" ); } }; private final String name; private final String desc; SeasonPlus(String name, String desc){ this .name=name; this .desc=desc; } }