在接口类中定义常量以避免意外遗漏公共静态最终指令

时间:2012-10-22 09:10:16

标签: java

虽然我们都明白,在一个接口而不是一个类中声明常量(出于简洁的原因)是邪恶的,因为它污染了Java 5的命名空间,你可以使用静态导入来减少冗长(Effective Java Item 17)。但是,我的一位同事指出,在类中定义变量时,开发人员可能会错过将变量声明为final(public和static可以打折,因为缺少它可能是编译错误),而它们隐含于接口。任何反对它的论据?我想这可能之前已经详细讨论过,因为它看起来很简陋,但我的google-fu今天没有帮助我:)。如果有人可以在这里提出意见或指向我可能已经讨论过的地方,我将不胜感激。

提前致谢!

编辑: 这样定义的接口文件不会在其客户端的类层次结构中使用,但仅用于容纳常量。

2 个答案:

答案 0 :(得分:0)

我不认为在界面中定义常量是邪恶的。如果有的话,在公共类中实现constants-interface是邪恶的。 然而,这给我们留下了许多其他好的选择

  • 您可以扩展界面以添加更多常量
    • 例如,接口定义了众所周知的属性名称。然后,您可以拥有一个子接口,添加特定于您的实现的属性。
    • Constants-class通常有一个私有构造函数,这使得子类化成为不可能。
  • 并非我的所有实现类都是(公共)API的一部分。如果内部类实现了constants-interface,我认为这并不重要。
  • 假设一个方法需要常量作为方法参数:  myXmlProcessor.setProperty(XMLOptions.VALIDATING, true)
    • 你怎么知道从哪里得到常数?通常,有几个常量类,这样就有可能使用错误的类。
    • myXmlProcessor.setProperty(MyXMLProcessor.VALIDATING, true):在这里知道是对的。
  • 如果您有一个类层次结构,并且基类实现了constants-interface,它们将自动可用于子类。再次,错误的空间较小。

答案 1 :(得分:0)

如果使用后Java 5 SDK,那么为什么不评估枚举而不是使用接口来定义公共静态常量。尽管如此,这种方法并没有错。