2

というクラスがあるとしFactoryます。誰でも を作成してアクセスできるように、そのクラスを公開するつもりですfactory。工場に を作成して配布してもらいたいwidgetswidgets公共のプログラム空間の誰もではなく、ファクトリが を作成できるようにしたいだけです。ただし、メインプログラムにdistribute()a を渡すメソッドが呼び出されるようにしたいと思います。widgetその時点で、メイン プログラムはそのすべてのパブリック メソッドにアクセスできますwidget。また、必要に応じてファクトリに戻して、そのオブジェクトへのパブリック アクセスを削除することもできます。

これが可能である場合、どのようにこれを達成しますか?

4

3 に答える 3

4

あなたが探しているのは内部クラスです。内部クラスのコンストラクターを private と宣言することで、カプセル化されたクラスだけがそれにアクセスできます! 次に、外側のクラスにファクトリ メソッドを作成して、ウィジェットを構築して配布します。ここで宣言しましstaticたが、必要によっては必要ありません。

public class Factory {

  public static Widget buildWidget() {
    Widget widget = new Widget();
    return widget;
  }

  public class Widget {
    private Widget() { ... }
    public void someMethod() { ... }
  }
}

クリーンなコードでは、参照整合性に注意して他の問題に対処する必要があることに注意してください。ウィジェットを「戻す」には、ウィジェットへの他のすべての参照を解放する必要があります。Factory は、どのウィジェットが配布されたかを確かに追跡できますが、確実にウィジェットを「呼び出す」ことは非常に困難です。

于 2012-07-04T01:05:17.797 に答える
1

時間の経過とともに変化するアクセス制御について説明しています(「必要に応じて、そのオブジェクトへのパブリックアクセスを削除して、ファクトリに戻すこともできます。」)。Java はそのようには機能しません。すべてのアクセス修飾子は静的にチェックされ、プログラムの存続期間全体にわたって一定のままです。

于 2012-07-04T01:03:45.157 に答える
0

ウィジェットをファクトリと同じパッケージに配置し、ウィジェットのコンストラクターを保護された可視性を持つように設定します。これにより、オブジェクトの作成がファクトリに制限されます。

ウィジェットごとに、アクセス制御を部分的に実装できます。アクセスが許可されているオブジェクトの各ウィジェットにリストを保持でき、このリストを変更できるのはファクトリのみです(保護された可視性)。すべてのパブリック関数について、ウィジェットの関数へのアクセスが許可されているオブジェクトをユーザーに渡す必要があります。許可されたオブジェクトをファクトリに返して、許可を削除することにより、オブジェクトを返すことができます。

メインクラスのプライベートオブジェクトを承認オブジェクトとして渡すことができます。これにより、他のクラスがウィジェットを使用できなくなります。ただし、これによって他のクラスが承認を要求するのを防ぐことはできません。

承認を解除するのを忘れて、ウィジェットを「アンデッドオブジェクト」(ウィジェットのアクセス制御リスト以外では使用されない)で乱雑にする可能性があるため、これは少し不安定です。

于 2012-07-04T01:19:48.830 に答える