Z Javy 8 na Javę 9, czyli co wybuchnie

Małe rzeczy zawsze cieszą. Jedną z nich jest możliwość bezproblemowego migrowania z Javy 8 na Javę 9. Fajnie by było, gdyby taka migracja przeszła bez większych zgrzytów, dlatego warto czasami rzucić okiem, co wypluwa nam nasz kompilator.

A wypluć może on na przykład:

Listing 1. Co nam mówi kompilator

Warning:(30, 53) java: '_' used as an identifier
  (use of '_' as an identifier might not be supported in releases after Java SE 8)

Co prawda, jeżeli użyjemy podkreślenia jako parametru wyrażenia lambda, to będzie klasycznie fail:

Listing 2. Co nam mówi kompilator w lambdzie

Error:(30, 32) java: '_' used as an identifier
  (use of '_' as an identifier is forbidden for lambda parameters)

Jednak warto o tym pamiętać. W czym rzecz. W Javie 8 zaczęto wycofywać znak podkreślenia _ jako prawidłowy identyfikator zmiennej/parametru. Uzasadnienie od Briana Goetza jest takie:

Yes, we are „reclaiming” the syntactic real estate of „_” from the space of
identifiers for use in future language features. However, because there are
existing programs that might use it, it is a warning for identifiers that occur
in existing syntactic positions for 8, and an error for lambda formals (since
there is no existing code with lambdas.)

Your suspicion is mostly right, except that we are certainly NOT going to do
Scala’s „wunderbar”. However, things it might be used for include things like
„I don’t want to give this variable a name” (such as catch parameters that are
never used.)

źródło

Zatem, zanim przejdziemy na Javę 9, to warto przejrzeć swój kod źródłowy pod kątem tego problemu. W szczególności dotyczy to kodu starszego niż Java 8. Tu nie mamy żadnego ostrzeżenia.

Co w zamian?

Znak podkreślenia jest powszechnie stosowany jako marker „do olania”, ale w tej sytuacji nie można go już stosować w Javie. W zamian pozostaje stosowanie podwójnego znaku podkreślenia tzn. __ albo znaku dolara $.

Jedna myśl na temat “Z Javy 8 na Javę 9, czyli co wybuchnie

  1. Niedawno robiliśmy eksperyment z kompilacją naszych aplikacji na Javie 9. Oprócz tego, że znaleźliśmy właśnie JEDNO, JEDYNE miejsce w kodzie, gdzie podkreślenie zostało użyte jako identyfikator, wytelepało się dużo więcej problemów związanych ze zmienionym działaniem jakiejś funkcjonalności. Kilka praktycznych wniosków, jakimi mogę się podzielić z tego eksperymentu, to:

    używanie ciężkiej refleksji do „odblokowywania” sobie bokiem dostępu do różnych rzeczy – sprawdzić czy działa i najlepiej zlikwidować,
    jakieś stare testy jednostkowe używające EasyMocka należy przepisać na Mockito. Tamta biblioteka nie działa z JDK9 i od paru lat wygląda na nierozwijaną,
    po modularyzacji niektóre moduły JDK nie są domyślnie aktywne – trzeba ręcznie zadeklarować, że będziemy ich używać.

    Jeśli chodzi o Jigsaw, to już teraz można się przygotować, dodając do manifestów atrybut Automatic-Module-Name z jawnie określoną nazwą modułu. Jest to ważne zwłaszcza dla bibliotek. Jeśli użyjemy zwykłego archiwum JAR w modularnej aplikacji, Java zrobi nam z niego automatyczny moduł. Oficjalna rekomendacja mówi, że moduły powinny mieć nazwy wywodzące się od nazw pakietów (czyli styl „odwróconej nazwy domeny”), tymczasem nazwa automatycznego modułu wyliczana jest domyślnie z nazwy archiwum. Gdy taki projekt zmigruje na Jigsaw, okaże się, że może być wciągany do innego projektu pod dwoma nazwami: starą i nową. Dla JVM jest to nieprawidłowa sytuacja i odmówi wtedy startu. Dzięki wpisowi w manifeście możemy już teraz zająć sobie docelową nazwę, z której mogą skorzystać modułowe aplikacje JDK9, a jednocześnie możemy wciąż np. budować się na JDK8 dla zachowania wstecznej kompatybilności.

Napisz odpowiedź

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax