为什么有些开发人员在他们的Java接口中声明String对象,它是如何工作的?

gmh*_*mhk 13 java interface

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

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

    public void setValue();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  1. 一个包含最终静态字段和私有构造函数的类?
  2. 如上所示的变量接口?

hay*_*lem 29

这是一个普通的Java成语

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

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

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

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

所以你可以调用usuall MyInterface.MY_CONST来访问你的一个常量.

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

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

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

更多信息

有关更多信息,请查看:

  • 这个FAQ条目及其后面的条目,
  • Anon和Jeff关于滥用此表格的评论,
  • 从Java 5开始引入的枚举类型(正如约翰所提到的那样,在许多情况下肯定会是一个更好的主意:更优雅,在传递时具有类型安全性的额外好处,并使用相当优化的构造来查找和操作价值).

  • 应该注意的是,严格地使用接口作为"常量存储"是一种可怕的做法.更好的方法是使用私有构造函数将常量存储在final类中.最好是将常量存储在实际定义与这些常量值相关的行为的接口/类中. (5认同)