Проблема Y2Enum в Java: должно ли в Java быть ключевое слово, которое помечает перечисление как «расширяемое в будущем»?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Проблема Y2Enum в Java: должно ли в Java быть ключевое слово, которое помечает перечисление как «расширяемое в будущем»?

Сообщение Anonymous »

Итак, у нас есть небольшое перечисление из библиотек Java 21 (на самом деле, начиная с Java 11):

Код: Выделить всё

java.net.http.HttpClient.Version

Код: Выделить всё

public enum Version { HTTP_1_1, HTTP_2 }
и этот небольшой фрагмент кода в клиентском коде:

Код: Выделить всё

private static @NotNull String toStringHttpVersion(HttpClient.Version version) {
return switch (version) {
case HTTP_2 -> "HTTP/2";
case HTTP_1_1 -> "HTTP/1.1";
};
}
Поезд линтер-компилятора полностью доволен вышеизложенным, все случаи рассмотрены, это прекрасно.
Это кажется рецептом для будущих проблем в любом случае точка развертывания, да? Что, если Oracle решит расширить перечисление с помощью HTTP_2_1 или даже встроить в него HTTP_1_0? Код, установленный во всей корпоративной системе, вызывающий toStringHttpVersion(), ужасно умрет.
(Почему HTTP_1_0 нет в перечислении в первом место для меня загадочно, кажется сломанным, этого перечисления не должно существовать, оно должно быть экземпляром класса Semver или, может быть, BigDecimal, но я отвлекся, и в любом случае java.net.HttpClient выдает чистое исключение IOException, если статус HTTP «запрещен», что недопустимо, я сейчас остановлюсь.)
Это действительно нужно написать:

Код: Выделить всё

private static @NotNull String toStringHttpVersion(HttpClient.Version version) {
return switch (version) {
case HTTP_2 -> "HTTP/2";
case HTTP_1_1 -> "HTTP/1.1";
default -> version.toString(); // future proof
};
}
Который линтер помечает как «ветвь по умолчанию не нужна» и может быть пропущен разработчиком в любом случае, если он спешит и ему помогает Google Copilot или аналогичный.
Я что-то упустил или Java нужно ключевое слово Futureextensible, чтобы помечать перечисления, которым грозит будущее расширение, позволяя линтеру предупреждать об этом?>

Подробнее здесь: https://stackoverflow.com/questions/786 ... enum-as-fu
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»