0Pricing
Java Academy · Lekcja

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 requires dla 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 static
  • exports oraz kwalifikowane exports ... to
  • opens i open module na 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

  1. module-info.java
  2. requires i exports
  3. Usługi z provides/uses
  4. Migracja do modułów
← Powrót do Java Academy