这是我在JAVA中用来复制C ++
朋友机制的一个小技巧。
可以说我有一节课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调用此方法并检查爱情是否真实,这样运行时将抛出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
只能cuddle Juliet
并且只能他可以,因为只有他可以构造和访问Romeo.Love实例,这Juliet
对cuddle
她是必需的(否则她会给你打一个NullPointerException)。