我希望能够在一个程序包中编写一个Java类,该程序包可以访问另一个程序包中某个类的非公共方法,而不必使其成为另一个类的子类。这可能吗?
这是我在JAVA中用来复制C ++朋友机制的一个小技巧。
C ++
可以说我有一节课Romeo和另外一节课Juliet。由于仇恨原因,他们处于不同的包裹(家庭)中。
Romeo
Juliet
Romeo想要cuddle Juliet并且Juliet只想让Romeo cuddle她。
cuddle 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调用此方法并检查爱情是否真实,这样运行时将抛出a 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.Love
public
private
因此,Romeo只能cuddle Juliet并且只能他可以,因为只有他可以构造和访问Romeo.Love实例,这Juliet对cuddle她是必需的(否则她会给你打一个NullPointerException)。
cuddle