枚举的作用
无枚举
/** * 一下程序不使用枚举类型,大家分析这个程序存在的问题,哪里可以改进呢? * 两个问题: * 1.可读性差。 * 2.错误没有在编译阶段提醒。比如get()返回20 */ public class Test01 { public static void main(String[] args) { int i = get(); switch (i){ case 1 -> System.out.println("春"); case 2 -> System.out.println("夏"); case 3 -> System.out.println("秋"); case 4 -> System.out.println("冬"); } } /** * 这个方法可能会返回一个int类型的值: * 1 2 3 4 * @return */ public static int get(){ return 1; } }
有枚举
/** * 枚举类型:季节 */ public enum Season { //直接定义枚举值:每一个枚举值可以看作类中的常量。 SPRING,SUMMER,AUTUMN,WINTER }
/** * 使用枚举类型,分析优点: * 1.可读性强了 * 2.限定了返回值不能随意返回,只能返回枚举类型中的值。return Season.SPRING; * */ public class Test02 { public static void main(String[] args) { { 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("冬"); } } } /** * 这个方法可能会返回一个int类型的值: * 1 2 3 4 * @return */ public static Season get(){ return Season.SPRING; } }
底层原理
反编译之后,发现是一个final修饰的类,不能有子类,默认继承了一个类,
变量都是final修饰的常量,还有一个value()方法,返回一个数组。
public enum Color { BLUE,GREEN,RED } //枚举类中的遍历方法 public class Test03 { public static void main(String[] args) { Color[] colors = Color.values(); for (Color color : colors){ System.out.println(color); } } }
枚举的高级用法
枚举类型使用实例
枚举类
public enum Season { //使用了构造方法,就必须这样写,相当于每一个枚举类型都是Season得实例, //里边带的是参数 SPRING("春", "春意盎然"), SUMMER("夏", "夏日炎炎"), AUTUMN("秋", "落叶飘飘"), WINTER("冬", "白雪皑皑"); //属性值,用final修饰,不可改变。 private final String name; private final String desc; //构造方法 private Season(String name, String desc) { this.name = name; this.desc = desc; } //get()方法 public String getName() { return this.name; } //get()方法 public String getDesc() { return this.desc; } }
主方法
public class Test { public static void main(String[] args) { Season season = get(); switch (season){ case SPRING -> System.out.println(Season.SPRING.getDesc()); case SUMMER -> System.out.println(Season.SPRING.getDesc()); case AUTUMN -> System.out.println(Season.SPRING.getDesc()); case WINTER -> System.out.println(Season.SPRING.getDesc()); } //遍历 Season[] seasons = Season.values(); for (Season s: seasons){ System.out.println(s.getName() +" - "+ s.getDesc()); } } public static Season get(){ return Season.SPRING; } }