这个问题已经有一个答案在这里:

好吧,让我们离开辩论是否友谊破坏了封装,并且实际上试试典雅出了一个连贯的设计。这是一个双重功能:

1)一个一般性问题上如何实施:

   public class A 
   {
      friend class B;
   }

2)为什么我需要这种功能?我的一些类实现可序列化的接口。然而,我想让序列化的方法保护在得出类使我不让他们的客户(以及在文件--如果是的话,为什么不试).然而,内部课程应当能够访问它们。什么是一般方式来解决这个问题在java?

注:我使用了友谊的定义在目前的C++的标准。

感谢

有帮助吗?

解决方案

一般的解决方法是使该方法包-私人(这是默认的保护水平在Java)。这种方式中的任何代码相同的包装能够访问他们,但没有外部的代码。

Java不允许任意分享的方法与特定的外部课程。

编辑:受保护的成员实际上都是 私于包-私人的。如果你有受保护的成员,可以访问它们从衍生课程外包,并从任何类内包。所以这可能是一种解决你的问题-推导出类在另一类中包你想要出口。

一般来说,Java认为该软件包作为主要的模块的封装。公共/保护的界面是课外的包装和默认保护水平允许访问内包。

其他提示

看来,如果你想要一个门面。

你似乎有一类,需要得到公共访问的其他各种类(甚至在不同的软件包)参与执行。但你不想要的客户具有的访问。

因此,请执行情况复杂,因为要你喜欢。有一个门面,仅仅是口你想要的,委托实施的。

这个链接,提供一种方式模仿的朋友访问在Java: http://macchiato.com/columns/Durable7.html

代码复制的链接(在情况下,该网站是不可访问):

public class A {
private int privateInt = 31415;

public class SomePrivateMethods {
    public int getSomethingPrivate() { return privateInt; }
    private SomePrivateMethods() {} // no public constructor
}
public void giveKeyTo(B other) {
    other.receiveKey(new SomePrivateMethods());
}
}

public class B {
private A.SomePrivateMethods key;

public void receiveKey(A.SomePrivateMethods key) {
    this.key = key;
}

public void usageExample() {
    A anA = new A();

    //int foo = anA.privateInt; // doesn't work, not accessible

    anA.giveKeyTo(this);
    int fii = key.getSomethingPrivate();
    System.out.println(fii);
}
}

有一件事我注意到...听起来好像你不希望的方法,你要重写,因为你正在实施的序列化是公开的。有一件事虽然序列化是一个标记接口(它没有提供的方法是重写)和readObject和writeObject方法应该是私人的。

我失去了一些东西?

有两种解决你的问题,不涉及保留所有课程相同的包装。

第一是利用朋友的存取/朋友包 模式的描述(实际API设计、Tulach2008年)。

第二是使用访.有一篇文章 在这里, 说明如何访实现这一点。

相关的问题: 1, 2, 3, , 4.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top