请一定要使用枚举和常量

2023-11-03

1.魔法值和硬编码

在代码编写的场景中,会遇到提示避免去使用 魔法值(magic numbers)和硬编码(hardcoding)。

  • 魔法值就是在代码中直接使用的,没有提供任何注释或解释说明其用途和含义的常数值。
  • 硬编码指的是在程序中直接使用特定的值或信息,而不是通过变量、常量或其他可配置的方式来表示。这些值通常是字面量字符串、数字或其他原始数据类型,在代码中写死了,无法修改。

缺点:

不便于维护:如果需要修改值,必须手动在代码中查找并替换,会增加代码修改的复杂度和风险。

可读性差:硬编码的值缺乏描述和注释,不易于理解和解释。在工作中,协作开发,其他开发人员在阅读代码时可能无法理解这些值的含义和作用。

维护困难:当需要修改值的时候,需要在代码中找到所有使用该值的地方进行手动修改。这样容易出错,而且增加了代码维护的复杂性。

2.定义常量

场景:设π取小数点后五位数(即3.14159)计算圆的面积

Java常量定义是指在Java程序中定义一个不可修改的值,Java常量的定义使用关键字final,一般与static关键字一起使用。

此时可以通过定义一个常量作为π

public class MyClass {  
    //圆周率π
    public static final double PI = 3.14159;  
}

上面这个定义在类中的常量称为 类常量,可以通过类名访问。

通过定义常量,就避免在代码中直接使用没有明确含义的硬编码数字。取而代之,将这些数字赋值给具有描述性名称的常量。

3.if - else if - else if - else if.....else

在项目中看过这面这段代码,通过判断天气给出建议

public void handleWeather(String weather) {  
    if (weather.equals("晴天")) {  
        System.out.println("做好防晒");  
    } else if (weather.equals("阴天")) {  
        System.out.println("户外活动");  
    } else if (weather.equals("小雨")) {  
        System.out.println("带雨伞");  
    } else if (weather.equals("雷雨")) {  
        System.out.println("避免户外活动");  
    } else {  
        System.out.println("未知天气");  
    }  
}

这段代码的判断条件 "晴天"、"阴天"、"小雨"等,这些条件在项目不止使用到了一次,比如在另外一个方法中也有一个判断,但是判断执行的方法体不同,如下

public void handleWeather(String weather) {  
    if (weather.equals("晴天")) {  
        System.out.println("出太阳");  
    } else if (weather.equals("阴天")) {  
        System.out.println("有乌云");  
    }
    ....
}

现在如果需要 把 晴天 这个天气情况修改为 高温天,那么就需要修改两处地方,在实际项目中可能更多。

所以这里必须要定义枚举提高代码的可维护性

4.定义枚举

定义枚举类如下

public enum WeatherType {  
    SUNNY("晴天"),  
    CLOUDY("阴天"),  
    LIGHT_RAIN("小雨"),  
    THUNDERSTORM("雷雨"),  
    UNKNOWN("未知天气");  
  
    private final String message;  
  
    WeatherType(String message) {  
        this.message = message;  
    }  
  
    public String getMessage() {  
        return message;  
    }  
}

将代码用枚举结合switch case来替换

public void handleWeather(String weather) {  
    WeatherType weatherType = WeatherType.valueOf(weather);  
    switch (weatherType) {  
        case SUNNY:  
            System.out.println("做好防晒");  
            break;  
        case CLOUDY:  
            System.out.println("户外活动");    
            break;  
        case LIGHT_RAIN:  
            System.out.println("带雨伞");    
            break;  
        case THUNDERSTORM:  
            System.out.println("避免户外活动");   
            break;  
        case UNKNOWN:  
            System.out.println("未知天气");
						break; 
    }  
}

5.结语

在日常工作中,会有很多状态类型的字段,比如淘宝订单,状态可以为:待付款、待发货、已发货、已签收、交易成功等,真实场景状态可能更多。

