Java 开发技巧:减少魔法值的使用

简介: 代码中有魔法值会造成代码可读性低(与代码量成正比)。还会造成维护困难,改动一个数值便要大动干戈,牵一发而动全身。应当尽力消灭或减少魔法值,提高维护效率和代码可读性。

前言

代码中有魔法值会造成代码可读性低(与代码量成正比)。还会造成维护困难,改动一个数值便要大动干戈,牵一发而动全身。应当尽力消灭或减少魔法值,提高维护效率和代码可读性。


1 魔法值

在Java开发中,Java魔法值又叫做魔法数值、魔法数字、魔法值。当我们开发或重构老代码中遇到了类似这种写法:

publicvoidattend(Stringvalue) {
if ("0".equals(value)) {
// TODO    } elseif ("1".equals(value)) {
// TODO    } else {
// TODO    }
}


脑壳疼!从 Java语法上无懈可击,但是从业务上却让人无法理解其中的含义。上面看到的字符窜的 "0""1" 统称为魔法值 。


2 魔法值的处理方式

上面的代码我们往往需要通过上下文推断出来,如果是非常复杂的业务或者十年前的代码那就更惨了,搞不好文档也没有。所以我们要尽量避免出现魔法值。今天就来讲几种避免魔法值的操作。


2.1 静态常量

如果该值的作用域在一个类中或者同一个包下,一般可以使用静态常量来解决。

privatestaticfinalStringFEMALE="0";
privatestaticfinalStringMALE="1";
publicvoidattend(Stringvalue) {
if (FEMALE.equals(value)) {
// TODO        } elseif (MALE.equals(value)) {
// TODO        } else {
// TODO        }
    }
}


是不是清晰了许多,原来 0 和 1 代表的是性别(当然需要配合你良好的变量命名习惯)。


2.2 使用接口

既然我们使用了静态常量那么我们可以将魔法值封装入接口也是可以的。

publicinterfaceGender {
StringFEMALE="0";
StringMALE="1";
}


2.3 使用枚举

接口的意义在于提供抽象的功能而不是存储一些常量值,显然违背了接口设计的初衷。所以jdk1.5引入了枚举类型enum。很多情况这种写法就够用了,你可以通过 GenderEnum.MALE.ordinal() 获取对应枚举的数字序号,也可以通过GenderEnum.MALE.name()获取对应枚举的字符串名称。他们大多数情况下都可以用来进行一些逻辑标识。但是满足不了我们上面最初的设计,我们需要来改造一下枚举类的构造函数。

publicenumGenderEnum {
FEMALE("0"),
MALE("1");
privatefinalStringvalue;
GenderEnum(Stringvalue) {
this.value=value;
    }
publicStringvalue() {
returnthis.value;
    }
}


这样改写之后我们就能通过 value() 方法拿到具体的值了。

自己再增加点需求,以达到你的枚举更加友好的可读性。参考如下代码片段:

publicenumGenderEnum {
UNKNOWN("-1", "未知"),
FEMALE("0", "女性"),
MALE("1", "男性");
privatefinalStringvalue;
privatefinalStringdescription;
GenderEnum(Stringvalue, Stringdescription) {
this.value=value;
this.description=description;
    }
publicStringvalue() {
returnthis.value;
    }
publicStringdescription() {
returnthis.description;
    }
}


description值不但可以帮助我们知道该枚举的实际代表意义,甚至可以作为一种说明返回给前端业务。


2.4 内部类

publicclassResponseMessage {
publicstaticfinalclassStatus {
publicstaticfinalStringSUCCESS="SUCCESS";
publicstaticfinalStringWARN="WARN";
publicstaticfinalStringERROR="ERROR";
publicstaticfinalStringFAIL="FAIL";
publicstaticfinalIntegerENABLE=0;
publicstaticfinalIntegerDISABLE=1;
    }
}


通过 [类名.内部类名.属性] 访问和调用,例如:

ResponseMessage.Status.ENABLE、

ResponseMessage.Status.SUCCESS、

ResponseMessage.Status.WARN


小贴士:枚举尽量不要使用中文声明,如 FEMALE 直接声明为 「女性」。另外枚举是单例的,因此无法 clone 和反序列化。


3 总结

对于魔法值在业务逻辑上面好像没有什么太大的影响,也不是很致命的问题,他不影响我们的代码运行,也不影响我们代码的使用。但是为了遵循规范,有效避免一些不必要的问题时,提升我们的开发效率和提高可读性。用常量或者参数,有如下好处:


1)代码更容易看懂,代码逻辑更清晰

