Po trzech latach oczekiwania na kolejną wersję LTS, Oracle w końcu wydało Java 11 we września 2018. To przełomowa wersja – pierwsza LTS po Java 8, która wprowadza wiele długo oczekiwanych funkcji. Czy warto migrować? Zdecydowanie tak!
Co się nauczysz:
- Najważniejsze nowe funkcje Java 11 LTS
- HTTP Client API – zamiennik dla HttpURLConnection
- Rozszerzenia dla var i nowe metody String
- Java Flight Recorder i jego możliwości
- Jak przygotować się do migracji z Java 8
- Co zostało usunięte i jak to wpływa na kod
Dlaczego Java 11 to game changer?
Java 11 to pierwsza wersja Long Term Support od czasu Java 8. Oracle zmienił model licencjonowania i wydawania – teraz mamy nową wersję co 6 miesięcy, ale LTS tylko co 3 lata. To oznacza, że Java 11 będzie wspierana do września 2023, dając firmom stabilną podstawę do rozwoju.
HTTP Client API – koniec z HttpURLConnection
Najważniejszą nowością jest standardowe HTTP Client API, które zastępuje przestarzałe HttpURLConnection. Nowe API jest nowoczesne, asynchroniczne i znacznie łatwiejsze w użyciu.
// Nowe HTTP Client API w Java 11 import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.URI; import java.time.Duration; public class HttpClientExample { public static void main(String[] args) throws Exception { // Utworzenie klienta HTTP HttpClient client = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(10)) .build(); // Przygotowanie żądania HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.github.com/users/octocat")) .timeout(Duration.ofSeconds(30)) .header("Accept", "application/json") .GET() .build(); // Synchroniczne wysłanie żądania HttpResponseresponse = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println("Status: " + response.statusCode()); System.out.println("Response: " + response.body()); } }
Asynchroniczne żądania
// Asynchroniczne wywołanie CompletableFuture> future = client.sendAsync(request, HttpResponse.BodyHandlers.ofString()); future.thenApply(HttpResponse::body) .thenAccept(System.out::println) .join();
Rozszerzenia var – więcej możliwości
Java 11 rozszerza możliwości słowa kluczowego var wprowadzonego w Java 10. Teraz możesz używać var w parametrach lambda expressions:
// Java 11 - var w lambdach Listnames = Arrays.asList("Anna", "Bartosz", "Celina"); // Możesz dodać adnotacje do var w lambdach names.stream() .map((@NotNull var name) -> name.toUpperCase()) .forEach(System.out::println); // Lub po prostu używać var dla spójności names.stream() .filter((var name) -> name.startsWith("A")) .collect(Collectors.toList());
Nowe metody String API
Java 11 wprowadza kilka praktycznych metod do pracy z tekstem:
public class StringApiExample { public static void main(String[] args) { // isBlank() - sprawdza czy string jest pusty lub zawiera tylko whitespace String empty = " "; System.out.println(empty.isBlank()); // true System.out.println(empty.isEmpty()); // false // strip() - lepszy trim() obsługujący Unicode String unicode = "\u2000Hello World\u2000"; System.out.println("'" + unicode.trim() + "'"); // nie usuwa Unicode spaces System.out.println("'" + unicode.strip() + "'"); // usuwa wszystkie whitespace // repeat() - powtarza string n razy System.out.println("Java ".repeat(3)); // "Java Java Java " // lines() - dzieli string na linie jako Stream String multiline = "Line 1\nLine 2\nLine 3"; multiline.lines() .map(String::toUpperCase) .forEach(System.out::println); } }
Java Flight Recorder – built-in profiling
Java Flight Recorder (JFR), wcześniej dostępny tylko w Oracle JDK, jest teraz open source i wbudowany w OpenJDK. To potężne narzędzie do monitorowania aplikacji produkcyjnych z minimalnym overhead.
# Uruchomienie aplikacji z Flight Recorder java -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=myapp.jfr MyApplication # Lub programowo jcmdJFR.start duration=60s filename=recording.jfr
Co zostało usunięte?
Java 11 usuwa kilka deprecated funkcji z Java 8:
Usunięte | Zamiennik | Wpływ |
---|---|---|
Java EE modules | Zewnętrzne dependencje | Musisz dodać JAX-WS, JAXB do pom.xml |
CORBA | REST/HTTP APIs | Stary kod CORBA nie będzie działać |
Java FX | Osobny projekt OpenJFX | GUI aplikacje wymagają dodatkowych zależności |
Applets | Web applications | Stare applety nie działają |
Migracja z Java 8 – checklist
- Sprawdź dependencje: Maven/Gradle plugins, biblioteki trzecie
- Dodaj Java EE modules: jeśli używasz JAX-WS, JAXB
- Przetestuj build: niektóre Maven plugins wymagają aktualizacji
- Sprawdź JVM flags: niektóre flagi zostały usunięte
- IDE support: upewnij się że IDE wspiera Java 11
Wydajność i stabilność
Java 11 wprowadza kilka usprawnień wydajności:
- ZGC (Experimental): Nowy garbage collector o niskich opóźnieniach
- Epsilon GC: No-op garbage collector do benchmarków
- Transport Layer Security (TLS) 1.3: Lepsza wydajność i bezpieczeństwo
- Dynamic Class-File Constants: Optymalizacje na poziomie bytecode
Tak, jeśli twoja aplikacja jest aktywnie rozwijana. Java 11 LTS oferuje 3 lata wsparcia, lepszą wydajność i nowe funkcje. Ale wcześniej przetestuj kompatybilność.
Oracle JDK wymaga teraz licencji komercyjnej. Alternatywą jest OpenJDK, który jest darmowy i funkcjonalnie identyczny dla większości zastosowań.
Spring Boot 2.1+ oficjalnie wspiera Java 11. Wcześniejsze wersje mogą wymagać dodatkowych dependencji dla Java EE modules.
Java 17 LTS jest planowana na wrzesień 2021. Do tego czasu będziemy mieć Java 12, 13, 14, 15 i 16 jako wersje interim.
Nie, nowe API jak HTTP Client nie ma backportu. Możesz używać zewnętrznych bibliotek jak OkHttp jako alternatywę.
Przydatne zasoby:
- OpenJDK 11 – oficjalna strona
- Java 11 Documentation
- Java 11 Migration Guide
- Java 11 New Features – Baeldung
🚀 Zadanie dla Ciebie
Stwórz prostą aplikację używającą nowego HTTP Client API do pobierania danych z REST API (np. JSONPlaceholder). Wykorzystaj asynchroniczne wywołania i nowe metody String API do przetwarzania odpowiedzi. Porównaj wydajność z HttpURLConnection.
Planujesz migrację na Java 11? Podziel się swoimi doświadczeniami w komentarzach – jakie napotkałeś wyzwania i czy nowe funkcje okazały się przydatne w praktyce!