1

好吧,让我们离开友谊是否打破封装的争论,并实际尝试优雅地提出一个连贯的设计。这是一个双重功能:

1)关于如何实施的一般问题:

   public class A 
   {
      friend class B;
   }

2) 为什么我需要这个功能?我的一些类实现了 Serializable 接口。但是,我想在 Derived 类中保护 Serializable 方法,这样我就不会将它们暴露给客户端(以及文档——javadoc)。但是,内部类应该能够访问它们。在java中解决这个问题的一般方法是什么?

注意:我使用当前 C++ 标准中定义的友谊。

谢谢

4

5 回答 5

6

一般的解决方案是使方法包私有(这是 Java 中的默认保护级别)。这样,同一包中的任何代码都可以访问它们,但不能访问外部代码。

Java 不允许与特定的外部类任意共享方法。

编辑:受保护的成员实际上不如包私有。如果您有受保护的成员,您可以从包外的派生类和包内的任何类访问它们。所以这可能是您问题的解决方案 - 在您要导出到的包中的另一个类中派生该类。

Java一般认为包是封装的主要模块。public/protected 接口用于包外的类,默认保护级别允许包内的访问。

于 2009-03-05T14:49:13.760 回答
2

好像你想要一个外观。

您似乎有一个类需要公开访问实现中涉及的各种其他类(甚至在不同的包中)。但是您不希望客户有权访问。

因此,使实现尽可能复杂。有一个外观类,只有你想要的接口,委托给实现。

于 2009-03-05T15:08:42.293 回答
2

此链接提供了一种在 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);
}
}
于 2012-09-27T19:00:39.897 回答
0

我注意到一件事......听起来你不希望你必须重写的方法,因为你正在实现 Serializable 以公开。但有一件事,Serializable 是一个标记接口(它不提供被覆盖的方法),并且 readObject 和 writeObject 方法应该是私有的。

我错过了什么吗?

于 2009-03-05T15:44:38.243 回答
0

您的问题有两种解决方案,它们不涉及将所有类保存在同一个包中。

第一种是使用(Practical API Design, Tulach 2008) 中描述的 Friend Accessor/ Friend Package模式。

二是使用OSGi。这里有一篇文章解释了 OSGi 是如何做到这一点的。

相关问题:1234

于 2011-05-27T15:45:03.900 回答