java java官網 7下載 - 為什麼Java不允許私有成員進入接口?




7 Answers

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

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

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

java更新 jdk

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




私有接口方法是Java 9的一部分,是JEP-213一部分。 由於Java 8中的接口可以具有默認方法 ,因此私有方法允許多個默認方法使用共享私有方法。




接口用於描述由實現接口的任何類提供的API。 由於來自其定義的接口沒有狀態,因此不使用聲明字段成員。




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




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
   }
}



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

私人成員不同意這一點。




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

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

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

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

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

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

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

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

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




Related


Tags

java