簡體   English   中英

如何將接口設為私有,但在兩個類之間使用接口?

[英]How can I make an Interface Private but used between two classes?

我想在A類中創建一個私有接口,並由B類實現它。我的意圖是為A類提供一種方法,以調用B類上設置的方法,其他任何人都不能調用。 它們在單獨的文件中,放在單獨的程序包中。 有人有想法么?

您可以實現的最佳效果是賦予接口程序包級別可見性,並將A類和B類移到同一程序包中。

這不會阻止某人將來將另一個類添加到同一包中,從而使它可以訪問該接口。

簡短的答案是重新設計您的班級結構。

但是,如果確實需要,請考慮在Java中使用反射功能。 並且您可以注入該方法,盡管不建議這樣做。

免責聲明:不是Java程序員。

但是,如果您想利用類型系統來獲取編譯時錯誤...,通常會通過引入一種新的數據類型作為“訪問令牌”或“虛擬參數”來達到目的。 很難保留該類型的值,但是需要該類型的值作為接口中的參數。

然而,引入這樣的DoFooActionOnClassB_ButDontCallUnlessYouAreClassA就像重新命名您的方法一樣,使諸如DoFooActionOnClassB_ButDontCallUnlessYouAreClassA事情DoFooActionOnClassB_ButDontCallUnlessYouAreClassA 我認為通常會發現,在一個好的設計中,這種“虛擬類型”根本不是虛擬類型……而是對環境和狀態的捕獲,而這些狀態和狀態本來就是應該具有的。

我知道您想在類B上擁有只能從類A調用的方法。一種方法是將實際檢查推遲到運行時,但讓編譯器很難做錯事情。 因此,您可以嘗試使用只有A類才能擁有的機密,以保護B類中的方法。

public class A {
    private static final PrivateA PROOF = new PrivateA();
    public static class PrivateA {
        private PrivateA() { }
        // only A can extend PrivateA
    }
    public static void main(String[] args) {
        new B().methodForAOnly(PROOF, "A");
    }
}

在這里,A的PrivateA是只有A可以實例化或擴展的類型,而B知道這一點...

public class B {
    public void methodForAOnly(PrivateA proof, String param) {
        if (proof == null) throw new NullPointerException();
        // do something
        System.out.println(param);
    }
}

暫無
暫無

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

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