2

一部のプロジェクトでは、ダブル ディスパッチ メカニズムを使用して、実行時にインフラストラクチャ モジュールの「ビュー」をドメイン モジュールに提供しています (ドメインの強化: ダブル ディスパッチ パターン)。上記で「モジュール」と呼んでいるものは、service.jar->domain.jar からの依存関係がコンパイル時にのみ適用される単純な個別の jar ファイルです。サービスとドメインを「真の」Java 9モジュールとして定義すると、Java-9でこれを機能させることができますか?

module domain
  L Fee.java
      L Payment recordPayment(double, BalanceCalculator)
  L BalanceCalculator.java
module service
  L BalanceCalculatorImpl.java // implements BalanceCalculator
      L double calculate(Fee fee) //call fee.recordPayment(amount,this)
4

1 に答える 1

3

はい、可能です。考慮すべき点は次のとおりです。

  1. モジュールドメインは、を含むパッケージをエクスポートする必要がありますFee。おそらく誰にでも、少なくともサービスは。
  2. モジュールサービスは、ドメインを実装しているため、アクセスする必要があるため、ドメインを要求する必要があります。BalanceCalculatorImpl BalanceCalculator
  3. サービスのクライアントはドメインについても知る必要があるようです。これは暗黙の読みやすさの教科書的なケースです。
  4. 単純なセットアップでは、サービスまたはいくつかの 3 番目のモジュールのいずれかがインスタンス化BalanceCalculatorImplして に渡す必要があります。これはドメインFeeでは発生しないか、循環的な依存関係が作成されます。
  5. より高度なソリューションはservicesであり、 domainBalanceCalculator内であっても、 にアクセスできるすべてのコードがそのすべての実装を保持できます。

これらすべてを考慮すると、2 つのモジュール宣言は次のようになります。

module com.example.domain {
    // likely some requires clauses

    // export packages containing Fee and BalanceCalculator
    exports com.example.domain.fee;
    exports com.example.domain.balance;
}

module com.example.service {
    requires public com.example.domain;
    // likely some more requires clauses

    // expose BalanceCalculatorImpl as a service,
    // which makes it unnecessary to export the containing package
    provides com.example.domain.balance.BalanceCalculator
        with com.example.service.balance.BalanceCalculatorImpl;
}

次に、使用するのが好きなすべてのモジュールBalanceCalculatorは、モジュール宣言でそれを宣言し、 Java のuses com.example.domain.balance.BalanceCalculatorを使用してそのインスタンスを取得できます。ServiceLoader

モジュール システムのより実用的なアプリケーション (特にサービス用) は、私が作成したデモで見つけることができます。

(注:このやり取りの後、回答が修正されました。)

于 2016-09-30T06:37:36.337 に答える