为什么建议你使用枚举?(上)

简介: 为什么建议你使用枚举?

枚举是 JDK 1.5 新增的数据类型,使用枚举我们可以很好的描述一些特定的业务场景,比如一年中的春、夏、秋、冬,还有每周的周一到周天,还有各种颜色,以及可以用它来描述一些状态信息,比如错误码等。


枚举类型不止存在在 Java 语言中,在其它语言中也都能找到它的身影,例如 C# 和 Python 等,但我发现在实际的项目中使用枚举的人很少,所以本文就来聊一聊枚举的相关内容,好让朋友们对枚举有一个大概的印象,这样在编程时起码还能想到有“枚举”这样一个类型。


本文的结构目录如下:


image.png


枚举的 7 种使用方法


很多人不使用枚举的一个重要的原因是对枚举不够熟悉,那么我们就先从枚举的 7 种使用方法说起。


用法一:常量


在 JDK 1.5 之前,我们定义常量都是 public static final... ,但有了枚举,我们就可以把这些常量定义成一个枚举类了,实现代码如下:


public enum ColorEnum {  
  RED, GREEN, BLANK, YELLOW  
} 


用法二:switch


将枚举用在 switch 判断中,使得代码可读性更高了,实现代码如下:


enum ColorEnum {
    GREEN, YELLOW, RED
}
public class ColorTest {
    ColorEnum color = ColorEnum.RED;
    public void change() {
        switch (color) {
            case RED:
                color = ColorEnum.GREEN;
                break;
            case YELLOW:
                color = ColorEnum.RED;
                break;
            case GREEN:
                color = ColorEnum.YELLOW;
                break;
        }
    }
}


用法三:枚举中增加方法


我们可以在枚举中增加一些方法,让枚举具备更多的特性,实现代码如下:


public class EnumTest {
    public static void main(String[] args) {
        ErrorCodeEnum errorCode = ErrorCodeEnum.SUCCESS;
        System.out.println("状态码:" + errorCode.code() + 
                           " 状态信息:" + errorCode.msg());
    }
}
enum ErrorCodeEnum {
    SUCCESS(1000, "success"),
    PARAM_ERROR(1001, "parameter error"),
    SYS_ERROR(1003, "system error"),
    NAMESPACE_NOT_FOUND(2001, "namespace not found"),
    NODE_NOT_EXIST(3002, "node not exist"),
    NODE_ALREADY_EXIST(3003, "node already exist"),
    UNKNOWN_ERROR(9999, "unknown error");
    private int code;
    private String msg;
    ErrorCodeEnum(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    public int code() {
        return code;
    }
    public String msg() {
        return msg;
    }
    public static ErrorCodeEnum getErrorCode(int code) {
        for (ErrorCodeEnum it : ErrorCodeEnum.values()) {
            if (it.code() == code) {
                return it;
            }
        }
        return UNKNOWN_ERROR;
    }
}


以上程序的执行结果为:


状态码:1000 状态信息:success


用法四:覆盖枚举方法


我们可以覆盖一些枚举中的方法用于实现自己的业务,比如我们可以覆盖 toString() 方法,实现代码如下:


public class EnumTest {
    public static void main(String[] args) {
        ColorEnum colorEnum = ColorEnum.RED;
        System.out.println(colorEnum.toString());
    }
}
enum ColorEnum {
    RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLOW("黄色", 4);
    //  成员变量
    private String name;
    private int index;
    //  构造方法
    private ColorEnum(String name, int index) {
        this.name = name;
        this.index = index;
    }
    //覆盖方法
    @Override
    public String toString() {
        return this.index + ":" + this.name;
    }
}


以上程序的执行结果为:


1:红色


相关文章
|
SQL 关系型数据库 MySQL
MySQL怎样删除重复数据,只保留一条?
MySQL怎样删除重复数据,只保留一条?
|
6月前
|
Ubuntu Linux
Ubuntu下载工具:ip addr、ifconfig、ping、make的使用
的选项和参数,这里只是简单地介绍了它们的基本用法。如果你想要深入学习这些工具,我建议你查阅它们的man页面,或者找一本好的Linux教程进行学习。
225 22
|
9月前
|
人工智能
精度与通用性不可兼得,北大华为理论证明低精度下scaling law难以实现
北京大学和华为的研究团队在论文《数值精度如何影响大型语言模型的数学推理能力》中指出,数值精度是影响Transformer模型在数学任务中表现的关键因素。研究发现,低数值精度下,模型难以处理算术任务,如迭代加法和整数乘法;而在标准数值精度下,模型表现更佳且所需规模较小。实验结果表明,提高数值精度可显著提升LLM的数学推理能力,为优化模型性能提供了新思路。
207 88
|
机器学习/深度学习 人工智能 算法
计算机视觉:目标检测算法综述
【7月更文挑战第13天】目标检测作为计算机视觉领域的重要研究方向,近年来在深度学习技术的推动下取得了显著进展。然而,面对复杂多变的实际应用场景,仍需不断研究和探索更加高效、鲁棒的目标检测算法。随着技术的不断发展和应用场景的不断拓展,相信目标检测算法将在更多领域发挥重要作用。
|
12月前
|
Web App开发 Java iOS开发
webp详解
WebP是一种由谷歌开发的图像文件格式,旨在提供更高效的图像压缩方法,以加快网页加载速度。它支持有损和无损压缩模式,并且在相同的视觉质量下,相比JPEG和PNG等格式,文件大小更小,从而优化了网络传输效率。此外,WebP还支持透明度和动画图像。
|
Dubbo 网络协议 Java
深入掌握Dubbo服务提供者发布与注册原理
该文章主要介绍了Dubbo服务提供者发布与注册的原理,包括服务发布的流程、多协议发布、构建Invoker、注册到注册中心等过程。
深入掌握Dubbo服务提供者发布与注册原理
|
数据可视化 Python
NumPy 泊松分布模拟与 Seaborn 可视化技巧
泊松分布是描述单位时间间隔内随机事件发生次数的离散概率分布,参数λ表示平均速率。公式为 P(k) = e^(-λ) (λ^k) / k!。NumPy 的 `random.poisson()` 可生成泊松分布数据。当 λ 很大时,泊松分布近似正态分布。练习包括模拟顾客到达、比较不同 λ 下的分布及模拟电话呼叫中心。使用 Seaborn 可进行可视化。关注公众号 `Let us Coding` 获取更多文章。
341 1
|
机器学习/深度学习 算法 数据挖掘
【机器学习】K-means算法与PCA算法之间有什么联系?
【5月更文挑战第15天】【机器学习】K-means算法与PCA算法之间有什么联系?
|
数据采集 弹性计算 供应链
阿里云ECS付费类型:包年包月、按量付费和抢占式实例区别详解
阿里云服务器付费模式:包年包月适合长期稳定服务,价格优惠;按量付费适合短期或波动需求,按小时计费;抢占式实例价格低但可能被系统释放,适合无状态应用。选择取决于业务场景和资源稳定性需求。
371 0
|
前端开发 NoSQL 数据库
如何设计 QQ、微信、微博、Github 等等,第三方账号登陆 ?(附表设计)
如何设计 QQ、微信、微博、Github 等等,第三方账号登陆 ?(附表设计)
204 1