[英]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.