经营企业,是许多环节的共同运作,差一个念头,就决定整个成败。——松下幸之助
今天有小伙伴问我枚举和常量的区别
首先我们看常量,从Hutool
下有个HttpStatus
常量
cn.hutool.http.HttpStatus
我们可以看到这里的常量,就只是单一的值
我们使用的时候可以如下
public static void main(String[] args) { System.out.println(HttpStatus.HTTP_OK); }
得到结果
然后我们再换到枚举
在spring
下面有个同名枚举
org.springframework.http.HttpStatus
我们这里像刚才那样使用
public static void main(String[] args) { System.out.println(cn.hutool.http.HttpStatus.HTTP_OK); System.out.println(org.springframework.http.HttpStatus.OK); }
可以看到除了之前的状态码200
还拿到了一个reasonPhrase
值为OK
说明
常量只是单一的不可修改的值
枚举则是包含了很多常量的集合
枚举中一个常量可以包含很多信息
例如这里org.springframework.http.HttpStatus.OK
包含的至少有
1.枚举的名字,可以使用java.lang.Enum#name
获取到
System.out.println(org.springframework.http.HttpStatus.OK.name());
打印出来则为OK
2.枚举常量定义的下标,可以使用java.lang.Enum#ordinal
获取到
System.out.println(org.springframework.http.HttpStatus.OK.ordinal());
打印出来则为4
3.枚举的构造方法里定义的值,例如这里org.springframework.http.HttpStatus#HttpStatus
中有两个值
我们如果定义了getter
或者取出值的方法
就可以取出对应的值
System.out.println(org.springframework.http.HttpStatus.OK.value()); System.out.println(org.springframework.http.HttpStatus.OK.getReasonPhrase());
4.你甚至可以通过其中一个枚举常量获取其他全部的枚举常量,用的是Class
下的getEnumConstants
org.springframework.http.HttpStatus[] constants = org.springframework.http.HttpStatus.OK.getClass().getEnumConstants(); Arrays.stream(constants).forEach(System.out::println);
而常量,在不使用反射的情况下,只能获取一个值,例如这里的200
。。。
在实际开发中,针对不同的业务需求使用常量或者枚举
例如只需要使用一个值,例如这里的200
你就可以定义一个常量使用
但如果你需要做别的操作
比如判断是否为200
,如果不是200
,你返回一个状态不是ok
,这个ok
是枚举内的reasonPhrase
int code = 201; HttpStatus ok = HttpStatus.OK; if (code != ok.value()) { System.out.println("Http status is not " + ok.getReasonPhrase() + "!"); }
这里ok
参数我们随时可以换成别的,例如
int code = 201; HttpStatus ok = HttpStatus.BAD_REQUEST; if (code != ok.value()) { System.out.println("Http status is not " + ok.getReasonPhrase() + "!"); }
现在,你总该对常量和枚举的取舍有个认识了吧