我们在不引入 ENUM 的情况下使用 Integer (String 啥的肯定也可以)定义四个不同的季节,由于这个是 static 和 final 的,肯定是能通过类 OGNL 直接调用且不能被改变的。
public class Season {
/**
* 使用 Integer 来定义春夏秋冬(其他类型是自然可以)
*/
public static final int SPRING = 1;
public static final int SUMMER = 2;
public static final int AUTUMN = 3;
public static final int WINTER = 4;
/**
* 定义静态常量可以在其它类中直接通过类名 OGNL 语句调用
* @param args
*/
public static void main(String[] args) {
System.out.println(Season.SPRING);
System.out.println(Season.SUMMER);
System.out.println(Season.AUTUMN);
System.out.println(Season.WINTER);
}
如果我们根据 Season 的值来区分不同的逻辑,假设为 方法 fun(),参数为 int 类型,但是我们用的时候只要传入一个 INT 值就可以了,当然你也可以写上范围,或者进行逻辑判断,但是对于使用者就不是很友好。
/**
*
* @param season
* 只要传递int就可以
*/
//可能出现的情况
fun(Season.Spring);
fun(3);
fun(4);
fun(100);
public static void fun(int season) {
switch (season) {
case 1:
System.out.println(1);
break;
case 2:
System.out.println(2);
break;
case 3:
System.out.println(3);
break;
default:
System.out.println(4);
}
}
}
如果对于 Season 类,我们里面的成员都改成 Season 类型的,并且把类加上 final 修饰(防止继承),把构造器写成 private 的(防止外部实例化),然后在将 fun() 函数的参数改为 Season 类型的 ,这样就可以限制我在使用这个方法的时候只能传入 Season 类型,而且我这个类还是写死的,也不能 new 对象,我里面写了什么你就只能用什么,直接就在根源限制了你要传入的参数,况且 IDE 会给你提醒你要传入个什么东西。
public final class Season2 {
/**
* 保证季节类型只会有这些常量
*/
public static final Season2 SPRING = new Season2();
public static final Season2 SUMMER = new Season2();
public static final Season2 AUTUMN = new Season2();
public static final Season2 WINTER = new Season2();
private Season(){}
public static void fun2(Season2 season){
//方法体
}
public static void main(String[] args) {
fun2(Season2.AUTUMN);
fun2("SPRING");
}
}
下面是改造过后的
这就是 ENUM 的设计原理,下面代码通过 javap 后得到的与我们的 Season2 基本一致,且 ENUM 本身就是一个类,所以限制了传入类型,但是我们只能通过 enum 关键字让我们的自定义枚举继承 ENUM 类,这是 java 的规范。
public enum SeasonEnum {
SPRING,
SUMMER,
AUTUMN,
WINTER
}
标签:Enum01,常量,Season,final,println,枚举,static,Season2,public
From: https://www.cnblogs.com/purearc/p/17465216.html