请一定要使用常量和枚举

1.魔法值和硬编码

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

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

缺点:

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

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

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

2.定义常量

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

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

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

arduino 复制代码
public class MyClass {  
    //圆周率π
    public static final double PI = 3.14159;  
}

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

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

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

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

csharp 复制代码
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("未知天气");  
    }  
}

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

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

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

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

4.定义枚举

定义枚举类如下

arduino 复制代码
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来替换

csharp 复制代码
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.结语

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

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

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

相关推荐
阳光是sunny几秒前
LangGraph中的Reducer是什么
前端·人工智能·后端
灯澜忆梦19 分钟前
GO_并发编程---定时器
开发语言·后端·golang
阳光是sunny20 分钟前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
皮皮林5511 小时前
开源实力派,给本地 AI 装上深度调研能力,一张 3090 跑到 95.7 分!
后端
努力的小雨1 小时前
把 Windows 桌面图标做成一个会自己运转的小世界
后端
武子康2 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
腾渊信息科技公司3 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
IT_陈寒4 小时前
Vue这个特性差点让我加班到凌晨,谁懂啊
前端·人工智能·后端
段一凡-华北理工大学4 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
码事漫谈5 小时前
1999年的电商前夜和2026年的AI前夜 历史押韵但从不重复
后端