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

时间:2010-12-14 03:09:25

标签: java interface

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

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

    public void setValue();
}

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

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

此外,最佳策略是什么:

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

1 个答案:

答案 0 :(得分:29)

这是一个Common Java Idiom

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

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

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

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

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

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

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

  • MyInterface.MY_CONST
  • MyExtendingClass.MY_CONST
  • instanceOfMyExtendingClass.MY_CONST

更多信息

有关详细信息,请查看:

  • FAQ entry及其后的
  • Anon和Jeff关于滥用此表单的评论,
  • Enum type as introduced since Java 5(正如约翰所提到的那样,在许多情况下肯定会是一个更好的主意:更优雅,在传递时具有类型安全性的额外好处,并使用相当优化的构造来查找和操纵价值观。)