题
这个问题已经有一个答案在这里:
好吧,让我们离开辩论是否友谊破坏了封装,并且实际上试试典雅出了一个连贯的设计。这是一个双重功能:
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方法应该是私人的。
我失去了一些东西?