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

最佳答案

这是我在JAVA中用来复制C++ friend 机制的一个小技巧。

可以说我有一个Romeo类和另一个Juliet类。由于仇恨原因,他们处于不同的包裹(家庭)中。
Romeo想要cuddle Juliet,而Juliet想要只让Romeo cuddle她。

在C++中,JulietRomeo声明为(情人)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.cuddlepublic,但是您需要使用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拍你一巴掌)。

07-24 16:07