【问题标题】:Where do you keep Constants used throughout your application?在整个应用程序中使用的常量在哪里保存?
【发布时间】:2011-09-07 10:08:30
【问题描述】:

接口是一个可以存储我的地方吗

public static final Foo bar

您是否推断它们可以从程序外部读取?你为它编了一个超类吗?

当情况出现时,你是怎么做的?

【问题讨论】:

  • 我不明白你的问题。您在寻找单例模式吗?
  • 没有。我在问什么是保存整个应用程序中使用的常量的最佳位置。单例是这样做的一种方式.. 但我们是最好的吗?

标签: java interface coding-style


【解决方案1】:

我使用了 Abdullah Jibaly 的方法,但使用了嵌套类,这提供了一种对 const 进行分组的好方法。我已经看到这深入了 3 个级别,如果选择了好的名称,它仍然可以很好地工作。

人们可能会为此选择使用 final 类而不是接口类,以避免违反 Josh Bloch 列表中的第 19 项(Effective Java 2nd edition)。

public final class Const {
    private Const() {} // prevent instantiation

    /** Group1 constants pertain to blah blah blah... */
    public static final class Group1 {
        private Group1() {} // prevent instantiation

        public static final int MY_VAL_1 = 1;
        public static final int MY_VAL_2 = 42;
    }

    /** Group2 constants pertain to blah blah blah... */
    public static final class Group2 {
        private Group2() {} // prevent instantiation

        public static final String MY_ALPHA_VAL = "A";
        public static final String MY_ALPHA_VAL = "B";
    }

}

【讨论】:

  • 如果我采用这种方法,并且每当我在 Group2 中添加一个常量时,是否需要构建所有使用 Const 的类?或者只是构建所有使用 Group2 的类?非常感谢
  • 我想这将取决于您现有的增量构建解决方案。我已经使用了带有 jdk 6 和 8 的 eclipse,并且 IDE 驱动的更新处理你所描述的变化在我的经验中并不慢。
【解决方案2】:

这是不好的做法。类旨在彼此独立,因此您应该不惜一切代价避免使用全局变量。更现实的方法是拥有一个配置文件,通常为JSONYAMLXML 文件格式,并让您的程序在启动时从该文件中读取。

【讨论】:

    【解决方案3】:

    我会使用abstract final class,因为它是修饰符的更明确的声明,而不是使用接口。但是,正如 Michael 所说,如果它们在语义上属于现有类或接口,则它们应该在逻辑上分组并成为现有类或接口的一部分。

    【讨论】:

    • Java 中没有抽象 final 类这样的东西。编译器不允许这样做。
    【解决方案4】:

    如果您谈论的是一个简单的应用程序,Constants 类方法很好:

    public class Constants {
        private Constants() {} // no way to instantiate this class
        public static final String MY_VAL = "123";
    }
    

    如果你正在构建一个更大的应用程序,你应该使用依赖注入,看看How can I inject a property value into a Spring Bean which was configured using annotations?

    【讨论】:

    • 我喜欢这个。你也可以做一个抽象类。我认为界面更干净一些
    【解决方案5】:

    我会将每个常量放入与其最密切相关的类或接口中(例如,因为它将被其方法使用)。

    一个非常诱人但最终非常愚蠢的想法是拥有一个包含应用程序中使用的所有常量的“常量类”(或接口)。乍一看,这看起来很“整洁”,但不利于可维护性,因为您希望按它们实现的功能对事物进行分组,而不是按常量等技术细节(您会将所有接口放入专用包中吗?所有抽象类?) .

    这个想法也是愚蠢的,因为那时对该类/接口的任何更改(因为常量内联)都需要重新构建使用任何常量的所有类 - 即几乎整个应用程序。因此,应用程序越大,您需要进行完全重建的频率就越高,所需的时间也就越长。我从事过这样一个项目,这个问题导致每个开发人员每隔一天暂停 15 分钟......

    【讨论】:

    • 我同意如果常量只用在一个类中,你最好直接把它放在那个类中。但是整个代码中使用的常量呢?我个人发现拥有一个全局常量类对此很有用,使用静态导入更是如此
    • 在存储常量数据的方式方面,您如何看待接口与抽象类?
    • @Rand:任何常量都有某种含义,它应该是与该含义相关的类的一部分并相应地命名。即使在整个代码中使用了一个常量,但始终与一个类相关,它显然应该是该类的一部分(例如 BorderLayout.CENTER)。如果你不能把它固定在一个特定的类上,有一个专门用于它的类或接口是可以的,但它应该特定于一个域概念或子系统,而不是常量的一般倾销场——例如Swing 常量。
    • 我刚刚删除了包含所有公共静态最终常量的public interface Constants
    • @Sorter ????
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 2013-02-10
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多