簡體   English   中英

接口字段的“公共”和“公共最終”是多余的嗎?

[英]Are “public” and “public final” redundant for interface fields?


我正在閱讀這篇文章為什么在Java中使用靜態嵌套接口? 特別是第一個答案。 在該答案中寫道,在界面字段上使用“public”或“public final”這些詞是多余的。 我的問題是:為什么? 我為什么要刪除它們? 如果我有這樣的事情:

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

這不是說我希望add方法由任何類實現而remove方法只能由我同一個類的類實現嗎?

接口方法的“公共”和“公共最終”是多余的嗎?

是。

接口中的所有方法都是隱式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工具......或其他人閱讀和維護你的代碼。 國際海事組織,對冗余關鍵字的存在與否賦予任何意義是不明智的。

您不能在接口中聲明final方法。 字段總是final但方法總是abstract (而且永遠不是final )。 您無法定義僅由同一包中的類實現的接口方法。 *來自Java語言規范的9.3節

接口主體中的每個字段聲明都是隱式的public,static和final。 允許為這些字段冗余地指定任何或所有這些修飾符。

第9.4節

接口主體中的每個方法聲明都是隱式公共的(第6.6節)。

接口主體中的每個方法聲明都是隱式抽象的,因此它的主體始終用分號表示,而不是塊。

允許但不鼓勵作為樣式,為接口中聲明的方法冗余地指定公共和/或抽象修飾符。

*正如Paul Bellora在評論中指出的那樣,如果您想限制其可見性,您可以將界面本身打包為私有(或受保護,甚至私有)。

  • 根據定義,接口是抽象的,因此接口上的abstract修飾符是多余的。
  • 接口和注釋中的變量自動為public,static和final,因此這些修飾符也是多余的。
  • 由於注釋是一種界面形式,因此它們的字段也會自動公開,靜態和最終,因為它們的注釋字段是自動公開和抽象的。
  • 根據定義的最終類不能擴展,因此最終類方法的最終修飾符是多余的。

閱讀本文: http//checkstyle.sourceforge.net/config_modifier.html

是的,公眾是多余的,因為在Interface所有方法都是publicabstract

我認為添加publicabstract是一種糟糕的風格,因為兩者都是隱式應用的。

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

這看起來更干凈,並且表明你知道它們是公開的

來自Java語言規范 (JLS)

9.4。 抽象方法聲明
接口主體中的每個方法聲明都是隱式公共的(第6.6節)。

接口主體中的每個方法聲明都是隱式抽象的,因此它的主體始終用分號表示,而不是塊。

允許但不鼓勵作為樣式,為接口中聲明的方法冗余地指定公共和/或抽象修飾符。

我在沒有方法的public關鍵字的情況下編寫接口。 這是多余的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM