requires i exports
Kontrolowanie zależności i widoczności
requires i exports to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.
Kontrolowanie grafu modułów
Dwie dyrektywy kształtują graf modułów: requires deklaruje, od czego zależy moduł, a exports deklaruje, co moduł ujawnia.
W tej lekcji omówiono ich warianty oraz tworzone przez nie zasady czytelności i dostępności.
Zwykłe requires
Proste requires X; oznacza, że „ten moduł odczytuje moduł X”. Kod może używać publicznych typów eksportowanych przez X, ale użytkownicy Państwa modułu nie uzyskają żadnych informacji o X.
module com.example.app {
requires java.sql;
}requires transitive
requires transitive Y; oznacza, że każdy moduł, który odczytuje Państwa moduł, również odczytuje Y. Jest to niejawna czytelność, przydatna, gdy API Państwa modułu udostępnia typy z Y.
module com.example.api {
requires transitive java.sql;
}Kiedy używać transitive
Należy użyć transitive, gdy metoda udostępnionego API zwraca typ z innego modułu lub przyjmuje taki typ jako argument. W przeciwnym razie wywołujący nie mogliby nawet odwołać się do typu zwracanego bez dodania własnego requires.
Oszczędza to użytkownikom konieczności deklarowania zbędnych zależności.
requires static
requires static Z; deklaruje zależność wyłącznie na czas kompilacji. Moduł jest potrzebny do kompilacji, ale w czasie działania jest opcjonalny, dzięki czemu to rozwiązanie doskonale nadaje się do procesorów adnotacji lub opcjonalnych integracji.
module com.example.app {
requires static com.example.annotations;
}Zwykłe exports
exports pkg; sprawia, że publiczne typy pakietu pkg są dostępne do odczytu dla wszystkich modułów, które wymagają Państwa modułu.
module com.example.lib {
exports com.example.lib.api;
}Kwalifikowane exports
Kwalifikowany eksport udostępnia pakiet wyłącznie określonym, nazwanym modułom za pomocą exports pkg to modA, modB;. Jest to przydatne w przypadku modułów zaprzyjaźnionych w ramach większego systemu.
module com.example.core {
exports com.example.core.internal to com.example.web, com.example.batch;
}opens na potrzeby refleksji
exports zapewnia dostęp do publicznych elementów podczas kompilacji i działania programu. Głęboka refleksja (na przykład dostęp do prywatnych pól) wymaga zamiast tego opens pkg;; korzystają z niej takie frameworki jak Jackson lub Hibernate.
module com.example.model {
exports com.example.model;
opens com.example.model.entities to com.fasterxml.jackson.databind;
}Moduły open
Jeśli cały moduł wymaga dostępu refleksyjnego, co często zdarza się w przypadku starszych frameworków, należy zadeklarować go jako open. Każdy pakiet jest wtedy otwarty na refleksję, choć zwykłe exports nadal kontroluje dostęp podczas kompilacji.
open module com.example.beans {
requires java.logging;
}Czytelność a dostępność
Aby użyć typu z innego modułu, muszą być spełnione oba warunki:
- Czytelność: Państwa moduł zawiera
requiresdla tamtego modułu - Dostępność: tamten moduł eksportuje pakiet, a typ jest publiczny
Jeśli zabraknie któregokolwiek z tych warunków, kompilator odrzuci kod.
Połączenie elementów
Dobrze zdefiniowany moduł, który ponownie udostępnia typy JDBC i otwiera encje na potrzeby biblioteki 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;
}Szybkie sprawdzenie
Proszę wybrać dyrektywę przeznaczoną dla ponownie udostępnianych typów API.
Podsumowanie
Poznali Państwo dyrektywy dotyczące zależności i widoczności:
requires,requires transitive,requires staticexportsoraz kwalifikowaneexports ... toopensiopen modulena potrzeby refleksji- Użycie typu wymaga zarówno czytelności, jak i dostępności
Następnie: rozdzielanie zależności za pomocą usług, czyli provides i uses.
Często zadawane pytania
Czy lekcja „requires i exports” jest bezpłatna?
Tak — pełny tekst „requires i exports” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „requires i exports”?
Kontrolowanie zależności i widoczności Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Java Academy?
Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „requires i exports”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?
Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- module-info.java
- requires i exports
- Usługi z provides/uses
- Migracja do modułów