java很多魔法数判断_可别在代码中写那么多魔法值了,脑壳疼!

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

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

关注公众号:Felordcn 获取更多资讯

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十分钟让你明白Objective-C的语法(和Java、C++的对比)

2019独角兽企业重金招聘Python工程师标准>>> 很多想开发iOS,或者正在开发iOS的程序员以前都做过Java或者C,当第一次看到Objective-C的代码时都会头疼,Objective-C的代码在语法上和Java, C有着很大的区别,有的同学会感觉…

稀疏多项式的运算

问题描述: 已知稀疏多项式Pn(X)c1x^e1c2x^e2....cmx^em,其中nem>em-1>....>e1>0; ci!0,m>1.试采用存储量同多项式项数m成正比的顺序存储结构,编写求Pn(x0)的算法(x0为给定值),并分析你的算法的时间复杂…

I2C子系统详解1——I2C总线设备的驱动框架

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 参考博客 I2C总线驱动框架详解 linux内核I2C子系统详解 一、I2C总线的物理特征 这部分内容的简介可见博客:SPI、I2C、UART(即串口)三种串行总线详解。 &#x…

sqlite4java下载_使用sqlite4java的UnsatisfiedLinkError,没有sqlite4java-osx-amd64

我对这个问题有类似的问题:我正在运行一个使用sqlite的脚本,虽然我能够通过命令行成功运行sqlite3,但是当我尝试运行脚本时,我总是遇到这个错误:SEVERE: [sqlite] sqliteQueue[master.catalog]: error running job queuecom.almworks.sqlite4java.sqlite…

神经网络编程入门

本文主要内容包括: (1) 介绍神经网络基本原理, (2) AForge.NET实现前向神经网络的方法, (3) Matlab实现前向神经网络的方法 。 第0节、引例 本文以Fisher的Iris数据集作为神经网络程序的测试数据集。Iris数据集可以在http://en.wikipedia.or…

I2C子系统详解2——I2C核心层源码分析

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 一、前言 由I2C总线设备的驱动框架可知,I2C总线设备驱动框架涉及的文件如下: (1)I2C设备驱动层相关的文件 x210开发板的电容触摸屏gslX680采用I2C接口…

软考复习之路—组成原理

计算机系统的基础知识应该是作为一个编程人员必备的一门课程,仅仅有了解了计算机的组成,程序在计算 机中的存储状态,运算等基本内容,我们才干继续对计算机有更深层次的认识,更easy学习与上手。比方说要 想学习操作系统…

python内存管理机制错误_Python内存管理机制和垃圾回收机制的简单理解

一、内存管理机制1.由c开发出来的cpython2.include / objests3.需要下载python源码包4.Pyobject:floatPyVarObject:5.在python中所有东西创建对象的时候,内部都会存储一个数据// 维护双向链表struct _object *_ob_next;struct _object *_ob_p…

C#中几种数据库的大数据批量插入

C#语言中对SqlServer、Oracle、SQLite和MySql中的数据批量插入是支持的&#xff0c;不过Oracle需要使用Orace.DataAccess驱动。 IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider。批量插入的实现可以通过实现该接口来实现。 /// <summary>/// 提供数据…

求背包问题所有解(C++实现)

这是我学习数据结构时的一道上机作业&#xff0c;那时还没养成写注释的习惯&#xff0c;所以各位得受点苦了。 只是简易背包问题。 代码&#xff1a; 展开 1 // 背包问题所有解2 // 作者:王锦 3 // 邮箱:jinkswvip.qq.com4 5 #include "stdafx.h"6 #include <iost…

I2C子系统详解3——I2C总线驱动层代码分析

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、前言 由I2C总线设备的驱动框架可知&#xff0c;I2C总线设备的驱动框架涉及的文件如下&#xff1a; &#xff08;1&#xff09;I2C设备驱动层相关的文件 x210开发板的电容触摸屏gslX680采用I2C接…

java join 异常_Java:守护进程:thread.join()没有完成,当在一个线程中抛出异常时...

我写了一个Java守护进程(一个实现守护进程和Runnable的类)&#xff0c;现在我遇到了以下问题&#xff1a;在init()中&#xff0c;我创建了一个新线程 . Thread thread new Thread(this); 在start()中我启动新线程 . thread.start() . 在运行中我做了很多不同的事情......然后发…

硬链接与符号链接的比较?

今天就说说硬链接&#xff08;实体链接&#xff09;与符号链接&#xff08;类似Windows的快捷方式&#xff09;的不同?首先我们应知道&#xff1a;每个档案都会占用一个inode ,档案内容由 inode记录来指向;想要读取该档案&#xff0c;必须要经过目录记录的文件名来指向正确的i…

JAVA--自制斐波那契数列输出

累了&#xff0c;写点简单的。 1 public class hello {2 3 /**4 * param args5 */6 public static void main(String[] args) {7 int Fabnum 10;8 int sum 0;9 System.out.print("Serial:\t"); 10 for(int i 1…

I2C子系统详解4——I2C设备驱动层代码分析

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、前言 由I2C总线设备的驱动框架可知&#xff0c;I2C总线设备的驱动框架涉及的文件如下&#xff1a; &#xff08;1&#xff09;I2C设备驱动层相关的文件 x210开发板的电容触摸屏gslX680采用I2C接…

golang java rpc_golang两种调用rpc的方法

本文实例讲述了golang两种调用rpc的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;golang的rpc有两种方法进行调用&#xff0c;一种是rpc例子中给的&#xff1a;package mainimport ("net/rpc""net/http""log""net"&quo…

9、C语言 —— 指针的用处

为什么80%的码农都做不了架构师&#xff1f;>>> 1、用函数实现两个数的交换 ‍‍在没用函数之前&#xff0c;可以这样实现‍‍#include <stdio.h>int main() {int a 3;int b 7;int c;printf("交换前&#xff0c;a%d&#xff0c;b%d\n", a, b); …

内核中的竞争状态和互斥(简述)

以下内容源于朱有鹏《物联网大讲堂》课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 一、概念 &#xff08;1&#xff09;竞争状态&#xff08;简称竟态&#xff09;&#xff1b; &#xff08;2&#xff09;临界段&#xff08;某一段代码&#xff0c;该代码有可能…

MenuetOS

MenuetOS由芬兰人Ville Turjanmaa开发&#xff0c;是一个操作系统&#xff0c;用于和IBM PC兼容的电脑。 它由汇编语言写成&#xff0c;可以存入一只1.44MB的软盘中。 Menuet OS 的32位版本Menuet32使用GNU通用公共许可证发放&#xff0c;但64位版本Menuet64使用自己的协议发放…

php是一种,PHP是一种什么型的语言:()

案例分析一&#xff1a;假定CPU的主频是500MHz。硬盘采用DMA方式进行数据传送&#xff0c;其数据传输率为4MB/s, 每次DMA传输的数据量为8KB, 要求没有任何数据传输被错过。如果CPU在DMA初始化设置和启动硬盘操作等方面用了1000个时钟周期&#xff0c;并且在DMA传送完成后的中断…