枚举作为常量用法的案例

文章转载自:https://blog.csdn.net/my_truelove/article/details/52074493

Java 枚举(enum) 常见的有7种用法 , 具体有哪七种用法可以参考Java 枚举(enum) 详解7种常见的用法

今天我们讲解枚举作为常量用法的经典案例.

需求: 有很多订单展示 , 服务端会告诉客户端每个订单的状态 , 通过status来定义每个订单的状态 , 其包括 0未开始 1:进行中 2:已完成 , 我们会根据不同的状态显示不同的文本内容 . 目前的需求就是这样的 .

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

在全局的常量类中定义定义3个静态常量表示状态常量:
在这里插入图片描述
接下来在strings.xml定义状态值:未开始、进行中、已完成
在这里插入图片描述
最后,在代码中拿到status之后,我们会这么做:
在这里插入图片描述
需求很简单 , 这样就OK了.
在这里插入图片描述

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

在colors.xml中,加几个色值:
在这里插入图片描述
然后修改switch语句,这样:
在这里插入图片描述

So easy,很快解决了问题!

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

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

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

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

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

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

public enum CardStatus {

    UN_START(0, "未开始"),
    PROCESSING(1, "进行中"),
    COMPLETED(2, "已完成");

    public int mStatus;
    public String mStatusText;

    CardStatus(int status, String statusText) {
        mStatus = status;
        mStatusText = statusText;
    }

    public static CardStatus getStatusValue(int status) {
        for (CardStatus statusConstants : values()) {
            if (status == statusConstants.mStatus) {
                return statusConstants;
            }
        }
        return UN_START;
    }

}

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

  CardStatus statusValue = CardStatus.getStatusValue(status);
  mStatusTv.setText(statusValue.mStatusText);

然后后来产品说加一个状态图标,你很坦然就加上了。这么写:
在这里插入图片描述
用的时候毫不影响:

   CardStatus statusValue = CardStatus.getStatusValue(status);
   mStatusIv.setBackgroundResource(statusValue.mStatusPic);
   mStatusTv.setText(statusValue.mStatusText);

效果图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
重点来了,该到加未知(UN_KNOW)状态的时候了,按照上文的做法,我们要改、加的东西很多,但现在只需要加一行代码,是的,一行代码:
在这里插入图片描述
就是这么简单!同时,这么写的话,就不需要在 string.xml、colors.xml、常量类中加一堆值了,直接放在枚举类中很直观有木有?!

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

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

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

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

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

在C#中,枚举类型用于声明一组命名的常量,可以用于表示一系列相关的值。我们可以使用enum关键字来定义一个枚举类型。 举个例子,我们可以创建一个表示星期的枚举类型,命名为"Weekday"。在这个枚举类型中,我们可以列举出一周的所有天,从星期一到星期日。 下面是一个示例代码: enum Weekday { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday } 在这个枚举类型中,每个枚举值都会被默认赋予一个递增的整数值,从0开始。所以,在上面的例子中,Monday的值为0,Tuesday的值为1,依此类推。 如果我们想要为某个枚举值指定一个特定的整数值,我们可以使用赋值运算符来为其赋值。例如,我们可以将Monday的值指定为1: enum Weekday { Monday = 1, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday } 这样,Monday的值就为1,而Tuesday的值为2,以此类推。 通过使用枚举类型,我们可以更加直观地表示一组相关的值,并且可以方便地进行比较和操作。在实际应用中,我们可以利用枚举类型来表示类似星期、性别、状态等离散的值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [详细了解C# 枚举与位枚举](https://download.csdn.net/download/weixin_38743391/13709210)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C# 枚举Enum)精讲](https://blog.csdn.net/qq_44034384/article/details/106558683)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [C#枚举进阶用法](https://blog.csdn.net/qq_39847278/article/details/129407395)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值