繁体   English   中英

类中的静态最终字段与 Java 中的接口字段

[英]Static final field in a class vs Interface field in java

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

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

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

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

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

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

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

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

您甚至可以检查 JDK 中大多数常量的声明位置。

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

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

再次从有效的java:

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

这些接口应被视为异常,不应进行仿真。

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

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

您是否考虑过使用 ENUM 的方法或它不适合您的情况? 我认为,使用 ENUM 的方法可以为您提供一些优于常量的好处。

为什么使用枚举而不是常量?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM