【问题标题】:what's the better place to declare constants, in class or interfaces?在类或接口中声明常量的更好地方是什么?
【发布时间】:2012-05-27 18:09:14
【问题描述】:

我一直在考虑将常量放在哪里,例如:

public interface MyInterface {
...
    public static final String MY_CONST = "const";
...
}

或在以下类中:

public class MyClass implements MyInterface {
...
    public static final String MY_CONST = "const";
...
}

定义常量的更好的地方是什么?

【问题讨论】:

  • 类。在 Effective Java 中讨论。
  • 为什么要上课?你能解释一下吗?
  • 这令人困惑,人们以不同的方式回答......
  • rlegendi 确实有道理,Jdoe,但是永远不要在接口中使用常量的建议太强了。是的,如果你在其中放置大量常量,特别是如果你给它们一些通用的、不具描述性的名称,它可能会导致问题。但是,启动一个新类只是为了将一两个具有良好名称的常量移入其中,这称为 overengineering。因此,与往常一样,请注意所有后果并做出明智的决定,而不是听从总是从不类型的教条。

标签: java constants


【解决方案1】:

constant interface 模式可能是不好的做法,但是在接口中放置一个常量并不会使它成为一个常量接口。因此,如果您的常量与接口级别相关(与该接口的所有客户端相关),请继续将常量放入接口中。没有错。

【讨论】:

    【解决方案2】:

    永远不要使用接口来定义常量。

    有关详细说明,请参阅 Robert C. Martin 的书 Clean Code,甚至 Josh Bloch 的 Effective Java。这些作品中详细讨论了该主题。

    主要原因是它们确实会使搜索常量值的人感到困惑。

    例如,假设您有一个 A 类实现了具有大量常量的接口。然后,B 还扩展了该类:您也将所有常量委托给子类的命名空间。

    这有点像使用大量静态导入,这也有损可读性。

    【讨论】:

      【解决方案3】:

      一个接口可以有很多实现。 如果常量表示的值对所有实现都是通用的,在接口上下文中有意义,那么最好在接口中声明它们。

      否则,如果这些值特定于某个类实现及其后代,则最好将它们放在类中。

      没有对错之分,只是上下文或多或少被挪用了。

      【讨论】:

        【解决方案4】:

        不使用接口的另一个原因:从接口导入的常量值嵌入在 using 类中。导入关系消失。当接口常量得到不同的值时,编译器不一定会检测到,并重新编译类。

        这有点难以置信,实际上是一个可以修复的错误。

        【讨论】:

        • 您说的是编译时常量,它与接口无关。这是普遍现象。
        【解决方案5】:

        接口旨在定义合同而不是实现,我将常量视为实现的一部分,因为它们对业务逻辑具有一定的价值。

        所以在一个类中定义常量是有意义的。更好的解释和推理阅读这篇文章Define Constants in Interface or Class

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-28
          • 1970-01-01
          • 1970-01-01
          • 2013-12-30
          • 1970-01-01
          相关资源
          最近更新 更多