2017-11-17 31 views
5

Zastanawiam się nad modułami JDK9. Załóżmy, że masz następujące 3 pakiety:W jaki sposób moduły JDK9 będą pomocne w "podpakietach o określonym zasięgu"?

com.company.product 
com.company.product.impl_a 
com.company.product.impl_b 

klas w pakiecie product.impl_a i product.impl_b mogą być dostępne tylko w pakiecie product klas. Użytkownik powinien używać tylko klas z pakietu product. Możesz sobie wyobrazić, że przejście pewnych flag lub właściwości zdecyduje, czy będzie używane wewnętrznie.

W JDK8- musisz wykonać te klasy wewnątrz impl_a i impl_bpublic. Ten rodzaj zasysa, ponieważ użytkownicy mogą zostać oszukani, że mogą korzystać z tych klas. Jest to całkowicie poprawne i dozwolone.

W jaki sposób JDK9 może tutaj pomóc? Czy zadeklarujemy moduł dla product.impl_a i kolejny dla product.impl_b i zadeklarujemy, że do eksportowanych klas ma dostęp tylko trzeci moduł product, który będzie zależeć od dwóch modułów product.impl_a i product.impl_b? Ponadto, będzie praktycznie niemożliwe, aby zadeklarować nowy moduł, który będzie zależeć od product.impl_a lub product.impl_b? Czy inne moduły zależą tylko od modułu product?

Odpowiedz

4

Nic w twoim pytaniu nie wydaje się wskazywać, że te trzy pakiety muszą znaleźć się w różnych JARach/modułach. Jeśli nie, po prostu umieścić je w tym samym JAR użyć modyfikatorów widoczności jak opisane, i korzystać z modułu następujące oświadczenie:

module com.company.product { 
    export com.company.product; 
} 

Następnie wewnątrz modułucom.company.product można użyć kod ze wszystkich pakietów, tak jak zwykle, ale od poza tylko com.company.product jest accessible.

+0

To ma sens. Czy można również używać modułów w ramach tego samego JAR? Czy możliwe jest wyeksportowanie 'com.company.product.impl_a' do' com.company.product' (i to samo dla 'impl_b')? W ten sposób klasy w 'impl_b' nie mogą nigdy używać' impl_a' pomimo klasy publicznej w 'impl_a'. (i wzajemnie). –

+1

Nie, w Javie 9 może być tylko jeden moduł na JAR. (Było kilka próśb o tak zwane JAR-y wielomodułowe, ale nie wiem, jaki byłby plan dostarczenia tej funkcji.) Jeśli chcesz wyizolować _impl_a_ z _impl_b_, musisz utworzyć różne moduły. Zajrzyj do [services] (http://openjdk.java.net/projects/jigsaw/spec/sotms/#services), aby dowiedzieć się, jak je rozdzielić, więc _product_ nie musi ich znać. – Nicolai

+0

Świetny link, to bardzo pomaga. DZIĘKI –

4

Można pozwolić na zajęcia w ramach pakietów impl_a i impl_b być public i eksportować pakiety do konkretnych module s (qualified exports) dodatkowo można wykorzystać konwencję jako:

exports com.company.product.impl_b to third.module; 

Więc w twoim przypadku pod uwagę

module first.module { 
    export com.company.product.impl_a to second.module; 
    export com.company.product.impl_b to third.module; 
} 

co oznacza, że ​​pakiet com.company.product.impl_a jest tylkoeksportowane do second.module, który teraz, gdy czyta first.module ma dostęp do publicznych typów klas w obrębie pakietu impl_a i podobnie com.company.product.impl_b jest eksportowany tylko do third.module.

+1

Nie wiedziałem, że można wyeksportować do określonego modułu. DZIĘKI –

+0

@KevinDeGrote To faktycznie kontrolowany dostęp do pakietów eksportowanych do konkretnego modułu. – nullpointer

Powiązane problemy