1

わかりました、友情がカプセル化を破るかどうかの議論を残して、実際にエレガントに首尾一貫したデザインを考え出してみましょう. これは 2 つの機能です。

1) 実装方法に関する一般的な質問:

   public class A 
   {
      friend class B;
   }

2) なぜこの機能が必要なのですか? 私のクラスのいくつかは、Serializable インターフェイスを実装しています。ただし、Serializable メソッドを Derived クラスで保護して、それらをクライアント (およびドキュメント -- 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

私が気づいたことの1つは、Serializableを実装しているため、オーバーライドする必要のあるメソッドを公開したくないようです。ただし、Serializableはマーカーインターフェイスであり(オーバーライドするメソッドは提供されません)、readObjectメソッドとwriteObjectメソッドはプライベートであると想定されています。

私は何かが足りないのですか?

于 2009-03-05T15:44:38.243 に答える