java 枚举 菜鸟

在对Java和Groovy代码进行的各种代码审查中,我经常看到魔术数字和其他随机字符串散落在整个代码库中。

例如,下面的(Groovy)代码段中的4.2是一个神奇的数字:

if (swashbuckle >= 4.2) {...
}

4.2是什么意思?

我的建议是将一个数字提取为一个常数,并为其赋予一个有意义的意图显示名称,以便我们所有人都可以继续理解我们的代码。

重构成

if (swashbuckle >= MAX_ALLOWED_CAPACITY) {...
}

即使是初学者,也可以理解The Constant的值,并开始将各地的值提取为常量。 当我谈论枚举时,编写可读代码的可能性更大,但是经验不足的开发人员很快就会陷入以下陷阱。

陷阱#1全球Über-Constants文件

应尽可能避免使用全局常量文件,例如

class Constants {private static final String PEACH_FLAME = "PFL"private static final int MAX_TOOGIT = 17private static final int MIN_TOOGIT = 8private static final String USER_NAME_AGE_PROPERTY =  "age"private static final String USER_NAME_FLOPPY_PROPERTY =  "floppy"private static final int CUSTOM_HYSLERIA_DONE = -99private static final List<String> WOBBA_RANGE = ['BZ, 'FLL', 'BZZ']// dozens of other constants...

引用StackOverflow总结得很好 :

我强烈建议不要使用单个常量类。 当时这似乎是个好主意,但是当开发人员拒绝记录常量并且该类增长到包含多达500个完全不相关的常量(与应用程序的完全不同的方面)时,这通常会变成完全不可读的常量文件。 代替:

  • 如果可以访问Java 5+,请使用枚举为应用程序区域定义特定的常量。 对于这些常量,应用程序区域的所有部分都应引用枚举,而不是常量。 您可以声明类似于声明类的枚举。 枚举也许是Java 5+的最(也是唯一的)有用的功能。
  • 如果您的常量仅对特定类或其子类之一有效,则将其声明为protected或public,然后将其放在层次结构中的顶级类上。 这样,子类可以访问这些常量值(如果其他类通过公共访问它们,则这些常量不仅仅对特定的类有效……这意味着使用该常量的外部类可能与包含该常量的类紧密耦合。常数)
  • 如果您有一个定义了行为的接口,但是返回值或参数值应该特别,那么在该接口上定义常量是完全可以接受的,以便其他实现者可以访问它们。 但是,请避免创建仅用于保存常量的接口:它可能与仅为保存常量而创建的类一样糟糕。

单个类(例如我们上面的Constants示例)很快就变成了一切 。 新秀开发人员认为,他通过将魔术数字和魔术字符串提取为常量来遵循良好的(代码审查)建议,但是团队很快就承担了新的维护负担。

如果你发现自己(或你的团队)这样做,请把负责任的车主如用户相关的常数常量UserService在和wobba相关常量WobbaConverter -不管它是什么

还请阅读上面注释中有关枚举的部分,因为常量并不是镇上唯一的孩子。 有时我的建议是……

首选枚举

如果您的常数可以很好地建模为枚举,请考虑枚举结构。 枚举比简单的常量更具通用性 ; 它们是类,可以包含属性和方法。

在负责任的父类中。

更喜欢

class Person {enum Gender { M, F }String nameGender gender
}

过度

class Person {static final String GENDER_MALE = 'M'static final String GENDER_FEMALE = 'F'String nameString gender
}

或作为使用它的班级附近的一个单独的班级 (如果它变大)。 具有功能名称的enum类的一个很好的例子是例如一些相关的(技术)数据

/*** Represents medicine domain codes.*/
public enum MedicineCode {/** Diagnosis e.g. "Muscle damage". */DIAGNOSIS("X357"),/** Units in medicinal context e.g. "cc/ml". */MEDICINE_UNIT("X523"),/*** Cause codes for diagnosis = 'Masitis' e.g. "E.coli (ECO)".*/CAUSE_CODE("X536"),/** TreatmentType e.g. "Antibiotics". */INTERVAL_TYPE("X520"),
MedicineCode(String code) {this.code = code;}private final String code;public String code() {return code;}/*** Find a {@link MedicineCode} by given String code.** @param code The code e.g. "X261"* @return found medicine code, or null*/public static MedicineCode findByCode(String code) {values().find { it.code() == code }}@Overridepublic String toString() {return name() + "(" + code() + ")"}
}

每当需要表示一组固定的常量时,都应使用枚举类型。 因此,新秀开发人员认为他通过将内容提取到枚举,封装技术数据,使用功能名称等方式来遵循良好的(代码审查)建议,但通常会陷入

陷阱#2定义枚举,但未正确使用它们

因此,如果您最初具有以下方法和调用:

Medicine findMedicineForDomainCode(String code)// which you call like:
String intervalTypeCode = "X520"
findMedicineForDomainCode(intervalTypeCode)

并且您可能会引入像MedicineCode这样的枚举(请参见上文),将所有这些特定于域的技术(例如数据库“ X…”)代码(例如“ X520”)封装在一起,然后不要这样做:

Medicine findMedicineForDomainCode(String domainCode)// which one keeps calling like:
String intervalTypeCode = MedicineCode.findByCode("X520")
findMedicineForDomainCode(intervalTypeCode)

我见过像这样的团队。 是的,有一个带有值的枚举类型,但是团队在整个代码中并不十分了解如何处理它们。

第一步是直接引用枚举 。 某些菜鸟开发人员通常最初已经理解了这一点,这取决于他们是否遵循Oracle Java Enum Types教程或类似内容,但通常会导致如下所示:

Medicine findMedicineForDomainCode(String code)// which one calls like:
String intervalTypeCode = INTERVAL_TYPE.code()
// WRONG! still using Strings here
findMedicineForDomainCode(intervalTypeCode)

有了枚举意味着我们现在可以键入所有内容,包括返回类型和方法参数

只是将枚举用作容纳字符串的容器并不是我们这样做的原因:为了获得更好的类型安全性和可读性,您应该重构代码中的所有内容,以便将域代码用作MedicineCode枚举的字符串类。

更好:

// first refactor method parameter from String to MedicineCode
Medicine findMedicineForDomainCode(MedicineCode code)// now just pass an enum value
findMedicineForDomainCode(INTERVAL_TYPE)

然后,直到那时,在最后一个可能的时刻,您需要实际封装的String代码(“ X520”)–可以从枚举值中提取它。

希望这有助于定义常量和使用枚举。 我无法涵盖使用适当设计的枚举类型可能具有的所有“有效”用法和OO优势的所有其他情况,但是希望本文能够防止Java新手陷入所描述的陷阱。

翻译自: https://www.javacodegeeks.com/2016/04/2-rookie-java-constants-enums-pitfalls.html

java 枚举 菜鸟

java 枚举 菜鸟_2个菜鸟Java常量和枚举陷阱相关推荐

  1. 视频教程-零基础学Java编程—Java从小白到大咖-Java

    零基础学Java编程-Java从小白到大咖 专注编程领域,拥有多年开发经验 王小科 ¥168.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅课程,领取优惠, ...

  2. 菜鸟学习笔记:Java提升篇11(Java动态性1——注解与反射)

    Java提升篇11(Java其它高级特性--注解与反射) 注解(Annotation) JDK内置注解 自定义注解 元注解(meta-annotation) 反射(reflection) 动态语言 反 ...

  3. 菜鸟学习笔记:Java提升篇4(容器4——Collections工具类、其他容器)

    菜鸟学习笔记:Java容器4--Collections工具类.其他容器 Collections工具类 容器其他知识点 队列Queue Enumeration接口 Hashtable Propertie ...

  4. 菜鸟学习笔记:Java提升篇3(容器3——泛型、排序)

    菜鸟学习笔记:Java容器3--泛型.排序 泛型 泛型类 泛型接口 泛型方法 泛型继承 通配符"?" 泛型知识点补充 容器排序 Comparable接口与compareTo方法 C ...

  5. 菜鸟学习笔记:Java提升篇2(容器2——Map、Set、迭代器)

    菜鸟学习笔记:Java容器2--Map.Set.迭代器 Map容器 HashMap的使用 Hash表讲解 Map实现 Set容器 HashSet的使用 实现 Iterator迭代器 Map容器 Has ...

  6. 菜鸟学习笔记:Java基础篇6(数组、字符串)

    菜鸟学习笔记:Java常用类(数组.字符串) 数组 概述 数组的定义 二维数组 数组查找和排序 查找 排序 数组运用--字符串 不可变字符序列(String) 可变字符序列(StringBuilder ...

  7. 菜鸟学习笔记:Java基础篇4(面向对象三大特征)

    菜鸟学习笔记:Java面向对象篇中 继承 概念 方法重写(override) Object类 Super关键字 组合 final关键字补充 封装 访问控制符 多态 继承 概念 继续上一篇的例子: #m ...

  8. 菜鸟学习笔记:Java基础篇3(面向对象思想、程序执行过程内存分析、面向对象重要概念)

    菜鸟学习笔记:Java面向对象篇上 Java面向对象的思想 Java程序执行过程内存分析 Java垃圾回收机制 构造方法 方法重载(overload) static关键字 this关键字 Java面向 ...

  9. 菜鸟学习笔记:Java基础篇2(变量、运算符、流程控制语句、方法)

    菜鸟学习笔记:Java基础篇2 变量 基本概念 变量作用域 final关键字 运算符 算术运算符 比较运算符 逻辑运算符 位运算符 赋值运算符 条件运算符 运算符优先级 Java三种流程控制语句 顺序 ...

最新文章

  1. ios 获取沙盒文件名_iOS怎么获取并移除沙盒中Documents文件夹下的所有文件
  2. linux无法联网使用yum提示cannot find a valid baseurl for repobase7x86_64
  3. linux基础试卷笔试,顽石系列:Linux基础笔试
  4. 【git学习】git管理本地项目
  5. 计算机基础知识二进步,大学计算机基础学习知识练习进步题(含规范标准答案).doc...
  6. Java语言语法语义分析器设计与实现
  7. hibernate--
  8. 【深度学习】Tensorflow的基本操作
  9. code换取微信openid_JSamp;微信_微信授权
  10. Redis分布式锁如何提高可用性
  11. hive 修改cluster by算法_Hive入门实战(一)概述与使用
  12. 数学建模常用方法讲解(一)
  13. 烽火狼烟丨PHP远程代码执行漏洞(CVE-2022-31625、CVE-2022-31626)风险提示
  14. 利用电脑学象棋的一点想法
  15. u盘启动怎么修复计算机,计算机黑屏怎么办 如何使用u盘启动制作系统
  16. access 查找工龄大于30_sql查询工龄大于3年的员工 找出工龄超过25年的员工
  17. MATLAB国产替代软件出现,这些学校已解决被禁用问题
  18. Python 3 print() 输出自动换行
  19. 【新概念4】【7】Bats
  20. 地理信息系统软件工程技术

热门文章

  1. 倍增:喷泉 深度解析(洛谷P7167)
  2. 2021牛客OI赛前集训营-交替【生成函数】
  3. 欢乐纪中某B组赛【2019.1.27】
  4. ssl提高组周六模拟赛【2018.9.8】
  5. 数学知识总结——矩阵
  6. 双向广搜 8数码问题
  7. Http 持久连接与 HttpClient 连接池
  8. 在 Java 中初始化 List 的五种方法
  9. Ehcache介绍及整合Spring实现高速缓存
  10. 《金色梦乡》金句摘抄(九)