什么时候应该在自己的文件中定义常量?

When should constants be defined in their own files?

我注意到一些项目喜欢将常量存储在它们自己的文件中,即在全局和​​主程序循环中使用的常量可能会使主文件混乱,所以他们可能希望将它们放在其他地方然后 reference/import file/class.

我了解到,在编写 OOP class 时,您希望将所有常量保留在 class 文件的 header 中,以便可以静态引用它们:

myCar.setColour(Colour.RED);

其中 REDColour class 中的颜色常量。

拥有大量常量的做法是什么,它们应该只是位于主文件的顶部,还是以任何方式明智地拥有一个ProgramConstants class 是纯静态的,public 并且可供阅读?

我更喜欢将常量放入 classes 中它们在逻辑上属于的地方。

不要像ProgramConstants那样把不相关的常量放到class中,因为你会创建一堆乱七八糟的常量,这将变得难以维护。

不,您不应该将所有常量放在主 class 的顶部或它们自己的 class 中,它们应该放在任何 class 逻辑上关联的地方与.

问题是,如果程序员看到一个通用的地方可以放置某些东西,例如常量文件,那么他们会将所有常量放在这里以维护模式,而他们应该将它们放在正确且合乎逻辑的位置.拥有一个大的常量文件使得使用常量变得更加困难,因为它们实际上是未分类的并且破坏了模块化。作为架构师,您的职责是避免设计带有此类陷阱的系统。

因此,举例来说,假设您有与 Java 应用程序的 运行 相关的系统属性,那么在您的主 class 中一定要有几个这样的常量。如果你最终在主 class 中有太多,那么将它们移到同一个包中的 SystemProperties class 中。当程序员需要几个常量供自己使用时,例如您示例中的颜色,他们应该创建自己的颜色 class,并将其放入与包含这些常量的功能关联的包中。

What is good practice for having a large amount of constants, should they just be at the top of your main file or is it in any way wise to have maybe a ProgramConstants class

常量的放置位置取决于常量的类型。

JDK中的Integerclass有一个叫做MIN_VALUE的常量,它定义了一个int的最小值。 Character class 定义了一个名为 MIN_VALUE 的常量,它定义了一个字符的最小值。

将上述方法与定义全局 WrapperConstants class/enum 两个常量即 CHAR_MIN_VALUEINT_MIN_VALUE 的方法进行比较。您很快就会为其他数据类型向该文件添加更多常量。(LONG_MIN_VALUEFLOAT_MIN_VALUE 等等...)

当您还想定义 MAX_VALUE 时会发生什么?看看你的 class 能多快爆炸?可读性怎么样。 WrapperConstants.CHAR_MIN_VALUE 是否比 Character.MIN_VALUE 更具可读性?不是真的。

在 classes 中定义它们相关的常量是进入 IMO 的方式。也就是说,并非所有常量都属于 Java classes/interfaces/enums。一些常量(例如错误消息)最好放在消息 bundles/property 文件中。

"Should all constants be defined in a single file?"

绝对不是。在除最小程序之外的所有程序中,这将创建一个 contention/mess 点。与 'global variable' 反模式非常相似。

"Should constants be in their own files?"

同样,不。从广义上讲,常量分为三种类型,每一种都需要以各自略有不同的方式进行分组。

  1. 属于内部实现细节的常量,它们与使用它们的实现代码很接近。
  2. Public API 常量。那是构成 API 的公开 public 契约的一部分的常量,它们属于接近正在定义的 API。
  3. 程序的系统配置。这些常量属于系统的 bootstrap 代码。