该魔法值造成了一万点伤害……

简介: 1. 前言重构老代码中遇到了不少类似下面这种写法: public void attend(String value) { if ("0".equals(value)) { //todo } else if ("1".equals(value)) { //todo } else { //todo } }复制代码脑壳疼!从 Java 语法上无懈可击,但是从业务上却让人无法理解其中 0 和 1 的含义,它们统称为魔法值 。 对于上面的代码
  1. 前言

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

public void attend(String value) {
    if ("0".equals(value)) {
        //todo 
    } else if ("1".equals(value)) {
        //todo
    } else {
        //todo 
    }
}

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

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

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

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和反序列化。

  1. 总结

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

目录
相关文章
|
6月前
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个题目详解(逻辑类型题2)
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个题目详解(逻辑类型题2)
95 1
(拯救选择困难症)随机选择今天中午吃啥
(拯救选择困难症)随机选择今天中午吃啥
(拯救选择困难症)随机选择今天中午吃啥
|
存储
妈,旧电脑连加法都算错了,我要换新的
妈,旧电脑连加法都算错了,我要换新的
|
机器学习/深度学习 测试技术
PAT乙级1001 害死人不偿命的(3n+1)猜想 (15分)
PAT乙级1001 害死人不偿命的(3n+1)猜想 (15分)
85 0
|
测试技术
1001 害死人不偿命的(3n+1)猜想 (15 分)
1001 害死人不偿命的(3n+1)猜想 (15 分)
67 0
|
算法 NoSQL 安全
血的教训 ,一次订单号重复的事故我差点被开除
曾经有个项目,我们线上出了一次事故,这个事故的表象大体是这样的: 系统出现了两个一模一样的订单号,订单的内容却不是一样的,而且事情发生的不止一次,被老板发现之后,当月绩效被扣光!
血的教训 ,一次订单号重复的事故我差点被开除
|
存储 安全 Java
万恶的NPE差点让我半个月工资没了
万恶的NPE差点让我半个月工资没了
181 0
万恶的NPE差点让我半个月工资没了
钱真的可以“买”到幸福?新研究显示,最低工资每提高1美元,自杀率可减少6%
钱真的可以“买”到幸福?新研究显示,最低工资每提高1美元,自杀率可减少6%
120 0