可别在代码种写那么多魔法值了,脑壳疼!

栏目: IT技术 · 发布时间: 4年前

内容简介:## 1. 前言重构老代码中遇到了不少类似下面这种写法:脑壳疼!从

## 1. 前言

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

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

脑壳疼!从 Java 语法上无懈可击,但是从业务上却让人无法理解其中 01 的含义它们统称为 魔法值 。 对于上面的代码我们往往需要通过上下文推断出来逻辑,如果是非常复杂的业务或者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
        }
    }

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

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 获取更多资讯

个人博客:https://felord.cn


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

写给Web开发人员看的HTML5教程

写给Web开发人员看的HTML5教程

2012-3 / 45.00元

《写给Web开发人员看的HTML5教程》通过结合大量实际案例和源代码对HTML5的重要特性进行了详细讲解,内容全面丰富,易于理解。全书共分为12章,从HTML5的历史故事讲起,涉及了文档结构和语义、智能表单、视频与音频、画布、SVG与MathML、地理定位、Web存储与离线Web应用程序、WebSockets套接字、WebWorker多线程、微数据以及以拖曳为代表的一些全局属性,涵盖了HTML5所......一起来看看 《写给Web开发人员看的HTML5教程》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具