为什么一些开发人员在Java中的接口中声明字符串对象,以及它是如何工作的?

为什么一些开发人员在Java中的接口中声明字符串对象,以及它是如何工作的?,java,interface,Java,Interface,当我在分析项目中的代码时,我遇到了这种情况。 我有一个完整的字符串常量声明接口,如下所示 public interface SampleInterface { String EXAMPLE_ONE = "exampleOne"; String USER_ID = "userId"; public void setValue(); } 如果任何类实现了这个SampleInterface接口,那么它声明的变量会发生什么变化 继承的类是否可以访问所有变量 实现的类

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

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

    public void setValue();
}
如果任何类实现了这个
SampleInterface
接口,那么它声明的变量会发生什么变化

  • 继承的类是否可以访问所有变量
  • 实现的类是否需要重写声明
  • 当我们可以使用抽象类来实现此目的时,在接口中声明字符串变量的目的是什么
此外,最佳策略是什么:

  • 具有最终静态字段和私有构造函数的类
  • 与上述变量的接口
  • 这是一个常见的Java习语 在Java接口中,所有成员都是隐式的
    公共的
    ,尤其是字段是隐式的公共静态final您别无选择。如果您尝试使用除public之外的任何其他权限级别,编译器会向您尖叫,因为这毫无意义

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

    人们为什么用这个成语? 在接口中这样做有几个原因,通常是将其用作常量存储。这个习惯用法用于简单地将常量捆绑在一个地方,而不一定要以面向对象的方式将接口用作继承树的一部分

    因此,您可以调用usuall
    MyInterface.MY_CONST
    来访问一个常量

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

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

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

    更多信息 有关更多信息,请查看:

    • 这个和后面的那些
    • Anon和Jeff关于本表格误用的评论
    • (正如John所提到的,在许多情况下,这肯定是一个更好的主意:更优雅,在传递时具有类型安全的额外好处,并使用相当优化的结构来查找和操作值)

    您的意思是将所有常量放在接口中,并在执行过程中访问它们,假设有任何类实现此接口,这些变量会发生什么情况?然后您可以通过
    MyInterface.my_CONSTANT
    MyExtendingClass.my_CONSTANT
    访问它们。甚至是
    instanceOfMyExtendingClass.MY_CONSTANT
    ,因为它们是
    公共静态final
    。在实现类中,您也可以将其称为
    MY_CONSTANT
    (这是整个“常量接口”反模式的最初原因)。但是,如果这正是您所追求的,那么添加
    导入静态
    声明是有原因的。应该注意的是,严格地将接口用作“常量存储”是一种糟糕的做法。更好的方法是使用私有构造函数将常量存储在最终类中。最好是将常量存储在一个接口/类中,该接口/类实际上定义了与这些常量值相关的行为。@Anon:对,我实际上忘记了这就是原因。对我来说,这主要是为了在有意义的时候把它们收集到某个地方,但这也是一种可能的滥用。静态导入确实更好。。。但也滥用。。。