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

问题描述 投票:41回答:5

这段代码:

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版本中进行了更改?

java interface static final jls
5个回答
58
投票

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

接口主体中的每个字段声明都是隐式的public,static和final。允许为这些字段冗余地指定任何或所有这些修饰符。

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

看看这个SO answer

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


3
投票

接口variables隐式地是staticfinal,因为Java接口不能自己实例化。

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

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


2
投票

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


1
投票

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


0
投票

如果interface必须被重构为一个类,那么保持冗余的public static final可能更实际。 (这听起来很奇怪,因为每个IDE都会将这些标记为冗余信息)。

编辑公平:如果没有改变很多其他地方就不会这样做(因为接口使用implements,而继承自类使用extends

编辑#2事实上,常量接口可以被认为是反模式,请参阅wikipedia - Constant Interface

© www.soinside.com 2019 - 2024. All rights reserved.