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

article/2025/9/8 10:44:16

760b779ea5553448a1e4d566fdb68b80.gif

1. 前言

重构老代码中遇到了类似这种写法:

public void attend(String value){

if ("0".equals(value)) {

//todo

} else if ("1".equals(value)) {

//todo

} else {

//todo

}

}

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

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

2. 避免魔法值的一些操作。

一般魔法值都是不经常变动的。对于魔法值的处理要结合业务和作用域。

2.1 静态常量

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

private static final String FEMALE = "0";

private static final String MALE = "1";

public void attend(String value){

if (FEMALE.equals(value)) {

//todo

} else if (MALE.equals(value)) {

//todo

} else {

//todo

}

}

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

2.2 使用接口

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

public interface Gender{

String FEMALE = "0";

String MALE = "1";

}

2.3 使用枚举

但是接口的意义在于提供抽象的功能而不是存储一些常量值,显然违背了接口设计的初衷。所以jdk1.5引入了枚举类型 enum。

public enum GenderEnum {

FEMALE,

MALE

}

很多情况这种写法就够用了,你可以通过 GenderEnum.MALE.ordinal() 获取对应枚举的数字序号,也可以通过GenderEnum.MALE.name() 获取对应枚举的字符串名称。他们大多数情况下都可以用来进行一些逻辑标识。但是满足不了我们上面最初的设计,我们需要来改造一下枚举类的构造函数。

public enum GenderEnum {

FEMALE("0"),

MALE("1");

private final String value;

GenderEnum(String value) {

this.value = value;

}

public String value(){

return this.value;

}

}

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

我们给自己再增加点需求,以达到你的枚举更加友好的可读性。

public enum GenderEnum {

UNKNOWN("-1", "未知"),

FEMALE("0", "女性"),

MALE("1", "男性");

private final String value;

private final String description;

GenderEnum(String value, String description) {

this.value = value;

this.description = description;

}

public String value(){

return this.value;

}

public String description(){

return this.description;

}

}

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

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

3. 总结

今天我们了解了如何优雅处理编码中的魔法值,特别是枚举方案。希望对你有用,关注微信公众号:Felordcn 了解更多编程实战教程。

往期推荐:

723b6e0f267333ed0a2c5a4a8bc6a234.png

让我知道你在看

123abeb4e8fa2b3849199efc6b201f91.gif


http://chatgpt.dhexx.cn/article/GQw8D75x.shtml

相关文章

IDEA快速去除魔法值

背景 写代码有的时候为了方便,会在代码里面留下很多字符串之类的变量。这种便便会被定义为魔法值。 这种变量正常来讲不影响阅读的。所以一般情况下,我们都不会去处理它。 但是当项目越来越大的时候,我们发现很多地方都有可能使用了同一个…

魔法值与解决办法

1.什么是魔法值 魔法值是指代码中突然出现的数字,之所以称为魔法值,是因为这个20可以有多种意义。在新来的员工接手你的代码时,他们产生疑问:为什么要设这个20,背后有什么秘密吗。大大降低了代码的可维护性。 2.解决办…

java怎么字符连接换行_Java中的换行、转义字符和连接字符-Go语言中文社区

