jre - 為什麼Java不允許私有成員進入接口?




java更新 (9)

聲明為private的類的成員不會被該類的子類繼承。 只有聲明為protected或public的類的成員才會被聲明在聲明類之外的包中聲明的子類繼承。

Source

所以你在一個可以使用那個私有的非可繼承字段的接口中沒有任何工作方法,那為什麼它應該存在呢?

https://code.i-harness.com

為什麼Java不允許私有成員進入接口? 有什麼特別的原因嗎?


Java允許Java 9中的接口中的私有方法 。 Java 8中引入了默認方法 。多個默認方法可能需要共享一些代碼,然後可以將此代碼移動到私有方法,而不會將其暴露給外部世界。 此bugs.openjdk.java.net/browse/JDK-8071453已得到修復,並從JDK 9 build 54開始,已經重新啟動了對私有接口方法的編譯器支持。

public interface IData{
   default void processData(int data) {
      validate(data);
      // do some work with it
   }
   default void consumeData(int data) {
      validate(data);
      // do some work with it
   }
   private void validate(int data) {
     // validate data
   }
}

Java語言規範,(訪問控制)

“Java編程語言提供了訪問控制機制,以防止包或類的用戶依賴於該包或類的實現的不必要細節。”

訪問控制就是隱藏實現細節。 接口沒有要隱藏的實現。


從Java 8開始,接口可以有默認方法,從Java 9開始,允許接口具有私有方法,這些方法只能通過同一接口中的默認方法訪問。


是的,不能那樣做。 對於所有那些評論為什麼它不應該:

想像一下,我有A類,它使用接口I.B類,擴展了A類,因此也繼承了A中的所有接口方法。

現在,想像一下我想在A類中使用私有方法,但是也希望它為其他類合同定義(也許是C類,它不一定擴展為B類或A類)。

也許對於“初始化”方法,我想要使用I接口的所有類。 但顯然我不希望初始化方法公開....因為它應該只使用一次,或者在課程認為必要的時候,不僅僅是因為你想要全部使用它。

唯一的解決方案是解決方法,或者簡單地在沒有接口的情況下將init方法強制轉換為類。

我當然不明白其中的原因,但有時也會派上用場。 很明顯,Oracle同意他們在JDK 9中允許私有接口方法。

無論如何,我所做的是放置一個簡單的布爾變量,這樣接口方法(應該是私有的)在設置一次後可以標記為true(initialized = true)。 然後當再次調用時,該方法根本無效。 這樣接口方法可以實現為public,但由於構造函數(我的類)首先調用該方法,因此將變量設置為true,因此無法再次調用它。

否則,如果你只想讓類的內部工作方式使用它,你必須嘗試不同的解決方法....也許方法本身在使用它時設置一個標誌。 當標誌為false時,該方法不執行任何操作(這將是有人從類外部調用它時)。 但是,當類自己的方法調用它時,它們會快速將標誌設置為true,然後調用該方法,然後將標誌設置為false ??

到底有點靜音。 現在可能只是簡單地將私有類放入類本身並完全切斷接口。


根據Java編程語言, private members範圍僅限於聲明它的class ,並且只能通過class的方法訪問。 但是inteface沒有方法體,因此沒有使用在interface內聲明私有成員。


私人成員在界面上沒有意義。 接口是一種使用已定義方法訪問類的方法,您無需查看該類的內部。

私人成員不同意這一點。


私有字段不會完全無用,因為其他字段和內部類可以訪問它們。

但是,即使在嵌套類中也無法實現私有方法,這使得它們幾乎無用。 你可以使用反射來讀取它們,但這是一個邊緣情況。


這是因為他們沒用。

沒有辦法調用私有方法。

私有成員是實現細節。 接口是關於類可以承擔的公共角色。





java