加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java:重构静态常量

发布时间:2020-12-15 05:03:51 所属栏目:Java 来源:网络整理
导读:我们正在重构一些代码.我们在一个项目中开发了一个功能,我们希望在其他项目中使用这个功能.我们正在提取此功能的基础,并使其成为一个完整的项目,然后可以由其当前项目和其他项目导入.这项工作相对简单,但我们头疼不已. 当最初开发相关框架时,我们选择将各种
我们正在重构一些代码.我们在一个项目中开发了一个功能,我们希望在其他项目中使用这个功能.我们正在提取此功能的基础,并使其成为一个完整的项目,然后可以由其当前项目和其他项目导入.这项工作相对简单,但我们头疼不已.

当最初开发相关框架时,我们选择将各种常量值定义为单个类中的静态字段.随着时间的推移,这些静态成员列表增长该类在我们的代码中的很多地方使用.在我们目前的重构中,我们将把这个类的一些成员提升到我们的新框架,但留下其他成员.我们头疼的是提取要在我们的新项目中使用的此类的基础成员,更具体地说,我们应如何在现有代码中解决这些提取的成员.

我们知道我们可以将现有的Constants类子类化为这个新项目的Constants类,并且它将继承所有父项的静态成员.这将允许我们在不触及使用这些成员更改静态引用上的类名的代码的情况下实现更改.然而,这种选择固有的紧密耦合感觉不对.

之前:

public class ConstantsA {
  public static final String CONSTANT1 = "constant.1";
  public static final String CONSTANT2 = "constant.2";
  public static final String CONSTANT3 = "constant.3";
}

后:

public class ConstantsA  extends ConstantsB { 
  public static final String CONSTANT1 = "constant.1";
}

public class ConstantsB {
  public static final String CONSTANT2 = "constant.2";
  public static final String CONSTANT3 = "constant.3";
}

在我们现有的代码分支中,可以通过以下方式访问上述所有内容:

ConstantsA.CONSTANT2

我想征求关于这是否“可接受”和/或最佳实践的争论.

解决方法

>只有静态字段的类是代码气味.这不是一个班级.
>有些人使用接口,因此他们可以实现它以更容易地使用常量.但是接口应该仅用于模拟类的行为. ( http://pmd.sourceforge.net/rules/design.html#AvoidConstantsInterface)使用Java 5中的静态导入根本不需要简单的常量使用.
>你的常量是否真的是字符串,或者只是用作字符串.如果它们是某些类型的不同选项(所谓的枚举),则应使用 typesafe enumerations,使用Java 5中的枚举或 Commons Lang提供的枚举.当然,将代码转换为使用枚举可能有点工作.
>至少应该将常量拆分为具有正确业务名称的文件中的相关常量组.在IDE中移动最终成员很容易,并将更新所有用法.
>如果你负担得起,那么将它们转换为枚举. (考虑使用脚本来执行此操作,通常是可能的.)如果常量/枚举之间存在关系,则类层次结构仅有用.如果必须,你可以保留字符串,但仍然将它们视为实体,然后扩展可能对某些人有意义(描述是一种关系).如果序列化不是问题,那么第一个枚举可以是由您自己制作的简单类.枚举总是有利的,因为它们的类型安全性和额外的名称显示打算或业务/域特定的东西.
>如果常量确实是字符串常量,请使用 Properies或 ResourceBundle,可以使用纯文本文件进行配置.您可以再次使用常量名称作为资源包密钥编写重构脚本,并自动生成这两个文件.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读