在许多 类 中共享 Java 中的常量字符串好吗?

Is it good to Sharing constant strings in Java across many classes?

我想在一个地方使用 Java 常量字符串并在整个项目中使用它们?我很困惑这是提高可读性的好习惯吗?

如果你认为你的Strings会在很多流程中被引用,那么用它还是不错的。而且,这也是一种被广泛接受的做法。

最好创建接口并在其中声明所有常量。 E.G

public interface ICommonConstants {
    public static final String ENCODING_TYPE_UTF8="UTF-8";
} 

在你所有class你喜欢使用的地方实现这个接口constants.You可以通过调用

来使用
ICommonConstants.ENCODING_TYPE_UTF8

代码重复是一种代码异味,如果您不使用现成的常量,则需要为每个 class 一遍又一遍地重新声明字符串使用它,这很糟糕。

这会导致代码的可维护性降低,因为当复制的字符串需要更改而您忘记在其中一个 class 中更新它时,代码就会中断。

通常的做法是设置一个 class 来保存可重复使用的常量:

public final class MyDefs {
    public static final String A = "a";
    public static final String B = "b";

    private MyDefs() {
        // Utility class, don't initialize.
    }
}

简单:当多个 类 需要相同的信息时,该信息应该只有一个 "root"。

所以是的:避免在不同的地方重新声明相同的值绝对是好的做法。拥有一个 "global" 常量只是有助于避免代码重复 - 从而防止在 之后 发生错误,当您可能必须更改这些值时。

我会推荐一个 Enum,或者您可以只使用类似于实用程序 class 的静态最终字符串。我想一切都取决于你想要做什么,我没有看到任何不好的东西。如果 class 将被许多 class 共享,那很好。

一个带有(不相关的)常量的 class 有问题。这是一个 瓶颈 : 如果在一个团队中,在底部添加了一个常量,则添加常量的其他人将收到 VCS 冲突。 强制声明按字母顺序排序。它还以其他形式将此包联系在一起。仍然需要进行许多不需要的重新编译(另请参阅末尾的备注)。

java 9 中使用模块 ,您将在每个使用模块中需要 require 常量 classes 模块,可能导致不必要的模块图。

还有一些不需要命名的常量仍然不是"magic"。 在注释中作为参数。如果您需要唯一性等,注释扫描可以收集这些值。

最后还有共享常量。 接近使用过的结构 仍然是我的最爱。

常量 class 模式也经常与字符串常量一起使用。那散发着代码的味道,因为这是一种官僚主义 应该使用自动机制、面向对象、固定约定、声明性数据。

对于数据库表和列,存在更好的机制。

类 带有常量(仍然)有 技术编译问题,在 java 中,常量包含在 .class 文件中本身,导入消失。因此改变原来的常量不会通知编译器重新编译"using"class。重新编译常量 class.

后需要一个完全干净的构建