我想在A类中创建一个私有接口并让它由B类实现。我的目的是让A类调用B类上的方法集,而其他任何人都无法调用。它们位于单独的包中的单独文件中。有人有主意吗?
答案 0 :(得分:3)
您可以实现的最佳目标是提供接口包级别的可见性,并将A类和B类移动到同一个包中。
这并不会阻止某人将来在同一个包中添加另一个类,从而使其可以访问该界面。
答案 1 :(得分:0)
简短的回答是重新设计你的班级结构。
但如果你真的需要,请考虑在java中使用反射功能。虽然不推荐,但你可以注入方法。
答案 2 :(得分:0)
免责声明:不是Java程序员。
但是如果你想利用类型系统来获得编译时错误......通常会将新数据类型作为一种“访问令牌”或“虚拟参数”引入。难以获得该类型的值,但需要该类型的值作为接口中的参数。
然而,引入像这样的箍就像重命名你的方法一样令人担忧,如DoFooActionOnClassB_ButDontCallUnlessYouAreClassA
。我认为人们通常会发现,在一个好的设计中,这种“虚拟类型”根本不是虚拟类型......而是捕获你应该首先拥有的上下文和状态。
答案 3 :(得分:0)
我知道你想要在B类上拥有只能从A类调用的方法。一种方法是将 real 检查推迟到运行时但让编译器很难做到错了。因此,您可以尝试使用只有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);
}
}