【问题标题】:Is "public static final" redundant for a constant in a Java interface?对于 Java 接口中的常量,“public static final”是多余的吗?
【发布时间】:2013-07-09 16:40:55
【问题描述】:

这段代码:

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


    【解决方案1】:

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

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

    通读 JLS 以了解这样做的原因。

    看看这个SO answer

    接口变量是静态的,因为 Java 接口不能单独实例化;变量的值必须在不存在实例的静态上下文中分配。 final修饰符确保分配给接口变量的值是一个真正的常量,程序代码不能重新分配。

    【讨论】:

      【解决方案2】:

      接口:系统需求服务。

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

      public : 有时接口可能会放在其他包中。所以它需要从项目中的任何地方访问变量。

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

      的帮助下访问
      interface_filename.variable_name
      

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

      【讨论】:

        【解决方案3】:

        接口variables 隐含为staticfinal,因为Java 接口不能单独实例化。

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

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

              编辑说句公道话:如果不更改许多其他地方,就不会这样做(因为接口使用implements,而从类继承使用extends

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

              【讨论】:

                猜你喜欢
                • 2013-06-05
                • 2010-11-13
                • 2014-06-06
                • 1970-01-01
                • 2011-07-02
                • 2013-05-19
                • 2017-12-19
                • 2012-12-30
                • 1970-01-01
                相关资源
                最近更新 更多