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

标签 java interface

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

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

    public void setValue();
}

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

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

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

  1. 具有最终静态字段和私有(private)构造函数的类?
  2. 具有上述变量的接口(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/

相关文章:

java - 如何在写入文本文件时使用 "tab space"

java - 如何定义抛出通用异常类型的接口(interface)?

java - 在实现接口(interface)的类上强制单例模式

c++ - 如何删除抽象类中类似的 const 和非 const 成员函数之间的代码重复?

java - 是什么导致了这个异常? for循环的构造函数是不必要的吗?

java - 这是 SSL/TLS 双向身份验证还是有什么问题?

java - Java除了并行流之外如何实现隐式并发

java - 为什么 Collections.copy 仍然复制引用,它不克隆复制的对象?

java - 根据接口(interface)信息创建列表

php - 不确定 Laravel 在接口(interface)实现方面做了什么