枚举代替常量-阿里云开发者社区

开发者社区> 李子捌> 正文

枚举代替常量

简介: 枚举代替常量
+关注继续查看
(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅998元/3年,立即抢购>>>:9i0i.cn/aliyun

福利推荐:阿里云、腾讯云、华为云等大品牌云产品全线2折优惠活动来袭,4核8G云服务器899元/3年,新老用户共享优惠,点击这里立即抢购>>>

1、简介

不知道大家有没有在自己项目中看到过类似下面这样的代码:

public static void fruitsHandle(String fruits) {


? ? switch (fruits) {

? ? ? ? case "Apple":

? ? ? ? ? ? // TODO

? ? ? ? ? ? break;

? ? ? ? case "Banana":

? ? ? ? ? ? // TODO

? ? ? ? ? ? break;

? ? ? ? case "Orange":

? ? ? ? ? ? // TODO

? ? ? ? ? ? break;

? ? ? ? default:

? ? ? ? ? ? throw new IllegalStateException("Unexpected value: " + fruits);

? ? }


}

出现上面这种情况是非常少的,小萌新一般也不会直接在方法中重复定义字符串进行比较,而会将其定义为常量,或者统一抽取为常量类。所以一般会看到这种代码(小捌经常在项目中看到类似这样的代码,但是小捌不敢吭声😄😄):

private static final String APPLE = "Apple";

private static final String BANANA = "Banana";

private static final String ORANGE = "Orange";


public static void fruitsHandle(String fruits) {


? ? switch (fruits) {

? ? ? ? case APPLE:

? ? ? ? ? ? // TODO

? ? ? ? ? ? break;

? ? ? ? case BANANA:

? ? ? ? ? ? // TODO

? ? ? ? ? ? break;

? ? ? ? case ORANGE:

? ? ? ? ? ? // TODO

? ? ? ? ? ? break;

? ? ? ? default:

? ? ? ? ? ? throw new IllegalStateException("Unexpected value: " + fruits);

? ? }


}


上面这种情况我们在代码中出现的频率非常高;它需要程序员提供一组固定常量,并且这一组固定常量在开发时或者说编译时就知道了具体的成员,这个时候我们就应该使用枚举。

枚举类型(enum type)是指由一组固定常量组成合法值的类型。

2、优势

使用枚举类型,相比直接定义常量能够带来非常多的好处。

2.1 类型安全

分别定义一个简单的肉类枚举和水果枚举

// 肉类枚举

public enum MeetEnums {


? ? BEEF,

? ? PORK,

? ? FISH;


}

// 水果枚举

public enum FruitsEnums {


? ? APPLE,

? ? BANANA,

? ? ORANGE;


}

我们改造上面的代码,修改入参类型即可

public static void fruitsHandle(FruitsEnums fruits) {


? ? switch (fruits) {

? ? ? ? case APPLE:

? ? ? ? ? ? // TODO

? ? ? ? ? ? break;

? ? ? ? case BANANA:

? ? ? ? ? ? // TODO

? ? ? ? ? ? break;

? ? ? ? case ORANGE:

? ? ? ? ? ? // TODO

? ? ? ? ? ? break;

? ? ? ? default:

? ? ? ? ? ? throw new IllegalStateException("Unexpected value: " + fruits);

? ? }


}

可以看到定义枚举类型带来函数类型安全性,如果定义的是常量则无法代理这种效果

image


2.2 枚举能够提供更多信息

枚举在本质上还是一个类,它能够定义属性和方法,我们可以在枚举类中定义想要的方法、或者通过属性扩展枚举提供的基础信息。

比如我们做web开发时最常见的HttpStatus,在springframework框架中就被定义成了枚举类,它不仅包含了Http响应码,还能包含描述状态。

public enum HttpStatus {


?OK(200, "OK"),

? ? NOT_FOUND(404, "Not Found"),

? ? INTERNAL_SERVER_ERROR(500, "Internal Server Error");

? ??

? ? private final int value;

? ? private final String reasonPhrase;


? ? private HttpStatus(int value, String reasonPhrase) {

? ? ? ? this.value = value;

? ? ? ? this.reasonPhrase = reasonPhrase;

? ? }

? ??

}

2.3 通过函数提供更多服务

此外HttpStatus它内部还嵌套了Series枚举类,这个类可以协助HttpStatus枚举类,通过statusCode / 100的模判断当前的枚举状态是is1xxInformational、is2xxSuccessful、is3xxRedirection、is4xxClientError、is5xxServerError等等。

public static enum Series {

? ? ? ? INFORMATIONAL(1),

? ? ? ? SUCCESSFUL(2),

? ? ? ? REDIRECTION(3),

? ? ? ? CLIENT_ERROR(4),

? ? ? ? SERVER_ERROR(5);


? ? ? ? private final int value;


? ? ? ? private Series(int value) {

? ? ? ? ? ? this.value = value;

? ? ? ? }


? ? ? ? public int value() {

? ? ? ? ? ? return this.value;

? ? ? ? }


? ? ? ? public static HttpStatus.Series valueOf(HttpStatus status) {

? ? ? ? ? ? return valueOf(status.value);

? ? ? ? }


? ? ? ? public static HttpStatus.Series valueOf(int statusCode) {

? ? ? ? ? ? HttpStatus.Series series = resolve(statusCode);

? ? ? ? ? ? if (series == null) {

? ? ? ? ? ? ? ? throw new IllegalArgumentException("No matching constant for [" + statusCode + "]");

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? return series;

? ? ? ? ? ? }

? ? ? ? }


? ? ? ? @Nullable

? ? ? ? public static HttpStatus.Series resolve(int statusCode) {

? ? ? ? ? ? int seriesCode = statusCode / 100;

? ? ? ? ? ? HttpStatus.Series[] var2 = values();

? ? ? ? ? ? int var3 = var2.length;


? ? ? ? ? ? for(int var4 = 0; var4 < var3; ++var4) {

? ? ? ? ? ? ? ? HttpStatus.Series series = var2[var4];

? ? ? ? ? ? ? ? if (series.value == seriesCode) {

? ? ? ? ? ? ? ? ? ? return series;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }


? ? ? ? ? ? return null;

? ? ? ? }

? ? }


2.4 获取所有定义的类型

所有的枚举类会自动产生一个values()方法,它能返回当前定义枚举类的数组集,因此可以很方便的遍历怎么枚举类定义的所有枚举。比如我们简单改造一下MeetEnums枚举类:

public enum MeetEnums {


? ? BEEF("牛肉"),

? ? PORK("猪肉"),

? ? FISH("鱼肉");


? ? String name;


? ? public String getName() {

? ? ? ? return name;

? ? }


? ? MeetEnums(String name) {

? ? ? ? this.name = name;

? ? }


? ? public static MeetEnums getMeetEnumsByName(String name) {

? ? ? ? MeetEnums[] values = values();

? ? ? ? Optional<MeetEnums> optional = Stream.of(values).filter(v -> v.getName().equals(name)).findAny();

? ? ? ? return optional.isPresent() ? optional.get() : null;

? ? }


}


总之枚举类相比常量来说有太多的优点,它能使得代码更加整洁美观、安全性强、功能强大。虽然大部分情况下,枚举类的选择是由于常量定义的,但是也并不是任何时候都一定要把常量定义成枚举;具体情况大家就可以自己去斟酌啦!

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9473 0
使用SSH远程登录阿里云ECS服务器
远程连接服务器以及配置环境
2460 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的,?mysql的 3306,?mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建. ? have?fun! ?将编程看作是一门艺术,而不单单是个技术。
10839 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13152 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
4619 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
6882 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
4002 0
+关注
李子捌
简介: CSDN优秀作者、华为云专家 领域: Java框架、并发编程、分布式、微服务、Redis、HarmonyOS、中间件等技术
240
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载


http://www.vxiaotou.com