Java 11 LTS – Nowe Funkcje i Zmiany

TL;DR: Java 11 LTS to pierwsza wersja LTS po Java 8, wprowadzająca HTTP Client API, rozszerzenia var, nowe metody String, Flight Recorder i wiele innych nowości. Czas na upgrade z Java 8!

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!

Dlaczego to ważne: Java 11 LTS będzie wspierana przez kolejne 3 lata, oferuje znaczące usprawnienia wydajności, nowe API i jest przygotowana na nowoczesne aplikacje enterprise. Firmy w końcu mogą bezpiecznie migrować z Java 8.

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
Wymagania wstępne: Znajomość Java 8, podstawy programowania obiektowego, doświadczenie z API Java. Pomocna będzie znajomość lambdas i Stream API.

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.

LTS (Long Term Support) – wersja Javy wspierana przez co najmniej 3 lata, otrzymująca regularne poprawki bezpieczeństwa i błędów.

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
        HttpResponse response = client.send(request, 
            HttpResponse.BodyHandlers.ofString());
        
        System.out.println("Status: " + response.statusCode());
        System.out.println("Response: " + response.body());
    }
}
Pro tip: HTTP Client API wspiera HTTP/2 out-of-the-box, co znacznie poprawia wydajność przy multiple requests do tego samego serwera.

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
List names = 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());
Analogia: var w lambdach to jak automatyczna skrzynia biegów – możesz nadal mieć kontrolę (adnotacje), ale większość czasu po prostu działa bez Twojej interwencji.

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);
    }
}
Typowy błąd: Używanie trim() zamiast strip() przy pracy z tekstem zawierającym Unicode whitespace characters.

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
jcmd  JFR.start duration=60s filename=recording.jfr
Uwaga: JFR ma bardzo niski overhead (< 1%), ale nadal warto testować wydajność przed włączeniem w produkcji.

Co zostało usunięte?

Java 11 usuwa kilka deprecated funkcji z Java 8:

UsunięteZamiennikWpływ
Java EE modulesZewnętrzne dependencjeMusisz dodać JAX-WS, JAXB do pom.xml
CORBAREST/HTTP APIsStary kod CORBA nie będzie działać
Java FXOsobny projekt OpenJFXGUI aplikacje wymagają dodatkowych zależności
AppletsWeb applicationsStare applety nie działają

Migracja z Java 8 – checklist

Pułapka: Nie wszystkie narzędzia i biblioteki są gotowe na Java 11. Sprawdź kompatybilność swojego tech stacku przed migracją.
  • 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
Czy powinienem migrować z Java 8 do Java 11?

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ść.

Co z licencjonowaniem Oracle JDK?

Oracle JDK wymaga teraz licencji komercyjnej. Alternatywą jest OpenJDK, który jest darmowy i funkcjonalnie identyczny dla większości zastosowań.

Czy Spring Boot działa na Java 11?

Spring Boot 2.1+ oficjalnie wspiera Java 11. Wcześniejsze wersje mogą wymagać dodatkowych dependencji dla Java EE modules.

Kiedy pojawi się następna wersja LTS?

Java 17 LTS jest planowana na wrzesień 2021. Do tego czasu będziemy mieć Java 12, 13, 14, 15 i 16 jako wersje interim.

Czy mogę używać Java 11 features na starszych wersjach?

Nie, nowe API jak HTTP Client nie ma backportu. Możesz używać zewnętrznych bibliotek jak OkHttp jako alternatywę.

Przydatne zasoby:

🚀 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!

Zostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Przewijanie do góry