看到代码就知道意义。业务逻辑中常用数字代表特定的意义。比如1:开启,0:关闭;1:男性,0:女性。如果直接看到数字,什么鬼?我都不知道是什么。


2)代码维护和优化更容易

如果随便用魔法数字,那么如果要修改,我自己都怕,鬼知道,这个魔法参数,和其他代码上的联系。比如,一个地方的数字“1”和另一个地方的数字“1”,这连个“1”他们是亲戚吗?谁知道!


附录-阿里巴巴java开发手册


阿里云「《阿里巴巴Java开发手册(嵩山版)》」

链接:https://developer.aliyun.com/ebook/394?spm=a2c6h.14164896.0.0.292c1994WVcu2x


阿里云「《阿里巴巴Java开发手册(泰山版)》」

链接:https://developer.aliyun.com/ebook/330?spm=a2c6h.14164896.0.0.292c1994WVcu2x


阿里云「《阿里巴巴Java开发手册(华山版)》」

链接:https://developer.aliyun.com/ebook/7413?spm=a2c6h.14164896.0.0.62651994ULUDwQ


阿里云「《阿里巴巴Java开发手册(终极版)》」

链接:https://developer.aliyun.com/ebook/386?spm=a2c6h.14164896.0.0.292c1994WVcu2x


2020版

链接: https://pan.baidu.com/s/1Zls_FUBKfGksU1GR3BGGGA

密码: titz


2019版

链接: https://pan.baidu.com/s/1cvCVQvjmxVlMwzd7mxDZqg

密码: j74h


2018版

链接: https://pan.baidu.com/s/1FbabpNhLxppUbj8NqknTZQ

密码: mm7r


2017版

链接: https://pan.baidu.com/s/1EsoDXp6cBalFJt1XNbvhTw

密码: 6u6l

相关文章
|
2月前
|
人工智能 前端开发 Java
2025年WebStorm高效Java开发全指南:从配置到实战
WebStorm 2025不仅是一款强大的JavaScript IDE,也全面支持Java开发。本文详解其AI辅助编程、Java特性增强及性能优化,并提供环境配置、高效开发技巧与实战案例,助你打造流畅的全栈开发体验。
279 4
|
2月前
|
前端开发 JavaScript Java
Java 开发中 Swing 界面嵌入浏览器实现方法详解
摘要:Java中嵌入浏览器可通过多种技术实现:1) JCEF框架利用Chromium内核,适合复杂网页;2) JEditorPane组件支持简单HTML显示,但功能有限;3) DJNativeSwing-SWT可内嵌浏览器,需特定内核支持;4) JavaFX WebView结合Swing可完美支持现代网页技术。每种方案各有特点,开发者需根据项目需求选择合适方法,如JCEF适合高性能要求,JEditorPane适合简单展示。(149字)
278 1
|
2月前
|
安全 Java 领域建模
Java 17 探秘:不容错过的现代开发利器
Java 17 探秘:不容错过的现代开发利器
118 0
|
9天前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
9天前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
30 0
|
1月前
|
安全 Java 数据库
Java 项目实战病人挂号系统网站设计开发步骤及核心功能实现指南
本文介绍了基于Java的病人挂号系统网站的技术方案与应用实例,涵盖SSM与Spring Boot框架选型、数据库设计、功能模块划分及安全机制实现。系统支持患者在线注册、登录、挂号与预约,管理员可进行医院信息与排班管理。通过实际案例展示系统开发流程与核心代码实现,为Java Web医疗项目开发提供参考。
87 2
|
1月前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
131 3
|
1月前
|
安全 Oracle Java
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
178 0
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