如何将接口设置为私有但在两个类之间使用?

时间:2014-07-10 20:06:15

标签: java interface

我想在A类中创建一个私有接口并让它由B类实现。我的目的是让A类调用B类上的方法集,而其他任何人都无法调用。它们位于单独的包中的单独文件中。有人有主意吗?

4 个答案:

答案 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);
    }
}