使用枚举代替常量,简化工作!

转载请注明出处:(http://blog.csdn.net/My_TrueLove/article/details/52074493)

访问 ruicb.com,一键抵达我的博客!


更新于 2017/4/27:

由于 Google 不建议我们在 Android 开发中使用枚举,所以为了避免大家盲目使用枚举,我更新了一篇关于常量、注解以及枚举使用场景的 新文章

如果你了解枚举的使用,则可以直接看新文章;如果你不是很了解枚举的使用,那么建议看完本文再继续看新的文章:

《优先使用注解,慎用枚举》


今天的话题是枚举,内容很基础,不妨以故事情节展开,最后引出使用枚举的好处。

需求:有一个任务(Task),服务端定义了一个int status来标记任务的状态,包括 未开始进行中已完成 这三个状态,分别用 0、1、2 来标记。我们拿到这个status之后,需要根据状态的不同,显示不同的文本(需求仍在挖掘中)。

需求很明确,一般我们会这么做。

在全局的常量类中定义定义3个静态常量表示状态常量:

静态常量

接下来在strings.xml定义状态值:未开始进行中已完成

状态值

最后,在代码中拿到status之后,我们会这么做:

switch-1

这样写,所有的状态和状态值都统一了,规范的很,效果也不错,毫无违和感!

效果-1

突然有一天,产品汪找到你:Hi,我们把文本前面的颜色设置成动态的吧,不同的状态颜色不一样,你根据效果图改一下吧…”。还好这个简单,分分钟的事。

在colors.xml中,加几个色值:

colors

然后修改switch语句,这样:

switch-2

So easy,很快解决了问题!

慢慢的,随着开发的深入,你发现许多地方需要这么显示,于是就封装了一个自定义ViewGroup,一切都朝着好的方向发展。但除此之外,在其他地方,也需要判断这个状态值,以需要获取该状态下的属性,万一哪天产品汪跟你说:“我要多加一个状态,未知(UN_KONW)。服务端和iOS已经同步了,你这边赶紧吧”,意味着之前涉及状态判断的都需要找到加上,岂不傻眼了?

所以,大多数人还是会选择将这一部分写到全局的静态方法中,这样加字段、加状态再也不怕了,在对应文件中加几个常量【status、颜色、状态文本】,改一下方法就搞定!由于这块不是本文重点,就不贴代码了。

至此,我们的程序一步步完善了,一些基本的套路已经无法难倒我们了,完美!

功能基本实现了,但是回过头来想想,这样做并不优雅!一方面需求变动时我们还是需要改很多地方,另一方面我们并不能很直观的看出状态值status与状态文本、色值之间的关系,比如 0代表未开始,颜色为黄色。当然,可以向上文一样,依靠命名规范去解决这个问题。可是,在命名规范的基础上,有没有更好的办法进一步强化他们之间的关系呢?当然有!接下来,就到了今天的主题,一起来借助枚举完成这一任务。

-----------------枚举登场-----------------------------

刚开始,我们可以定义一个枚举类,这么写(如果你对这一写法还不了解,可以查阅其他博文):

枚举-1

用的时候简直不要太简单(status是从服务端获取的状态值):

枚举-2

然后后来产品说加一个色值,你很坦然就加上了。这么写:

枚举-3

用的时候毫不影响:

枚举-4

重点来了,该到加未知(UN_KNOW)状态的时候了,按照上文的做法,我们要改、加的东西很多,但现在只需要加一行代码,是的,一行代码

这里写图片描述

就是这么简单!同时,这么写的话,就不需要在 string.xmlcolors.xml、常量类中加一堆值了,直接放在枚举类中很直观有木有?!

不服啊?

当然,有时候我们需要在某个地方使用常量来判断,下图是常见的做法。现在我们把状态值写到枚举里面了,还能这么直观的用吗?答案是肯定的!

枚举-5

OK,关于使用枚举代替常量的分享就到这儿了。全文以故事线的形式展开,说了这么多就为这一个知识点,可见其在某些场景下还是很重要的。

最后,声明一点,我所说的使用枚举替换常量,是针对类似于“常量之间存在关联”的情况,如状态值status与状态文本、色值,此时使用枚举能大大简化我们的工作,并不是说以后所有常量都写成枚举,毕竟官方是不推荐使用枚举的

Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.

但也只是尽量避免使用!所以在实际开发中,还需要根据实际使用场景去斟酌,杜绝滥用。像本文描述的场景,建议使用,战斗力翻倍!


扫描下方二维码,关注我的公众号!

  • 20
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
### 回答1: Java枚举是一种特殊的类,它使用固定的值来创建一组常量,这些常量可以用来控制程序的流程或者增加可读性。例如,下面的代码演示了使用Java枚举创建一个用于表示星期的枚举类:public enum WeekDay { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }你可以使用WeekDay枚举来检查一个给定的日期是否是工作日:if (WeekDay.MONDAY.equals(date) || WeekDay.FRIDAY.equals(date) || WeekDay.SATURDAY.equals(date)) { System.out.println("It's a work day"); } else { System.out.println("It's a weekend"); } ### 回答2: Java枚举是一种特殊的类类型,它限制了对象的创建,并且只允许使用预定义的一组常量作为枚举类型的取值范围。枚举可以用于定义一组相关的常量,提高代码的可读性和可维护性。 Java枚举类型是通过使用关键字`enum`来定义的。以下是一个例子: ```java public enum DayOfWeek { MONDAY, // 星期一 TUESDAY, // 星期二 WEDNESDAY, // 星期三 THURSDAY, // 星期四 FRIDAY, // 星期五 SATURDAY, // 星期六 SUNDAY // 星期日 } ``` 在上面的例子中,我们定义了一个枚举类型`DayOfWeek`,它包含了一周的每天(星期一到星期日)作为常量。这些常量都是`DayOfWeek`的实例,并且使用大写字母命名。 枚举常量的访问方式是通过枚举类型名和常量名进行访问。例如,要访问`DayOfWeek`枚举中的`MONDAY`常量,可以使用`DayOfWeek.MONDAY`。 除了常量外,枚举还可以有构造函数、方法和字段。下面是一个带有字段和方法的枚举类型的例子: ```java public enum Season { SPRING("春天", 1), SUMMER("夏天", 2), AUTUMN("秋天", 3), WINTER("冬天", 4); private String name; private int index; private Season(String name, int index) { this.name = name; this.index = index; } public String getName() { return name; } public int getIndex() { return index; } } ``` 在上面的例子中,`Season`枚举类型有一个构造函数,它接受一个字符串和一个整数作为参数,并将它们赋值给枚举的`name`和`index`字段。此外,`Season`枚举还有两个公共方法`getName()`和`getIndex()`,用于获取枚举实例的名称和索引。 通过使用枚举,我们可以简化代码和逻辑,并提高代码的可读性和可维护性。例如,在判断当前季节时,可以使用`Season`枚举代替繁琐的判断语句。 ### 回答3: Java枚举(Enumeration)是一种特殊的数据类型,它用于定义一组预定义的常量。相比于使用常量或者整数来表示不同的选项,使用枚举可以使代码更加清晰、可读性更好。在Java中,枚举是通过关键字"enum"来定义的。 枚举类型可以包含多个枚举值,每个枚举值都是该类型的一个实例,相互之间是唯一的。每个枚举值都可以有自己的属性和方法。枚举类型还可以实现接口,继承类或者实现自己的方法。 下面是一个简单的例子来说明Java枚举使用: ``` enum Weekday { MONDAY("星期一"), TUESDAY("星期二"), WEDNESDAY("星期三"), THURSDAY("星期四"), FRIDAY("星期五"), SATURDAY("星期六"), SUNDAY("星期日"); private String chineseName; Weekday(String name) { this.chineseName = name; } public String getChineseName() { return chineseName; } } public class EnumExample { public static void main(String[] args) { Weekday today = Weekday.MONDAY; System.out.println("今天是" + today.getChineseName()); } } ``` 在上面的例子中,我们定义了一个枚举类型`Weekday`,包含了一周的每一天。每个枚举值都有一个中文名称,构造函数用于设置中文名,`getChineseName()`方法用于获取中文名。 在`main()`方法中,我们创建了一个`today`变量,将其赋值为`Weekday.MONDAY`,然后通过`today.getChineseName()`方法获取了今天的中文名。 总结来说,枚举类型是为了对一组常量进行整合和管理,使代码更加可读性高,并且具有更好的类型安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值