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

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

java 魔法值_可别在Java代码中写那么多魔法值了相关推荐

  1. java 不要使用魔法值_可别在代码中写那么多魔法值了,脑壳疼!

    1. 前言 重构老代码中遇到了不少类似下面这种写法: public void attend(string value) { if ("0".equals(value)) { //t ...

  2. 魔法java_可别在Java代码中写那么多魔法值了

    1. 前言 重构老代码中遇到了不少类似下面这种写法: public void attend(String value) { if ("0".equals(value)) { //t ...

  3. java大神请出来_求java大神,请分析以下代码,写出执行结果,并解释每行结果输出的原因。...

    求java大神,请分析以下代码,写出执行结果,并解释每行结果输出的原因.classPlate{publicPlate(){System.out.println("inPlateconstru ...

  4. java面试题25 在程序代码中写的注释太多,会使编译后的程序尺寸变大。

    java面试题25 在程序代码中写的注释太多,会使编译后的程序尺寸变大. A:正确 B:错误 蒙蔽树上蒙蔽果,蒙蔽树下你和我 拿到这道题,我觉得说的贼有道理,注释太多,尺寸变大.无疑与就和驾考 一样, ...

  5. java 魔法值_可别在代码种写那么多魔法值了!

    1.前语 重构老代码中遇到了不少相似下面这种写法: publicvoidattend(Stringvalue){if("0".equals(value)){//todo}elsei ...

  6. java异常在哪一层捕获_当在一个方法的代码中抛出一个检测异常时,该异常或被方法中的 ( )结构 捕获,或者在方法的 ( ) 中声明_学小易找答案...

    [填空题]当异常已经被定义时,必须通过( ) 语句来处理它. [填空题]Catch 子句包含( )的程序段 [单选题]下列java语言的常用异常类中,属于检测异常的是() [单选题]自定义异常类时,可 ...

  7. java中getup用法_你还在 Java 代码中写 set/get 方法?赶快试试这款插件吧!

    前言 what?你的 Java 代码中还充斥着大量的 set/get 方法? 我们在刚开始学习 Java 语言的时候讲过,面向对象的三大特征就是封装,继承,和多态.在 Java 中,要保证封装性,需要 ...

  8. java黄油刀_整理和优化Java代码与Android黄油刀

    结合意见和资源 事件监听器 列表适配器, RecyclerView 代码>实施 醇> 为什么要使用黄油刀 这个库的目的是帮助开发者写出更好的代码,并试图减少在的onCreate 代码> ...

  9. java页面的模糊查询_利用java8 steam实现代码中模糊搜索以及分页实现

    实现目标 image.png 朋友让实现在后台代码中实现模糊查询; 上代码 public class demoTest { List userzList = Lists.list( new Userz ...

最新文章

  1. 推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler...
  2. 突发!美国最大输油管道遭网络攻击关闭!美媒:为其基础设施的脆弱堪忧
  3. python能谢什么_python可以写什么啊
  4. 全面容器化之后,来电科技如何实现微服务治理?
  5. 洽洽三只松鼠良品铺子,到底谁能笑傲“后坚果时代”?
  6. angularjsl路由_AngularJs ng-route路由详解
  7. js 简单弹框toast
  8. POJ1661 Help Jimmy(dp)
  9. 【mac】Mac 安装 RabbitMQ
  10. [转]文件的操作方式
  11. 全网最全MATLAB学习归纳总结(建模学习必备)
  12. 安装markdownPad+awesomium
  13. 下一代云计算架构,VMware要占“半壁江山”
  14. 安卓手机投屏到电脑的问题可以通过一个神器解决
  15. 3d Max安装失败(Microsoft Visual C++ 2010 SP1 Redistributable (x86) Failed...
  16. 使用openssl生成https证书
  17. 互联网大会蓝皮书_世界互联网大会蓝皮书
  18. js 修改动态修改class css样式
  19. 容积卡尔曼滤波CKF—目标跟踪中的应用(仿真部分—II)
  20. 微信订阅号渠道推广带参数二维码如何生成和统计呢?

热门文章

  1. r76800h和r76850hs区别
  2. 学习设计模式,你需要这样一份书单!
  3. vbnet 进程监控,监控Acad开启的数量,并且添加到开机启动
  4. UC网盘宣布关闭存储服务 4月15日前备份数据
  5. 关于tcp连接中timewait的作用
  6. Android 进程间通信机制(二) mmap 原理
  7. 如何使用vb 监控电脑活动记录
  8. pthread_create创建线程失败,返回11: Resource temporarily unavailable
  9. React内联方式使用backgroundImage
  10. android 点击文本框,android 文本框部分文字的点击事件