所谓魔法值,是指在代码中直接出现的数值,只有在这个数值记述的那部分代码中才能明确了解其含义。

1. 前言

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

public void attend(String value) {

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

//todo

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

//todo

} else {

//todo

}

}

脑壳疼!从 Java 语法上无懈可击,但是从业务上却让人无法理解其中 0 和 1 的含义它们统称为魔法值 。 对于上面的代码我们往往需要通过上下文推断出来逻辑,如果是非常复杂的业务或者10年前的代码那就更惨了,搞不好文档也没有。为了可读性,所以我们要尽量避免出现魔法值。今天就来讲几种避免魔法值的操作。

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. 总结

今天我们了解了如何优雅处理编码中的魔法值,特别是枚举方案。希望对你有用。

原文:https://www.cnblogs.com/aaaazzzz/p/14373257.html

java 不要使用魔法值_Java代码中的魔法值相关推荐

  1. java 魔法值_Java代码中的魔法值

    所谓魔法值,是指在代码中直接出现的数值,只有在这个数值记述的那部分代码中才能明确了解其含义. 1. 前言 重构老代码中遇到了不少类似下面这种写法: public void attend(String ...

  2. java异常统一处理_Java 代码中的全局异常处理

    最近接手一个新项目,写用例的时候去翻看代码,发现部分代码里缺少基本的异常处理,包括对参数异常以及业务异常的处理.对照之前负责过的异常处理做得比较好的项目,给开发提了几点建议,顺便又去翻看了之前项目的代 ...

  3. java元素符号是什么_Java 代码中 @ 符号是什么意思?

    展开全部 annotation. Annotation,是Java5的新特性,下面是Sun的Tutorial的描述,因为是英文,这里我翻译下,希望能够比较清晰323131333532363134313 ...

  4. java程序优化快捷键_Java 代码中针对性能优化的总结方案

    在一个好的项目中代码优化是永远离不开的话题,如果有充足的时间开发和维护代码,必须考虑每个可以优化的细节,日积月累,项目的质量才会上升,代码优化是绝对有必要的工作.代码优化的主要目的是减少代码块,提升代 ...

  5. java ip 白名单_Java代码中对IP进行白名单验证

    public classipUtil {//IP的正则,这个正则不能验证第一组数字为0的情况//private static Pattern pattern = Pattern//.compile(& ...

  6. java ip加密如何访问_java代码中如何实现http访问

    作者:释怀Na 出自:CSDN 原文:blog.csdn.net/qq_35906921/article/details/98076258 java代码中如何实现http访问 大概的实现就是 请求ht ...

  7. java输出日志_java代码中如何正确使用loggger日志输出

    java代码中如何正确使用loggger日志输出 发布时间:2019-06-28作者:spider阅读(2980) 当你遇到问题的时候,只能通过debug功能来确定问题,你应该考虑打日志,良好的系统, ...

  8. java的注释规范_Java代码注释规范

    1,单行(单行)-简短说明: ///... 单行注释: 代码中的单行注释. 最好在注释前有一个空行,并在其后加上与代码相同的缩进级别. 如果无法完成一行,则应使用块注释. 评论格式: 在行首注释: 在 ...

  9. Java面试没过_Java面试中遇到的坑【填坑篇】

    1.StringBuilder替代String拼接,面试中经常会问到 String,StringBuilder,StringBuffer的区别. 解答:String类作为java语言中最常见的字符串类 ...

最新文章

  1. 《图解HTTP》读书笔记--第1章 了解Web及网络基础
  2. 云宇宙iwemeta: 亚马逊全面进军元宇宙
  3. eclipse查看git地址_Git大文件管理:函数计算和OSS支持的Git LFS服务器
  4. [python]使用virtualenv处理python版本问题
  5. iOS 开发之--使用AFNetWorking3.1.0上传单张/多张图片
  6. 从MongoDB GridFS流式传输文件
  7. 昆明学院计算机专业在哪个校区,昆明学院有几个校区及校区地址
  8. 3星|《财经》2017年第29期:未来,国有资本的收益和变现都是补贴社保的渠道...
  9. 周志华 机器学习ppt
  10. matlab复数参数的虚部已忽略,[问题] 复数 X 和/或 Y 参数的虚部已忽略
  11. 一个屌丝程序猿的人生(三十二)
  12. 计算机辅助翻译和人工翻译的优缺点,计算机辅助翻译的利与弊以及解决方案
  13. 神仙项目,轻松上手了解前后端分离!
  14. 孕妇适合吃哪些蔬菜?这三种蔬菜很有营养
  15. QT从入门到入土(三)——信号和槽机制
  16. progisp下载错误-error:could not find USBASP device
  17. 计算机毕业设计SSM房屋出租管理系统【附源码数据库】
  18. Python脚本——信手拈来的自动化测试工具
  19. Springboot项目打包发布找不到项目中使用的文件
  20. 分享一个有趣的斯特林发动机

热门文章

  1. wxWidgets:在 Unix (GTK+) 下打印
  2. boost::mpl::negate相关的测试程序
  3. boost::python::iterator相关的测试程序
  4. boost::movelib::unique_ptr相关用法的测试程序
  5. boost::lexical_cast用法的测试程序
  6. boost::intrusive::avltree_algorithms用法的测试程序
  7. boost::function用法的测试程序
  8. Boost:无序的bimap双图的测试程序
  9. ITK:二进制XOR两个图像
  10. VTK:Remote之FrenetSerretFrame