我在分析项目中的代码时,遇到了这种情况。 我有一个带有完整字符串常量声明的接口(interface),如下所示
public interface SampleInterface {
String EXAMPLE_ONE = "exampleOne";
String USER_ID = "userId";
public void setValue();
}
如果任何类实现了这个 SampleInterface
接口(interface),它声明的变量会发生什么变化?
- 继承类是否可以访问所有变量?
- 实现的类是否需要覆盖声明?
- 当我们可以为此目的使用抽象类时,在接口(interface)中声明 String 变量的目的可能是什么?
另外,最好的策略是什么:
- 具有最终静态字段和私有(private)构造函数的类?
- 具有上述变量的接口(interface)?
最佳答案
这是一个常见的 Java 习语
在 Java 的接口(interface)中,所有成员都是隐式 public
,特别是字段是隐式public static final
。 您别无选择。如果您尝试使用 public 以外的任何其他权限级别,编译器会向您尖叫,因为它没有任何意义。
所以任何实现类确实会继承成员,包括这些静态常量字段。
人们为什么使用这个成语?
在界面中执行此操作的原因有多种,通常是将其用作常量存储。这个习语用于将常量简单地捆绑在一个地方,不一定要以面向对象的方式将接口(interface)用作继承树的一部分。
因此您可以照常调用 MyInterface.MY_CONST
来访问您的常量之一。
当您不需要定义任何行为时,您通常会通过接口(interface)执行此操作,因此当您不需要任何方法时。它实际上只是一个静态存储(通常,界面本身也是 final
)。您也可以为此使用抽象类
,例如,如果您想要封装和隐藏实现的细节。但在这种情况下,您同时拥有字段和方法,通常您的目标只是为子类提供一些常量和契约。
考虑到您的情况还有一个方法签名作为接口(interface)的一部分,显然有实现此接口(interface)的意图。在这种情况下,您仍然可以通过以下任一方式访问您的数据:
MyInterface.MY_CONST
,- 或
MyExtendingClass.MY_CONST
, - 或
instanceOfMyExtendingClass.MY_CONST
。
更多信息
有关更多信息,请查看:
- 这FAQ entry以及跟随它的人,
- Anon 和 Jeff 关于滥用此表格的评论,
- Enum type as introduced since Java 5 (正如 John 所提到的,在许多情况下,这肯定是一个更好的主意:更优雅,在传递它时具有类型安全的额外好处,并使用相当优化的结构来查找和操作值)。
关于java - 为什么有些开发人员在 Java 的接口(interface)中声明 String 对象,它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4435529/