在代码编写的场景中,会遇到提示避免去使用 魔法值(magic numbers)和硬编码(hardcoding)。
缺点:
不便于维护:如果需要修改值,必须手动在代码中查找并替换,会增加代码修改的复杂度和风险。
可读性差:硬编码的值缺乏描述和注释,不易于理解和解释。在工作中,协作开发,其他开发人员在阅读代码时可能无法理解这些值的含义和作用。
维护困难:当需要修改值的时候,需要在代码中找到所有使用该值的地方进行手动修改。这样容易出错,而且增加了代码维护的复杂性。
场景:设π取小数点后五位数(即3.14159)计算圆的面积
Java常量定义是指在Java程序中定义一个不可修改的值,Java常量的定义使用关键字final,一般与static关键字一起使用。
此时可以通过定义一个常量作为π
public class MyClass { //圆周率π public static final double PI = 3.14159; }
上面这个定义在类中的常量称为 类常量,可以通过类名访问。
通过定义常量,就避免在代码中直接使用没有明确含义的硬编码数字。取而代之,将这些数字赋值给具有描述性名称的常量。
在项目中看过这面这段代码,通过判断天气给出建议
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("有乌云"); } .... }
现在如果需要 把 晴天 这个天气情况修改为 高温天,那么就需要修改两处地方,在实际项目中可能更多。
所以这里必须要定义枚举提高代码的可维护性
定义枚举类如下
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; } }
在日常工作中,会有很多状态类型的字段,比如淘宝订单,状态可以为:待付款、待发货、已发货、已签收、交易成功等,真实场景状态可能更多。
而状态也会被很多代码给使用到,所以必须通过集中统一的方式来定义。
通过常量、枚举,可以很好的解决问题,一旦状态有新增、修改、删除都只需要修改一处地方,其它代码直接引用就行。