【问题标题】:Java Constants across packages跨包的 Java 常量
【发布时间】:2017-07-19 16:33:01
【问题描述】:

我有一个项目,其中包含 5 个不同的 Java 包。它们都包含具有幻数和硬编码字符串的类,我希望为其创建常量。我想知道什么是最佳实践。我应该为程序中所有类都可以导入的所有常量创建一个常量类吗?还是将常量拆分为多个更小的文件会更有效?

【问题讨论】:

  • 在什么方面更有效率?跑步速度?
  • 恕我直言,您不应该在同一个类中混合与不同关注点相关的常量。
  • 这些常量或魔法值是否会根据代码所在的环境而改变?例如,一个 dev 连接字符串与一个 prod 连接字符串?
  • ResourceBundle(s) 和 Properties 文件是很棒的东西。
  • 常量类是一种反模式。常量属于它们所属的类。 Integer.MAX_VALUE 好; IntegerConstants.MAX_VALUE 将是毫无意义的分离。而且你绝对不应该让一个类包含所有包中的常量。

标签: java constants magic-numbers


【解决方案1】:

关于最佳实践,请参阅Principle of Least Privilege

您应该提取内联硬编码常量,但您应该将所有常量放入一个整体类中。相反,将常量拆分为适合上下文的类(“多个较小的文件”),并将这些类仅保留在需要正确引用的包级别。

如果该值仅适用于一个特定的类(又名private static final),则无需将该值从该类中移除。如果只在一个地方引用它,那么将它保存在其他地方只会创造更多的工作。

如果值的作用类似于全局变量或需要在许多不同的类中访问(又名public static final),将相关值提取到单独的类中是有意义的,但可能是您应该调查的代码异味。

由于您正在使用包,请考虑使用包私有 (static final) 将您的配置值隔离到需要它的单个包中。

考虑使用配置/属性文件来注入值,而不是在一个类中显式地硬编码它们。根据您的需要,您可以使用简单的 Java 属性,或者有许多库/框架可以帮助您处理属性,例如 Spring

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 2023-03-18
    • 2012-05-19
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 2016-04-21
    相关资源
    最近更新 更多