2010-12-14 33 views
13

当我在分析项目中的代码时,我遇到了这种情况。 如果有任何类实现此接口SampleInterface我有完整的字符串常量声明的界面如下为什么有些开发人员在Java的Interfaces中声明了String对象,它是如何工作的?

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

    public void setValue(); 
} 

,会发生什么变化,它声明的变量?

  • 继承的类是否可以访问所有变量?
  • 实现的类是否需要重写声明?
  • 什么可能是宣布在接口的字符串变量,我们可以使用一个抽象类,用于此目的的目的是什么?

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

  1. 与最终的静态字段和私有构造函数的类?
  2. 一个接口的变量如上所示?

回答

26

这是一个常见的Java习惯用语

在Java中的接口,所有的成员都隐含public,并在特定领域隐含public static final你没有选择。如果您尝试使用公共以外的任何其他权限级别,编译器会对您发出尖叫,因为这样做没有任何意义。

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

为什么人们用它?

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

所以,你可以调用的usuall MyInterface.MY_CONST访问您的常量之一。

你这样做了的接口通常,当你不需要定义的任何行为,所以当你不需要任何方法。这实际上只是一个静态存储(通常,接口本身也是final)。您也可以使用abstract class,例如,如果您想封装和隐藏实现的细节。但在这种情况下,如果你有两个字段和方法,通常你的目标就是简单地给提供一些常量和一个子类的合同。

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

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

更多信息

欲了解更多信息,看看:

  • FAQ entry和它后面的人,
  • 意见通过匿名和杰夫关于滥用这种形式,
  • Enum type as introduced since Java 5(其中,和约翰所提到的,会在许多情况下,d永远是一个更好的主意:更优雅,通过类型安全的附加好处,并使用相当优化的结构来查找和操纵值)。
+0

你说是把所有的常量接口和我的执行过程中访问它们,假设如果任何类实现了这个接口,会发生什么变化的变量? – gmhk 2010-12-14 03:17:03

+0

然后你可以通过'MyInterface.MY_CONSTANT'或'MyExtendingClass.MY_CONSTANT'访问它们。甚至是'instanceOfMyExtendingClass.MY_CONSTANT',因为它们是'public static final'。 – haylem 2010-12-14 03:19:43

+0

在实现类,你也可以只把它称为'MY_CONSTANT'(这是整个“常量接口”反模式的最初原因)。但是,如果这正是你所追求的,那么添加'import static'声明是有原因的。 – 2010-12-14 03:29:23

相关问题