【问题标题】:Are "public" and "public final" redundant for interface fields?接口字段的“public”和“public final”是否多余?
【发布时间】:2013-06-05 08:53:35
【问题描述】:


我正在阅读这篇文章Why would a static nested interface be used in Java?,尤其是第一个答案。在那个答案中,在接口字段上使用“public”或“public final”这些词是多余的。我的问题是:为什么? 我为什么要删除它们?如果我有这样的事情:

public interface Int1 {
   public void add();
   void remove(); 
}

这是否意味着我希望 add 方法由任何类实现,而 remove 方法只能由我的同一个包的类实现?

【问题讨论】:

  • 关键字abstractpublic 对于接口内部的方法和接口本身是多余的。它们是隐含的。

标签: java interface


【解决方案1】:

对于接口方法来说,“public”和“public final”是多余的吗?

是的。

接口中的所有方法都隐含为publicabstract(但不是final)。

接口中的所有字段都隐含为publicstaticfinal

JLS 声明了这一点。它还指出这些修饰符可以省略。


为什么?那么有多种原因:

  • 字段和方法是隐含的public,因为接口的意义在于声明一个其他类可以看到的...接口。 (如果你想/需要限制访问,这可以通过接口本身的访问修饰符来完成。)

  • 字段是static,因为如果不是,您将在对象上声明可见的实例字段......这不利于封装。

  • 字段是 final,因为非最终字段是声明 public static 字段的另一种方式......从 OO 的角度来看,这很糟糕。

  • 方法是abstract,因为允许方法体可以有效地将接口转换为抽象类。

在接口中使方法抽象和字段静态的另一个原因是,如果它们不这样做,菱形继承和从两个不同接口继承方法都会有问题。

但不管怎样,这就是 Java 的定义方式,所以这些问题没有实际意义……除非您正在考虑发明自己的编程语言。

请注意,在 Java 8 中,您可以在接口中声明方法,使用 default 修饰符。在 Java 9 中,在某些情况下,您可以声明 private 方法。但是使用public 关键字仍然是多余的。


我为什么要删除它们?

您不必删除它们。 Java 编译器不在乎。 您可以删除它们,但您不必必须删除它们,除非您试图遵守一些坚持这一点的 Java 样式指南。 如果您保持一致,您的代码可能会更易读,但您可以通过在任何地方使用冗余修饰符来使其保持一致;例如添加它们而不是删除它们。

这是否意味着我希望 add 方法由任何类实现,而 remove 方法仅由我的同一个包的类实现?

不,不是那个意思。或者至少,这可能意味着对您,但对Java 编译器、其他Java 工具...或其他阅读和维护您的代码的人并不意味着。 IMO,不建议将 any 含义放在冗余关键字的存在或不存在上。

【讨论】:

    【解决方案2】:

    您不能在接口中声明final 方法。字段总是final,但方法总是abstract(而不是final)。不能定义只能由同一包中的类实现的接口方法。*来自section 9.3 of the Java Language Specification

    接口主体中的每个字段声明都是隐式的公共、静态和最终的。允许为此类字段冗余地指定任何或所有这些修饰符。

    来自section 9.4

    接口主体中的每个方法声明都是隐式公开的(第 6.6 节)。

    接口主体中的每个方法声明都是隐式抽象的,因此其主体始终由分号表示,而不是块。

    允许但不鼓励为接口中声明的方法冗余地指定 public 和/或 abstract 修饰符。

    * 正如 Paul Bellora 在评论中指出的那样,如果您想限制其可见性,您可以将接口本身设为包私有(或受保护,甚至私有)。

    【讨论】:

    • +1 注意接口本身可以是包私有的。
    • 所以我不能有一个具有包可见性的方法吗?
    • @antox - 不是界面的一部分。
    【解决方案3】:
    • 根据定义,接口是抽象的,因此接口上的抽象修饰符是多余的。
    • 接口和注释中的变量自动是公共的、静态的和最终的,因此这些修饰符也是多余的。
    • 由于注解是一种接口形式,它们的字段也自动是公共的、静态的和最终的,就像它们的注解字段自动是公共的和抽象的一样。
    • 根据定义,最终类无法扩展,因此最终类的方法上的 final 修饰符是多余的。

    阅读:http://checkstyle.sourceforge.net/config_modifier.html

    【讨论】:

      【解决方案4】:

      是的,public 是多余的,因为在Interface 中,所有方法都隐含为publicabstract

      我认为添加publicabstract 是一种不好的风格,因为两者都是隐式应用的。

      public interface Int1 {
         void add();
         void remove(); 
      }
      

      这看起来更干净,并且表明您知道它们是隐式公开的

      来自Java Language Specification (JLS)

      9.4。抽象方法声明
      接口主体中的每个方法声明都是隐式公开的(第 6.6 节)。

      接口主体中的每个方法声明都是隐式的 抽象的,所以它的主体总是用分号表示,而不是 块。

      允许,但从风格上不鼓励,冗余 为在中声明的方法指定公共和/或抽象修饰符 一个接口。

      【讨论】:

      • 这是什么意思?我不能声明受保护的方法、私有方法或具有包可见性的方法?
      • 是的,也就是说,一个接口中的所有方法都是公共的,所有实现该接口的类都必须实现该接口的所有方法,可能还有一些可以是私有的或受保护的,等等。 java中接口的意义。
      • 不要将java“类”与“接口”混为一谈(在Objectiv-C等其他编程语言中,“接口”是另一回事)
      • 如果你想让某些方法不被所有类实现,那么使用多个接口,一个类可以实现多个接口
      【解决方案5】:

      我为方法编写没有public 关键字的接口。这是多余的。

      【讨论】:

        猜你喜欢
        • 2013-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-08
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        相关资源
        最近更新 更多