小编典典

有没有一种方法可以模拟Java中的C ++“朋友”概念?

java

我希望能够在一个程序包中编写一个Java类,该程序包可以访问另一个程序包中某个类的非公共方法,而不必使其成为另一个类的子类。这可能吗?


阅读 299

收藏
2020-03-09

共1个答案

小编典典

这是我在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.Lovepublic,但是其构造函数是private。因此,任何人都可以看到它,但只能Romeo构造它。我使用静态引用,因此Romeo.Love从未使用过的引用只会被构建一次,并且不会影响优化。

因此,Romeo只能cuddle Juliet并且只能他可以,因为只有他可以构造和访问Romeo.Love实例,这Julietcuddle她是必需的(否则她会给你打一个NullPointerException)。

2020-03-09