语句输出的换行 我们之前完成了我们的第一个Java输出语句,接下来我们可以做一个简单的输出换行与不换行操作。 例如:我们输出天王盖地虎和宝塔镇河妖 public class Demo1 { public static void main(String[] args) { System.out.println("天王盖地…

java csv 换行_javacsv如何换行输入

javacsv如何换行输入 [2021-02-10 01:25:25] 简介: php去除nbsp的方法:首先创建一个PHP代码示例文件;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐:《PHP视频教 java怎么输入换行…

java输出流怎样换行_Java中输出流续写和换行写方法,需要用到的构造方法的知识点...

/* FileOutputStream​(String name, boolean append) 创建文件输出流以指定的名称写入文件。 FileOutputStream​(File file, boolean append) 创建文件输出流以写入由指定的 File对象表示的文件。 创建指定File对象表示的文件中写入数据的文件输出流 构造方法的参数: String …

Java输入换行结束

问题出现 : 我在写一个程序的时候,会发现当我想要用while()循环得到一组数字的时候,不加控制条件while()循环就不会停止。 Scanner scanner1 new Scanner(System.in);while(scanner1.hasNext()){System.out.println(scanner1.nextInt());} …

java中的换行

纯copy的 \r return 到当前行的最左边 \n newline 向下移动一行,并不移动左右。 \r\n ("\r","\n"和"\r\n"),导致输出结果可能出现错误或不一致。建议在代码中统一使用一个…

Java中换行输出的两种方法

效果: 方法一: public class ChairMan{public static void main(String[] args){System.out.printlin("姓名:法外狂徒");System.out.printlin("性别:男");System.out.printlin("家庭住址:北…

Java换行输出的5种方式

///可以在格式化输出类型%n来指定输出一行,其效果等同于println ///println()相当于printf( ),即另起一行输出对应的参数后,再进行一次换行

java常识-java怎么换行

文章目录 "\r"和"\n"的区别"\r"和"\n"的由来回车键和输入的"\n"有不同吗? 系统影响java使用换行符的几种方式 “\r"和”\n"的区别 回车 \r 本义是光标重新回到本行开头,r的英文return,控…

使用一片74LS74实现四分频

1.问题 要求使用一片74LS74搭建四分频电路。 2.74LS74介绍 74LS74是一个集成2个D触发器,可以用作寄存器、移位寄存器,分频计数器等。 分频原理 把 U1 的 ~Q1 输出端接到 D1 输入端, 需要分频的信号输入 时钟信号输入端 CLK1,这…

74LS148+74LS47简易病房呼叫系统电路图

设计目的: (1) 设计一个可供至少6个病房呼叫的简易呼叫系统; (2) 掌握数字电路设计与调试方法,熟悉相应集成电路的使用方法。 设计功能: (1)至少能满足来自6个病房的呼叫,为每个病房设置呼叫开关…

multisim仿真 74LS147D芯片

multisim仿真 74LS147D芯片

74HC245

一、74hc245简介 74hc245是兼容TTL器件引脚的高速CMOS总线收发器(bustransceiver),典型的CMOS型三态缓冲门电路,八路信号收发器,。由于单片机或CPU的数据/地址/控制总线端口都有一定的负载能力,如果负载超…

【Multisim仿真】74LS47译码器驱动共阳数码管显示(0-8)数字显示

【Multisim仿真】74LS47译码器驱动共阳数码管显示(0-8)数字显示 Multisim仿真演示 74ls47引脚功能 LT: 试灯输入,是为了检查数码管各段是否能正常发光而设置的。当LT0时,无论输入A3,A2,A1&…

【Multisim仿真】74LS90六十进制计数器

【Multisim仿真】74LS90六十进制计数器 Multisim仿真演示 74ls90引脚图及功能 74LS90功能:二-五-十进制异步计数器(2 和5) A. 将输出QA与输入B相接,构成8421BCD码计数器; B&#…

TI公司TTL/CMOS/LVTTL,74LS/74S/74ALS/74AS/74F/74HC/74HCT/74AC/74ACT/74BCT/74ABT/74LV/74LVC/74LV区别与对比

速率 电平 速率及电平要求 短路电流/输出电阻 输出容量/扇出系数 热阻 来自TI白皮书 Solving CMOS Transition Rate Issues Using Schmitt Triggers Designing With Logic

74ls160/74ls161中文资料介绍

原文:http://www.dzdlt.com/components/2010082728887.html 74LS160 芯片同步十进制计数器(直接清零) 用于快速计数的内部超前进位 用于n 位级联的进位输出 同步可编程序 有置数控制线 二极管箝位输入 直接清零 同步计数 本电路是由4…

74HC573芯片

引脚介绍: D0~D7:8位数据输入线,常接单片机的IO口 Q0~Q7:8位数据输出线,常接负载 LE[加载数据使能]: 当LE接高电平时,Q0~Q7会实时跟随D0~D7变化。 当LE接低电平时,Q0~Q7不…

多路信号发生器(74LS00和LM324)

多路信号发生器(74LS00和LM324) (可能会更新完善…) 视频参考: 电子设计竞赛历年综合测评赛题分析-课程详情-全国大学生电子设计竞赛培训网 https://www.nuedc-training.com.cn/index/video/details/course_id/90 文…