对于Java接口中的常量,“public static final”是多余的吗?

时间:2013-07-11 12:02:54

标签: java interface static final jls

此代码:

interface Config {
    int MAX_CONN = 20;
}

按照我的预期编译和工作。它看起来像是:

interface Config {
    public static final int MAX_CONN = 20;
}

对于Java接口中的常量,“public static final”是多余的吗?这对于Java 1.1,1.2,1.3,1.4,...,1.8是否适用,或者是否在Java版本中进行了更改?

6 个答案:

答案 0 :(得分:57)

在Interface中声明的变量是隐式public static final。这就是JLS 9.3所说的:

  

界面正文中的每个字段声明都隐式 public,static和final 。允许为这些字段冗余地指定任何或所有这些修饰符。

通读JLS以了解为何完成此操作。

看看这个SO answer

  

接口变量是静态的,因为Java接口本身无法实例化;必须在没有实例的静态上下文中分配变量的值。最终修饰符确保分配给接口变量的值是一个真正的常量,不能由程序代码重新赋值。

答案 1 :(得分:3)

接口variables隐含staticfinal,因为Java接口无法自行实例化。

  

接口是使用interface关键字声明的,并且可能只包含方法签名和常量声明(声明为静态和最终的变量声明)。接口可能永远不会包含方法定义。

http://en.wikipedia.org/wiki/Interface_(Java)

答案 2 :(得分:3)

接口:系统需求服务。

在接口中,变量默认是由public,static,final访问修饰符分配的。因为:

public:有时接口可能会放在其他软件包中。因此,它需要从项目中的任何位置访问变量。

静态:这样的不完整类无法创建对象。因此,在项目中,我们需要访问没有对象的变量,以便我们可以借助

interface_filename.variable_name

最终:假设一个接口由许多类实现,并且所有类都尝试访问和更新接口变量。因此,这会导致数据更改不一致并影响其他所有类。因此,需要使用final声明访问修饰符。

答案 3 :(得分:2)

接口变量是静态的,因为Java接口本身无法实例化。必须在静态上下文中分配变量的值 - 不存在实例。最终修饰符确保分配给接口变量的值是一个真正的常量,不能由程序代码重新赋值。

答案 4 :(得分:1)

接口变量始终是静态的和最终的。

答案 5 :(得分:0)

如果必须将interface重构为一个类,则保留冗余public static final可能更为实用。 (这听起来很奇怪,因为每个IDE都将其标记为冗余信息。)

编辑:公平地说:如果不更改许多其他位置,就不会这样做(因为接口正在使用implements,而从类继承则使用extends

EDIT#2 实际上,常量接口可以看作是反模式,请参见wikipedia - Constant Interface