繁体   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