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 staticexportsと限定公開の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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- module-info.java
- requires と exports
- provides/uses によるサービス
- モジュールへの移行