而状态也会被很多代码给使用到,所以必须通过集中统一的方式来定义。

通过常量、枚举,可以很好的解决问题,一旦状态有新增、修改、删除都只需要修改一处地方,其它代码直接引用就行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

请一定要使用枚举和常量 的相关文章

  • Java:错误的操作数类型

    我是一个初学者 如果这个问题很愚蠢 我很抱歉 我写了以下代码 public class Traindata String City public Traindata String t city if t city Judenburg Kni
  • 如何在 Jupyter Notebook 内的 conda 环境中使用特定的 Java 版本

    我的总体目标是使用sparklyr在 Jupyter 实验室的 Azure 云服务上的 R Jupyter 笔记本中 我使用 R sparklyr 和 Java 8 创建了一个新的 conda 环境 因为这是 Sparklyr 支持的版本
  • Java 8 文档日期时间教程错误

    The Oracle 临时查询教程页面 https docs oracle com javase tutorial datetime iso queries html显示此示例代码 Code TemporalQueries query Te
  • 为什么java中的BigInteger被设计成不可变的?

    在 java 中 BigInteger 是不可变的 但我想了解为什么 因为很多时候它用于进行大量计算 从而产生大量对象 所以 不让它变得不可变感觉有点直观 我想到的情况类似于字符串操作 然后是 StringBuilder 的选项 是否应该有
  • Java 可以启动 Windows UAC 吗?

    正如标题所说 我想知道用 Java 编写的程序是否可能 并且只有java 以管理员权限重新启动自己 最好是 jar 以本机 Windows UAC 的方式显示 为了使其对用户更可信 我做了功课 发现可以使用来完成此操作C 和 Java 之间
  • 什么时候数据库被称为嵌入式数据库?

    术语 嵌入式数据库 与 数据库 具有不同的含义吗 我见过的嵌入式数据库有两种定义 嵌入式数据库就像专门为 嵌入式 空间 移动设备等 设计的数据库系统一样 这意味着它们在紧张的环境中 内存 CPU 方面 可以合理地执行 嵌入式数据库就像不需要
  • 从不同 JVM 中的 Java 桌面应用程序中执行 Java main 方法

    我有一个桌面应用程序 当有人按下按钮时 我希望它启动另一个执行类的 main 方法的 JVM 我的桌面应用程序已经依赖于包含具有我想要执行的 main 方法的类的 jar 目前我有以下代码 但是 我希望它们是一种更优雅的方法 Runtime
  • 动态添加的 RemoteView 上的布局权重

    在我的小部件中 我使用以下内容将项目 R layout widget item 动态添加到我的主小部件布局中定义的 LinearLayout 中 Main widget layout RemoteViews views new Remote
  • 如果主键不为空,Spring data JPA不允许实体被持久化

    我有一个订阅者实体 它使用用户提供的电子邮件地址作为主键而不是自动生成的值 这意味着当调用JpaRepository的save方法时 主键值为not null 春季数据JPA文档 http docs spring io spring dat
  • 片段和通知:针对通知中的不同活动;取决于屏幕配置

    问题 如何决定做什么Activity a Notification如果目标可能取决于配置 屏幕尺寸 方向等 则应启动 就像人们使用时经常出现的情况一样Fragments Details 让我们考虑一下新闻阅读器示例 http develop
  • Motorola Android 2.2 相机忽略 EXTRA_OUTPUT 参数

    我以编程方式打开相机来拍摄视频 我告诉相机使用如下代码将视频文件放置到指定位置 Intent intent new Intent MediaStore ACTION VIDEO CAPTURE File out new File sdcar
  • 如何在 Spring Security 中创建自定义身份验证过滤器?

    我正在尝试创建一个自定义 Spring Security 身份验证过滤器以实现自定义身份验证方案 我花了几个小时阅读 Spring Security 但我找到的所有指南都解释了如何配置基本设置 我正在尝试编写自定义设置 但无法找到有关如何执
  • 如何在 selenium webdriver 中将网络浏览器从 Firefox 更改为 Chrome/Opera/IE/Safari?

    如何将浏览器从 firefox 更改为在 selenium webdriver 中工作的 Chrome Opera IE 请指导步骤以及代码片段 如果您对上述任何浏览器有答案 请回复 我读了很多这方面的内容 但无法正确链接 首先 您需要将正
  • 在 Java 中,对复杂模型使用接口是否会带来性能提升?

    标题很难理解 但我不知道如何以另一种方式总结 欢迎任何澄清的编辑 我被告知并建议使用接口来提高性能 即使在并不特别需要常规 接口 角色的情况下也是如此 在这种情况下 对象是大模型 MVC 意义上的 具有许多方法和字段 向我推荐的 好用处 是
  • Java,根据 WSDL 中的嵌入模式验证 XML

    我有一个 wsdl具有嵌入架构的文件 我想使用它来验证 XML 文件 字符串 wsdl文件 与验证的方式相同 xsd 该架构位于
  • Apache James 学习资源 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 该计划是创建一个列表阿帕奇 詹姆斯 http james apache org学习资源 涉及从设置到使用
  • Java 8 Streams - 嵌套映射到列表

    firstlist stream map x gt return secondList stream map y gt return a string collect Collectors toList Output I need Get
  • 有人让动物嗅探器插件工作吗?

    maven animal sniffer 插件承诺告诉我我的代码是否有任何对 Java 1 6 或更高版本 API 的引用 这对于我们这些在 MacOSX Snow Leopard 只有官方 1 6 上开发但需要交付到 1 5 环境的人来说
  • PDFBox - 无障碍 PDF - 如何检查 PDF 标签是否具有符合无障碍指南的属性

    需要检查 PDF 标签是否具有符合辅助功能指南的属性 例子 H1 验证 PDF 中是否存在 H1 图像 图形标签 验证图像 图形是否具有 Alt 文本 语言 验证语言属性是否已设置 以便屏幕阅读器能够正确阅读 对于西班牙语和英语文档 应更新
  • 从 HashMap 中查找对象键

    我有一个 HashMap 其键作为我自己的对象 键作为 String 的 ArrayList 有没有一种方法可以从映射中获取与另一个对象相同的关键对象 而无需迭代映射 请注意 我的对象已经实现了 equals 和 hashcode 并且它只

