为什么有些开发人员在 Java 的接口中声明 String 对象,它是如何工作的?这是一个常见的Java成语人们为什么使用这个成语?更多信息

2022-09-03 04:41:32

当我在项目中分析代码时,我遇到了这种情况。我有一个具有完整字符串常量声明的接口,如下所示

public interface SampleInterface {
    String EXAMPLE_ONE = "exampleOne";
    String USER_ID     = "userId";

    public void setValue();
}

如果任何类实现此接口,那么它声明的变量会发生什么情况?SampleInterface

  • 继承的类是否有权访问所有变量?
  • 实现的类是否需要重写声明?
  • 当我们可以使用抽象类来实现此目的时,在接口中声明 String 变量的目的可能是什么?

另外,什么是最好的策略:

  1. 具有最终静态字段和私有构造函数的类?
  2. 具有上述变量的接口?

答案 1

这是一个常见的Java成语

在Java的接口中,所有成员都是隐式的,特别是字段是隐式的。你别无选择。如果您尝试使用除公共权限级别之外的任何其他权限级别,编译器会对您大喊大叫,因为它没有任何意义。publicpublic static final

因此,任何实现类都将继承成员,包括这些静态常量字段

人们为什么使用这个成语?

在界面中执行此操作有几个原因,通常将其用作常量存储。这个成语用于简单地将常量捆绑在一个地方,而不一定是以OO方式将接口用作继承树的一部分。

因此,您可以像往常一样调用以访问其中一个常量。MyInterface.MY_CONST

当您不需要定义任何行为时,通常会在接口上执行此操作,因此当您不需要任何方法时。它实际上只是一个静态存储(通常,接口也是自己制作的)。您也可以为此使用 ,例如,如果要封装和隐藏实现的详细信息。但是在这种情况下,当你同时拥有字段和方法时,通常你的目标只是为子类提供一些常量和契约finalabstract class

考虑到在你的情况下,还有一个方法签名作为接口的一部分,显然有实现这个接口的意图。在这种情况下,您仍然可以通过以下方式访问您的数据:

  • MyInterface.MY_CONST,
  • MyExtendingClass.MY_CONST
  • 或。instanceOfMyExtendingClass.MY_CONST

更多信息

有关更多信息,请查看:

  • 常见问题解答条目及其后面的条目,
  • Anon和Jeff关于滥用此表格的评论,
  • 自Java 5以来引入的枚举类型(正如John所提到的,在许多情况下,这绝对是一个更好的主意:更优雅,在传递它时具有类型安全的额外好处,并使用相当优化的构造来查找和操作值)。

答案 2