![](/img/trans.png)
[英]Is “public static final” redundant for a constant in a Java interface?
[英]Are “public” and “public final” redundant for interface fields?
我正在閱讀這篇文章為什么在Java中使用靜態嵌套接口? 特別是第一個答案。 在該答案中寫道,在界面字段上使用“public”或“public final”這些詞是多余的。 我的問題是:為什么? 我為什么要刪除它們? 如果我有這樣的事情:
public interface Int1 {
public void add();
void remove();
}
這不是說我希望add
方法由任何類實現而remove
方法只能由我同一個類的類實現嗎?
接口方法的“公共”和“公共最終”是多余的嗎?
是。
接口中的所有方法都是隱式public
和abstract
(但不是final
)。
界面中的所有字段都是隱式public
, static
和final
。
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在評論中指出的那樣,如果您想限制其可見性,您可以將界面本身打包為私有(或受保護,甚至私有)。
閱讀本文: http : //checkstyle.sourceforge.net/config_modifier.html
是的,公眾是多余的,因為在Interface
所有方法都是public
和abstract
。
我認為添加public
或abstract
是一種糟糕的風格,因為兩者都是隱式應用的。
public interface Int1 {
void add();
void remove();
}
這看起來更干凈,並且表明你知道它們是公開的
來自Java語言規范 (JLS)
9.4。 抽象方法聲明
接口主體中的每個方法聲明都是隱式公共的(第6.6節)。接口主體中的每個方法聲明都是隱式抽象的,因此它的主體始終用分號表示,而不是塊。
允許但不鼓勵作為樣式,為接口中聲明的方法冗余地指定公共和/或抽象修飾符。
我在沒有方法的public
關鍵字的情況下編寫接口。 這是多余的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.