0Pricing
Java Academy · レッスン

requires と exports

依存関係と公開範囲を制御します。

「requires と exports」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

モジュールグラフの制御

2つのディレクティブがモジュールグラフを形作ります。requiresは依存先を宣言し、exportsは公開するものを宣言します。

このレッスンでは、それらのバリエーションと、そこから生じる可読性およびアクセス可能性の規則を扱います。

通常のrequires

単純なrequires X;は、「このモジュールはモジュールXを読み取る」という意味です。コードからXがエクスポートするpublic型を使用できますが、このモジュールの利用側には、Xについて何も伝わりません。

module com.example.app {
    requires java.sql;
}

requires transitive

requires transitive Y;は、このモジュールを読み取るすべてのモジュールが、同時にYも読み取るという意味です。これは暗黙的な可読性であり、APIがYの型を公開する場合に便利です。

module com.example.api {
    requires transitive java.sql;
}

transitiveを使う場面

エクスポートしたAPIのメソッドが、別のモジュールの型を返す、または受け取る場合はtransitiveを使用してください。そうしないと、呼び出し側は独自にrequiresを宣言しなければ、戻り値の型名すら記述できません。

これにより、利用側が重複する依存関係を宣言せずに済みます。

requires static

requires static Z;は、コンパイル時のみ必要な依存関係を宣言します。コンパイルには必要ですが実行時は任意となるため、アノテーションプロセッサやオプションの統合に適しています。

module com.example.app {
    requires static com.example.annotations;
}

通常のexports

exports pkg;により、pkgのpublic型が、あなたのモジュールをrequireするすべてのモジュールから読み取り可能になります。

module com.example.lib {
    exports com.example.lib.api;
}

限定公開のexports

限定公開のexportは、exports pkg to modA, modB;を使って、特定の名前付きモジュールにだけパッケージを公開します。大規模なシステム内の、友好的なモジュールに便利です。

module com.example.core {
    exports com.example.core.internal to com.example.web, com.example.batch;
}

リフレクション用のopens

exportsはpublicメンバーへのコンパイル時および実行時のアクセスを許可します。非公開フィールドなどへの深いリフレクションには、代わりにopens pkg;が必要です。これはJacksonやHibernateなどのフレームワークで使用されます。

module com.example.model {
    exports com.example.model;
    opens com.example.model.entities to com.fasterxml.jackson.databind;
}

openモジュール

モジュール全体でリフレクションによるアクセスが必要な場合(レガシーフレームワークでよくあります)は、openを宣言します。すべてのパッケージがリフレクション用に開かれますが、通常のexportsによるコンパイル時アクセスの制御は引き続き有効です。

open module com.example.beans {
    requires java.logging;
}

可読性とアクセス可能性

別のモジュールの型を使用するには、次の2つの条件を両方満たす必要があります。

  • 可読性:自分のモジュールが相手のモジュールをrequiresしている
  • アクセス可能性:相手のモジュールがそのパッケージをexportsし、型がpublicである

どちらか一方でも欠けると、コンパイラはコードを拒否します。

組み合わせる

JDBCの型を再公開し、JSONライブラリのためにエンティティを開く、正しく構成されたモジュールです。

module com.example.service {
    requires transitive java.sql;
    requires static com.example.annotations;

    exports com.example.service.api;
    exports com.example.service.spi to com.example.plugins;
    opens com.example.service.dto to com.fasterxml.jackson.databind;
}

クイックチェック

再公開するAPI型に使うディレクティブを選んでください。

まとめ

依存関係と可視性を扱うディレクティブを学びました。

  • requires、requires transitive、requires static
  • exportsと限定公開のexports ... to
  • リフレクションにはopensとopen moduleを使う
  • 使用には可読性とアクセス可能性の両方が必要

次は、providesとusesを使ったサービスによる疎結合です。

よくある質問

「requires と exports」レッスンは無料ですか?

はい。「requires と exports」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「requires と exports」で何を学びますか?

依存関係と公開範囲を制御します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「requires と exports」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. module-info.java
  2. requires と exports
  3. provides/uses によるサービス
  4. モジュールへの移行
← Java Academyに戻る