随机推荐

  • 光纤收发器tx和rx是什么意思?二者有什么区别?

    现如今 在视频监控工程的高清视频图像传输中 一般都会使用光纤收发器 光纤收发器也被称之为光电转换器 Fiber Converter 可以将短距离的双绞线 网线 电信号和长距离的光信号 光纤 进行互换的以太网传输媒体转换设备 这样就能延长信号
  • 百度编辑器UEditor,怎样禁止用户粘贴??

    editor a addListener beforepaste myEditor paste function myEditor paste o html html html alert 只能录入不能粘贴
  • INFO BRAINPAN: 1

    INFO BRAINPAN 1 About Release Back to the Top Name Brainpan 1 Date release 20 Mar 2013 Author superkojiman Series Brainp
  • iOS应用添加第三方支付

    最简单明了的教程还是官方文档 以下是我给应用添加支付功能 记录下 1 微信支付 官方文档 https pay weixin qq com wiki doc api app php chapter 8 5 假设你的应用在微信开放平台已经创建
  • activeMQ的学习

    原来一直在使用activeMQ 没有对它进行整理 现在看到一个不错的activeMQ详细介绍 http www itpub net tree index 312 1
  • 遇到问题之-LNMP编译安装Redis构建高速Redis缓存

    LNMP编译安装Redis构建高速Redis缓存 前面已经讲过LNMP编译Memc和Srcache构建高速Memcached缓存 这次换另一种被广泛应用的缓存 Redis Redis实际上是一个高性能的key value数据库 他可以代替M
  • 如何使用java的String.split()方法分割话单,方便查看

    工作中 想要快速查到话单中某一列的值 可以使用String split 方法 但是如果直接使用就会变成如下图 那么怎么办呢 原因是 是转义字符 必须得加 如下图 是不是很明显就看出某一列的数值啦 代码片段 public static voi
  • mysql查询最近三个月数据方法

    select from t user where time gt DATE SUB CURDATE INTERVAL 1 WEEK 一周 select from t user where time gt DATE SUB CURDATE I
  • jQuery-两次基础了解总结-引入-选择器-选择集转移

    作者 芝士小熊饼干 系列专栏 数据结构 蓝桥杯 算法 坚持天数 17天
  • C++ 实现RSA加密

    背景 因项目需要 要做一个调用短信接口发送短信的功能 需要实现一个功能是 给定一个字符串 给定一个密钥对 实现RSA公钥加密 Base64加密 然后将加密后的字符串发给服务器 服务器返回通过私钥和Base64加密后的字符串 然后我这边要实现
  • 版本号大小比较算法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 版本号大小比较算法 版本号之间比较大小 本质上是比较字符串之间的关系 这里给定两个版本号 你一定能迅速地区分出大小 0 0 2 0 0 3 想要让计算机程序分辨她们的关系
  • 云开发推送订阅消息报错 47003 rid ***

    小程序云开发推送订阅消息一直出现类似的问题 推送失败 errcode 47003 errmsg argument invalid data thing9 value is invalid rid 5f3a7906 0c594b15 6792
  • cisco VoIP软电话配置实验

    cisco VoIP软电话配置实验 2010 12 21 14 53 40 标签 语音通信 cisco 软电话 休闲 VoIP 职场 原创作品 允许转载 转载时请务必以超链接形式标明文章 原始出处 作者信息和本声明 否则将追究法律责任 ht
  • hdu 1022 简单的栈应用

    本题链接 点击打开链接 Train Problem I Time Limit 2000 1000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission
  • 基于Paddle Serving&百度智能边缘BIE的边缘AI解决方案

    Paddle Serving作为飞桨 PaddlePaddle 开源的服务化部署服务化方案 提供了C Serving和Python Pipeline两套框架 旨在帮助深度学习开发者和企业提供高性能 灵活易用的工业级在线推理服务 助力人工智能
  • unable to read project file....不能读取项目文件的解决方法

    我直接把整个解决方案和项目的源文件拷贝到另外的磁盘或者另外的文件夹和另外的电脑上 则有可能出现这个问题 解决方案 针对不同的问题可能有不同的解决方法 下面仅列举几种 删除解决方案中的 suo文件 这个与 sln一个目录下 一般为隐藏的 需要
  • 内存中有两个4字节以压缩的bcd_微机原理课后习题答案

    第1章 进制及码元 1 进制转换 129 81H 10000001B 201Q 298 12AH 100101010B 452Q 1000 3E8H 1111101000B 1750Q 5DH 1011101 B 135 Q 93 D 3E
  • stm32f407启动代码分析

    stm32f407启动代码分析 官方资料 Cortex M3内核怎么开始执行一个程序 启动文件做什么 1 初始化堆栈大小 2 初始化中断向量表 3 初始化堆栈指针 SP initial sp PC 指针 Reset Handler 4 配置
  • Zookeeper、Nacos、Dubbo、Kafka之间的关系

    文章目录 1 Zookeeper 2 Nacos 3 Dubbo 4 Kafka Zookeeper与Nacos 1 配置中心 2 注册中心 Zookeeper与kafka Zookeeper与dubbo的关系 Spring Cloud 和
  • 请一定要使用枚举和常量

    1 魔法值和硬编码 在代码编写的场景中 会遇到提示避免去使用 魔法值 magic numbers 和硬编码 hardcoding 魔法值就是在代码中直接使用的 没有提供任何注释或解释说明其用途和含义的常数值 硬编码指的是在程序中直接使用特定