2017-07-23 75 views
12

W deklaracji modułu Java 9.x za istnieją 2 konstrukty:Dlaczego eksportowanie całego modułu jest zabronione?

exports com.foo; 

I

opens com.foo; 

Gdzie exports dotacje kompilacji dostęp, natomiast opens umożliwia dostęp wykonania, jako odbicie i zasobów.

opens ma jeden wyrozumiałość nad exports że można zdefiniować cały moduł jako otwarte, co powoduje taką samą jak wyraźnie otwierające każdy pakiet:

open module com.mod { 

ale nie ma podobnej skonstruować

exported module com.mod { 

My Pytanie: Dlaczego tak jest; jakie decyzje podjęto, aby umożliwić otwarcie całego modułu jednocześnie, ale nie eksportować?

Odpowiedz

13

Eksport modułów definiuje API, które powinno być celowo zaprojektowane i utrzymywane w stabilnym stanie. "Wyeksportowany moduł" może łatwo i nieumyślnie zmienić interfejs API, dodając, usuwając lub zmieniając nazwy pakietów, co byłoby sprzeczne z celem stabilności. (Zasadniczo z tego samego powodu nie ma "eksportu wieloznacznego", takiego jak exports foo.bar.*).

Z drugiej strony, pakiety otwarte nie definiują API modułu. Oczywiście kod może zależeć od funkcjonalności dostępnej tylko poprzez odbicie, ale społeczność Javy zwykle postrzega odbicie jako "hakowanie", gdy jest używane do uzyskiwania dostępu do elementów wewnętrznych.

Jego znacznie szerszym (i korzystniejszym) zastosowaniem jest uzyskanie dostępu do artefaktu w celu świadczenia usługi (serializacja XML/JSON, trwałość, wtrysk zależności, ...). W takich przypadkach kod odzwierciedlający moduł nie jest na nim zależny i dlatego nie jest przerwany przez przenoszenie elementów. Nie ma więc powodu, aby utrzymywać otwarte pakiety w stabilny sposób, co czyni możliwym swobodne podejście, takie jak otwarte moduły.