Какие плюсы и минусы JDK 11?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
JDK 11: Плюсы и минусы
История релиза
JDK 11 выпущен в сентябре 2018 года как долгосрочный relase (LTS - Long Term Support). Это одна из самых популярных версий Java.
Временная линия:
- JDK 9 (сентябрь 2017) - первый модульный релиз
- JDK 10 (март 2018) - полугодовой релиз
- JDK 11 (сентябрь 2018) - LTS ← Начало долгосрочной поддержки
- JDK 12-16 (полугодовые релизы)
- JDK 17 (сентябрь 2021) - следующий LTS
- JDK 21 (сентябрь 2023) - текущий LTS
Главные плюсы JDK 11
1. LTS (Long Term Support) - 8+ лет поддержки
Что это значит:
- Регулярные обновления безопасности
- Исправления ошибок
- Стабильность для production
# Долгосрочная поддержка до сентября 2026
JDK 11 LTS: Sept 2018 - Sept 2026
Это идеально для enterprise приложений
Практический плюс: не нужно срочно обновляться до следующей версии.
2. HTTP/2 Client API
Новое: встроенный HTTP/2 клиент (стабильный API).
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
// Раньше: использовали Apache HttpClient или OkHttp
// Теперь: встроенный API
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/users"))
.GET()
.build();
HttpResponse<String> response = client.send(
request,
HttpResponse.BodyHandlers.ofString()
);
String body = response.body();
int statusCode = response.statusCode();
System.out.println("Status: " + statusCode);
System.out.println("Body: " + body);
// Асинхронный запрос
HttpResponse<String> asyncResponse = client.sendAsync(
request,
HttpResponse.BodyHandlers.ofString()
).thenApply(resp -> {
System.out.println("Got response: " + resp.statusCode());
return resp;
}).join();
Минусы этого API: менее гибкий, чем Apache HttpClient (например, нет автоматического retry).
3. Модульная архитектура (JPMS)
Что это: Java Platform Module System (модули вместо классов).
// module-info.java
module com.example.app {
requires java.base;
requires java.net.http;
exports com.example.api;
exports com.example.services;
// Прячем реализацию
// com.example.impl не экспортируется
}
// Пример использования
public class ApiService {
// Видно из других модулей (exported)
public void fetchData() { }
}
// impl.ModuleImpl
// Невидно из других модулей (не exported)
class ModuleImpl { }
Плюсы модулей:
- Явные зависимости
- Изоляция реализации
- Меньший размер JRE (можно создать custom JRE)
# Создание custom JRE только с нужными модулями
jlink --module-path $JAVA_HOME/jmods \
--add-modules java.base,java.net.http \
--output my-jre
# Размер: ~30MB вместо стандартных ~150MB
Минусы модулей:
- Сложность (не нужны для простых приложений)
- Много миграции старого кода
- Spring и другие frameworks долго адаптировались
4. Local Variable Type Inference (var keyword)
Что это: автоматический вывод типа локальной переменной.
// Java 10+ (добавлен в JDK 10, но JDK 11 стабилизирует)
// Раньше:
Map<String, List<String>> users = new HashMap<>();
Iterator<User> iterator = users.iterator();
// Теперь:
var users = new HashMap<String, List<String>>();
var iterator = users.iterator();
// Компилятор выводит тип сам
var name = "John"; // String
var count = 10; // int
var amount = 99.99; // double
var list = new ArrayList<>(); // ArrayList
// Плюсы:
// - Меньше boilerplate
// - Код читаемее
var response = httpClient.send(request, BodyHandlers.ofString());
// Минусы:
// - Может уменьшить читаемость если переменное имя неясно
var x = calculateSomething(); // Что такое x? Неясно!
var result = calculateUserAge(); // Лучше
Best Practice: используй var только если тип очевиден из контекста.
5. Удаление Java EE модулей
Что удалили: модули, которые были в Java EE (теперь Jakarta EE).
// Удалены модули:
// - java.xml.ws (SOAP)
// - java.xml.bind (JAXB)
// - java.activation (JAF)
// - java.corba (CORBA)
// - java.transaction
// Если нужны, добавляй в зависимости:
// Gradle:
dependencies {
implementation 'javax.xml.bind:jaxb-api:2.3.1'
implementation 'com.sun.xml.bind:jaxb-impl:2.3.1'
}
// Maven:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
6. Улучшения в производительности
GC улучшения:
- ZGC (Z Garbage Collector) - низкие pause times
- Epsilon GC - no-op GC для тестирования
# Включить ZGC (экспериментально в JDK 11)
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC MyApp
# Epsilon GC (не собирает мусор, для бенчмарков)
java -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC MyApp
7. Улучшения в Collections и String
// Новые методы:
// String.repeat()
String repeated = "ab".repeat(3); // "ababab"
// String.isBlank() и String.strip()
var str = " hello ";
if (str.isBlank()) { } // false
var stripped = str.strip(); // "hello"
var left = str.stripLeading(); // "hello "
var right = str.stripTrailing(); // " hello"
// File.readString() и Files.writeString()
String content = Files.readString(Path.of("file.txt"));
Files.writeString(Path.of("file.txt"), "new content");
// Predicate.not() (Java 11)
List<String> nonEmpty = list.stream()
.filter(Predicate.not(String::isBlank))
.collect(toList());
8. Single-File Source Launch
Что это: запуск Java файла без компиляции.
# Раньше (Java 10 и ранее):
javac HelloWorld.java
java HelloWorld
# Теперь (Java 11+):
java HelloWorld.java
# Файл компилируется и выполняется в памяти
// HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
# Просто выполняем
java HelloWorld.java # Output: Hello, World!
Плюсы: удобно для скриптов, обучения, быстрого прототипирования.
Главные минусы JDK 11
1. Модули JPMS слишком сложны для большинства
// Реальная боль в миграции:
// Все open-source библиотеки долго адаптировались
// ClassCastException с модулями - трудно дебажить
// Обход через --add-opens:
java --add-opens java.base/java.lang=ALL-UNNAMED MyApp
2. Удаление Java EE библиотек требует миграции
<!-- Пришлось добавлять явно -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
3. Некоторые фичи ещё экспериментальные
# ZGC в JDK 11 требует флагов
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC MyApp
4. Производительность на холодном старте
Модули добавили overhead на старт.
# Время старта может быть немного больше, чем на JDK 8
time java -version # ~100ms (vs 50ms на JDK 8)
5. Требует Java 9+ классов для модулей
Если нужны модули - архитектура должна быть спроектирована с начала.
6. Поддержка Spring, Hibernate и т.д. была не идеальной в начале
Много проблем с автоконфигурацией в Spring.
Сравнение: JDK 8 vs JDK 11
| Параметр | JDK 8 | JDK 11 |
|---|---|---|
| Поддержка | Закончилась (кроме Oracle Extended Support) | LTS до 2026 |
| Модули | Нет | Да (опционально) |
| var keyword | Нет | Да |
| HTTP/2 Client | Нет | Да |
| GC | G1GC | G1GC, ZGC (experimental) |
| Производительность | Хорошая | Лучше |
| Сложность | Простая | Более сложная |
| Миграция | Не требуется | Требуется |
| Библиотеки | Встроены (Java EE) | Внешние |
Практический совет: Использовать ли JDK 11?
✅ Используй JDK 11 если:
- Новый проект (2019+)
- Enterprise приложение нужно долгосрочно поддерживать
- Нужна стабильность и регулярные патчи
- Используешь Spring Boot 2.1+
❌ Избегай JDK 11 если:
- Legacy приложение очень привязано к Java EE
- Требуется максимальная простота (используй JDK 8 LTS)
- Нужны только экспериментальные фичи (GraalVM, Project Loom)
Сейчас (2026):
- JDK 11: ещё поддерживается до сентября 2026
- Рекомендуемая миграция: на JDK 17 LTS или JDK 21 LTS
- JDK 21 - текущий LTS с поддержкой до 2028
Заключение
JDK 11 - отличный LTS релиз для своего времени:
- Хорошая точка миграции с JDK 8
- Новые фичи (var, HTTP/2, String методы)
- Долгосрочная поддержка
- Модули для сложных архитектур
Минусы относительно небольшие, если не углубляться в JPMS. Для большинства приложений достаточно просто использовать стандартные классы без явных модулей.