在 Java 中维护常量的最佳实践

Posted

技术标签:

【中文标题】在 Java 中维护常量的最佳实践【英文标题】:Best practice for maintaining constants in Java 【发布时间】:2015-01-13 19:45:50 【问题描述】:

我对 Java 项目维护中的常量有一个古老的疑问。从我的角度来看,当我们尝试将常量放在这样的 Abstract 类中时:

public final class MyConstants 
public static final String CONSTANT1 = "const1";
public static final String CONSTANT2 = "const2";
public static final String CONSTANT3 = "const3";
public static final String CONSTANT4 = "const4";

之后在项目的类中使用这些常量:

public void myMethod(final Map params) 
final String myparam = (String) params.get(MyConstants.CONSTANT1);
//DO SOMETHING WITH PARAMS

它导致了样板代码、常量的冗长使用并且没有真正的进步。另一方面,如果我们将这些常量放在类中,因为人们不喜欢它。他们说“我们在某处声明相同的常量怎么样?”问题是维护问题,如果我们更改该类中的这些常量,则可以在多个部分上看到更改而没有任何大问题。

这些常量主要用于映射 web 服务的 java 透视图,而不必像基于 WSDL 的 JAXB 那样生成 POJO,web 服务操作直接映射到 Java 中的键值映射。 我想知道您对这种方法有何看法,以及我们是否还有其他选择。

谢谢。

【问题讨论】:

不要使用原始类型。 Map 应该被参数化。 一个常数(通常)不能在没有重大变化的情况下发生变化。 这与任何其他 API 重大更改没有什么不同。 那么问题只是 什么 应该是一个常量,什么应该只是代码中的文字.. @DavidConrad 你是不是在说这样的话: Map 以防同样的问题,我们只是放了一些泛型,维护密钥的问题仍然存在。 @user2864740 你是说将这些常量保留在需要的类中并且如果更改其中的一些只是搜索整个源代码并手动更改可能是相同的结果? @LambdaPool 这些“常量”代表什么以及如何使用它们很重要;以及什么改变一个值的含义是什么。 XML 标签是常量,但使用常量/静态字段通常会导致可怕的混乱(另一方面,命名空间通常可以成为有用的常量)。此外,配置项(正如 Elliott 所指出的)一开始就不是“常量”;即使它们可以被常量引用。 【参考方案1】:

如果我理解您的担忧,请不要将这些常量硬编码为值可能是默认值,并将它们与Properties 和/或ResourceBundle(s) 一起存储。您还可以阅读Properties 上的 Java 教程。类似的,

Properties props = new Properties();
FileInputStream in = new FileInputStream("my.proprties");
props.load(in);
String v = props.get("CONSTANT_ONE", "const1"); // <-- the "1" is a default.

那么如果你以后需要更改属性,你只需要修改属性文件。

【讨论】:

常量是一个契约,就像 0 是 0。不是所有的东西都应该是一个常量,但是从可配置的属性中创建一个“常量”可以说是非常错误的。 @user2864740 我在回答如果我们还有其他选择;也许 OP 给出了一个常量键合适的例子。但是,在翻译或本地化内容时,上述内容非常合适,因为您可以在不更改代码的情况下修改翻译。 可翻译资源不是常数。常量(“CONSTANT_ONE”)可能引用资源。 @user2864740 主要用于为 java 透视映射 web 服务对我来说听起来像是一个可配置的 String(而不是一个常量)。 我只是在扮演魔鬼的拥护者。

以上是关于在 Java 中维护常量的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

在 Scala 注释中使用常量的最佳实践

Ruby 类方法或常量,最佳实践

存储分隔文本文件架构的最佳实践

常量表设计 MySQL 最佳实践

Objective-c 中局部常量的最佳实践

使用常量数据反应最佳实践