Ja eksperymentuje z Java 9 i patrząc na następujących scenariuszach:W języku Java 9, dlaczego kolizje pakietów są traktowane nieco inaczej w niektórych przypadkach?
Experiment 1
- moduł A
- moduł B
- zarówno zadeklarować non pakiet pusty nazwie com.foo, ale nie eksportuj go.
- oba są wymagane przez 3rd modułem C
uruchomiony główny z 'C' daje błąd wykonania:
java.lang.RuntimeException: Pakiet com.foo zarówno w module B i modułem
Eksperyment 2
samo jak wcześniej, ale tym razem zarówno com.foo eksportu.
wyniku realizacji głównej z C:
java.lang.module.ResolutionException: Moduły B i A pakiet eksport com.foo do modułu C
Eksperyment 3
samo jako 2, ale tym razem zadeklarowałem pakiet com.foo w module C.
Teraz pojawia się błąd kompilacji: Błąd: (4, 1) java: moduł C odczytuje pakiet com.foo z obu A i B
Dlaczego dwa pierwsze przypadki nie zostały złapane podczas kompilacji? Czy istnieją właściwości środowiska wykonawczego, o których nie wiem, że uniemożliwiają rozwiązanie przed uruchomieniem programu?
Ponadto, jeśli chodzi o komunikaty o błędach: w jaki sposób komunikat o błędzie w eksperymencie 2 jest lepszy niż ten podany w eksperymencie 1. Nie jest tak, jeśli jeden z modułów nie eksportuje go, aby wynik końcowy będzie inaczej. Innymi słowy, na czym polegało tworzenie różnych komunikatów o błędach?
* "Dlaczego dwa pierwsze przypadki nie zostały złapane podczas kompilacji?" * Ponieważ kompilator nie przeszedł tej * rozszerzonej * analizy pakietów, które nie są bezpośrednio używane przez moduł C. Dlaczego? Tylko # 3 powoduje, że kompilator nawet patrzy na pakiet 'com.foo'. Teraz, jeśli twoje # 2 próbowało "zaimportować" klasę z 'com.foo', prawdopodobnie przegrałoby kompilację, ponieważ kompilator musiałby dowiedzieć się, z którego modułu go pobrać. – Andreas
@Andreas, nie wiem o tym - po tym wszystkim ten sam pakiet jest eksportowany do obu modułów. Praktycznie oddaję go kompilatorowi na srebrnej tabliczce :). Nawet jeśli byłby to dłuższy łańcuch - biorąc pod uwagę słowa kluczowe - nie jest to skomplikowany obliczeniowo problem. Już tworzą wykres czytelności, więc wszystko jest na zewnątrz. – Vitaliy
Więc nie wykonali dodatkowej (opcjonalnej) pracy. Jeśli uważasz, że to ważne, zamiast pytać * "dlaczego?" *, Proponuję złożyć wniosek o ulepszenie. – Andreas