【问题标题】:Static final field in a class vs Interface field in java类中的静态最终字段与Java中的接口字段
【发布时间】:2017-06-09 05:55:12
【问题描述】:

我需要在我的应用程序中创建 100 个或更多静态最终常量,根据我的理解,我可以通过以下两种方式实现:

  1. 创建一个简单的 java class 并在其中创建 static final 字段
  2. 创建一个接口并将所有变量放入其中,因为接口中的所有字段都隐含staticfinal

我在上述方法中有这些问题:

  1. 哪一种方法是实现这一目标的正确方法?
  2. 哪一种是节省内存的方法?
  3. 是否有任何设计模式可以实现这一目标?

【问题讨论】:

  • 常量必须在类而不是接口中定义
  • 关于 SO 的类似问题足够多。
  • @AmitK,我在问之前探索过,可以分享一些链接吗?那会很有帮助:)
  • 它们真的是不变的并且永远不会改变吗?
  • @eg04lt3r,是的,字段将完全不变。

标签: java oop design-patterns


【解决方案1】:

您可以参考许多有关该主题的书籍。

我会引用一个好的:“Effective Java”

第 19 条:仅使用接口来定义类型

常量接口模式是对接口的不良使用。那一个 类在内部使用一些常量是一个实现细节。 实现一个常量接口会导致这个实现细节 泄漏到类的导出 API 中。对它没有任何影响 该类实现了一个常量接口的类的用户

您甚至可以检查 JDK 大部分常量的声明位置。

Math.PI 例如在类 Math 中声明,而不是在接口中

作为一个例外,您可以在 java.io.ObjectStreamConstants 中看到类似的常量,但这些书籍仍然可以提供帮助:

再次从有效java中:

Java 平台库中有几个常量接口...

这些接口应该是 视为异常,不应仿效。

【讨论】:

  • 我不认为它回答了这个问题。
  • 几天前我又读了一遍同样的东西,joshua rock :p,+ 1 用于将书籍中的文字放在 SO 上以便于参考。
  • 是的,但是 OP 并不是说​​他打算使用常量接口反模式。
  • @ΦXocę웃Пepeúpaツ,信息非常有用且正确。它回答了我的第一个问题,你能帮我解决其他两个问题吗?
【解决方案2】:

我不会考虑它们是否应该在接口或类中,而是更多地考虑常量及其含义。

我不建议为了将它们放在一起而将所有常量放在一个地方。例如,如果一个常量与一个类直接相关,那么会说把它放在那个类中。我使用过将所有常量捆绑到一个类中的代码,我认为这不是一个好方法。

【讨论】:

    【解决方案3】:

    您是否考虑过使用 ENUM 的方法,或者它不适合您的情况? 我认为,与常量相比,使用 ENUM 的方法可以为您带来一些好处。

    Why use Enums instead of Constants?

    【讨论】:

      【解决方案4】:

      我认为方便的方法是将它们放在一个地方,如果它们具有共同的性质。无论如何,它们应该按某些属性分组。你可以像这样为他们创建类:

      public final class Consts {
          public static class GroupA {...}
          public static class GroupB {...}
          //and so on
      }
      

      有了组,这个类变得更具可读性并且更易于管理。关于内存消耗,请尝试对常量使用原语,因为它们不需要额外的空间来存储元信息。

      【讨论】:

        【解决方案5】:

        您可以通过在接口类中声明字段来随意创建最终或静态约束,所以我想使用您的选项编号 2

        【讨论】:

        • 您好,欢迎来到 StackOverflow!我强烈建议您提供一个示例作为您的答案的指南,这样您就可以确定您发布了一个事实。
        猜你喜欢
        • 2012-08-26
        • 1970-01-01
        • 2015-02-24
        • 2017-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多