我希望能够在一个程序包中编写一个Java类,该程序包可以访问另一个程序包中某个类的非公共(public)方法,而不必使其成为另一个类的子类。这可能吗?
最佳答案
这是我在JAVA中用来复制C++ friend 机制的一个小技巧。
可以说我有一个Romeo
类和另一个Juliet
类。由于仇恨原因,他们处于不同的包裹(家庭)中。Romeo
想要cuddle
Juliet
,而Juliet
想要只让Romeo
cuddle
她。
在C++中,Juliet
将Romeo
声明为(情人)friend
,但是在Java中没有这样的东西。
这是类和技巧:
女士优先 :
package capulet;
import montague.Romeo;
public class Juliet {
public static void cuddle(Romeo.Love love) {
Objects.requireNonNull(love);
System.out.println("O Romeo, Romeo, wherefore art thou Romeo?");
}
}
因此,方法
Juliet.cuddle
是public
,但是您需要使用Romeo.Love
来调用它。它将Romeo.Love
用作“签名安全性”,以确保只有Romeo
可以调用此方法,并检查该爱情是否真实,以便运行时将抛出NullPointerException
(如果是null
)。现在男孩:
package montague;
import capulet.Juliet;
public class Romeo {
public static final class Love { private Love() {} }
private static final Love love = new Love();
public static void cuddleJuliet() {
Juliet.cuddle(love);
}
}
类
Romeo.Love
是公共(public)的,但其构造函数是private
。因此,任何人都可以看到它,但是只有Romeo
可以构造它。我使用静态引用,因此从未使用过的Romeo.Love
仅构造一次,不会影响优化。因此,
Romeo
可以cuddle
Juliet
,只有他可以,因为只有他才能构造和访问Romeo.Love
实例,这是Juliet
对其进行cuddle
所要求的(否则她会用NullPointerException
拍你一巴掌)。