经营企业,是许多环节的共同运作,差一个念头,就决定整个成败。——松下幸之助

今天有小伙伴问我枚举和常量的区别

首先我们看常量,从Hutool下有个HttpStatus常量

1
cn.hutool.http.HttpStatus

image-20210514141507884

我们可以看到这里的常量,就只是单一的值

我们使用的时候可以如下

1
2
3
public static void main(String[] args) {
System.out.println(HttpStatus.HTTP_OK);
}

得到结果

image-20210514141649382

然后我们再换到枚举

spring下面有个同名枚举

1
org.springframework.http.HttpStatus

image-20210514141748614

我们这里像刚才那样使用

1
2
3
4
public static void main(String[] args) {
System.out.println(cn.hutool.http.HttpStatus.HTTP_OK);
System.out.println(org.springframework.http.HttpStatus.OK);
}

image-20210514141917529

可以看到除了之前的状态码200还拿到了一个reasonPhrase值为OK

说明

常量只是单一的不可修改的值

枚举则是包含了很多常量的集合

枚举中一个常量可以包含很多信息

例如这里org.springframework.http.HttpStatus.OK包含的至少有

1.枚举的名字,可以使用java.lang.Enum#name获取到

1
System.out.println(org.springframework.http.HttpStatus.OK.name());

打印出来则为OK

2.枚举常量定义的下标,可以使用java.lang.Enum#ordinal获取到

1
System.out.println(org.springframework.http.HttpStatus.OK.ordinal());

打印出来则为4

3.枚举的构造方法里定义的值,例如这里org.springframework.http.HttpStatus#HttpStatus中有两个值

image-20210514142610519

我们如果定义了getter或者取出值的方法

image-20210514142807750

就可以取出对应的值

1
2
System.out.println(org.springframework.http.HttpStatus.OK.value());
System.out.println(org.springframework.http.HttpStatus.OK.getReasonPhrase());

image-20210514142857759

4.你甚至可以通过其中一个枚举常量获取其他全部的枚举常量,用的是Class下的getEnumConstants

1
2
org.springframework.http.HttpStatus[] constants = org.springframework.http.HttpStatus.OK.getClass().getEnumConstants();
Arrays.stream(constants).forEach(System.out::println);

image-20210514143217711

而常量,在不使用反射的情况下,只能获取一个值,例如这里的200。。。

在实际开发中,针对不同的业务需求使用常量或者枚举

例如只需要使用一个值,例如这里的200

你就可以定义一个常量使用

但如果你需要做别的操作

比如判断是否为200,如果不是200,你返回一个状态不是ok,这个ok是枚举内的reasonPhrase

1
2
3
4
5
int code = 201;
HttpStatus ok = HttpStatus.OK;
if (code != ok.value()) {
System.out.println("Http status is not " + ok.getReasonPhrase() + "!");
}

image-20210514143925625

这里ok参数我们随时可以换成别的,例如

1
2
3
4
5
int code = 201;
HttpStatus ok = HttpStatus.BAD_REQUEST;
if (code != ok.value()) {
System.out.println("Http status is not " + ok.getReasonPhrase() + "!");
}

image-20210514143910802

现在,你总该对常量和枚举的取舍有个认识了吧