为什么一些开发人员在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
接口,那么它声明的变量会发生什么变化
- 继承的类是否可以访问所有变量
- 实现的类是否需要重写声明
- 当我们可以使用抽象类来实现此目的时,在接口中声明字符串变量的目的是什么
公共的
,尤其是字段是隐式的公共静态final您别无选择。如果您尝试使用除public之外的任何其他权限级别,编译器会向您尖叫,因为这毫无意义
因此,任何实现类都将继承成员,包括这些静态常量字段
人们为什么用这个成语?
在接口中这样做有几个原因,通常是将其用作常量存储。这个习惯用法用于简单地将常量捆绑在一个地方,而不一定要以面向对象的方式将接口用作继承树的一部分
因此,您可以调用usuallMyInterface.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:对,我实际上忘记了这就是原因。对我来说,这主要是为了在有意义的时候把它们收集到某个地方,但这也是一种可能的滥用。静态导入确实更好。。。但也滥用。。。