microJUG
Open in Telegram
Мысли о Java. Основной канал: @miniJUG Буст: https://t.me/microJUG?boost Чат: https://t.me/micro_JUG Таблица JEP'ов: https://minijug.org/jeps.html
Show more803
Subscribers
No data24 hours
No data7 days
No data30 days
Posts Archive
803
Похоже, что в Java 22 безымянные переменные и паттерны выйдут из preview. Это будет первый случай, когда языковая конструкция пробыла в preview всего один релиз.
Ранее все языковые конструкции в preview были как минимум два релиза:
• switch expressions: два релиза (Java 12 и 13)
• text blocks: два релиза (Java 13 и 14)
• records: два релиза (Java 14 и 15)
• pattern matching for instanceof: два релиза (Java 14 и 15)
• sealed: два релиза (Java 15 и 16)
• pattern matching for switch: 4 релиза (Java 17, 18, 19 и 20)
• records patterns: два релиза (Java 19 и 20)
Ну и теперь unnamed variables and patterns: только 1 релиз (Java 21)
#java22
803
В OpenJDK предложен новый проект Babylon. Он позволит доступаться до структуры Java кода не только во время компиляции, но и во время выполнения. Это позволит рантайму анализировать и трансформировать код, например, генерировать код на SQL (аналогично Expression Trees в C#, что открывает возможности для таких вещей как LINQ).
Про это также был доклад на JVM Language Summit.
#babylon
803
Начиная с Java 22, предлагается выдавать предупреждения при использовании JNI. Выглядеть это будет как-то так:
WARNING: A restricted method in java.lang.System has been called
WARNING: System::load has been called by com.foo.bar.Server in {an unnamed module, module com.foo.bar}
WARNING: Use --enable-native-access={ALL-UNNAMED, com.foo.bar} to avoid a warning for callers in this module
WARNING: Restricted methods will be blocked in a future release unless native access is enabled
Для подавления таких предупреждений надо будет запускать приложение с флагом --enable-native-access, где надо будет указать список модулей, которым разрешено загружать нативный код. Если в рантайме будет попытка загрузки из модуля не из списка, то уже будет вылетать IllegalCallerException.
В какой-то из будущих версий Java предупреждение уже будет полностью заменено на исключение IllegalCallerException. Так что для приложений, использующих JNI, флаг --enable-native-access уже будет обязательным.
Про полное удаление JNI пока речи не идёт.
Напомним, что в OpenJDK много лет разрабатывается альтернатива JNI — Foreign Function & Memory API (FFM). В той же Java 22 она выйдет из состояния preview и станет стабильной частью Java. FFM является более безопасной, чем JNI, и при её использовании флаг --enable-native-access можно будет не указывать и Java не будет выдавать предупреждения (за исключением ситуации, когда используется небезопасная часть FFM API — для неё всё будет аналогично JNI).
#java22 #jni #ffm803
В исходном коде java.lang.String обнаружили интересный баг, причиной которой является race condition в конструкторах строк, принимающих массивы (byte[], char[] или int[]). Эксплуатируя это состояние гонки, можно получить строки с забавными свойствами, например, что "hello world" не начинается с "hello" или что "foo" не равен "foo". Можно даже получить пустую строку, которая не равна "".
Race condition в конструкторе очень простой и заключается в том, что входной массив читается дважды в разные моменты времени (см. картинку). За то время, пока одно считывание закончилось и началось второе, содержимое массива может поменяться из другого потока.
Багу подвержены все версии JDK, начиная с Java 9 (в которой появились компактные строки). На данный момент неизвестно об уязвимостях, вызванных данных багом. Но кажется, что такие уязвимости со временем появятся, ведь сравнение строк очень частая операция (например, сравнение паролей). В багтрекере OpenJDK баг завели, но закрыли, что может намекать, что баг действительно может иметь последствия для безопасности.
Мне очень любопытно, как этот баг будут исправлять. Избежать многократного чтения массива можно путём создания временной копии. Но это сильно просадит производительность при создании строк. На такое явно не пойдут. Скорее всего, будут придумывать другие более изощрённые алгоритмы.
#string
803
Количество вопросов по разным версиям Java на StackOverflow.
Java 8 находится в сильном отрыве от всех остальных версий и имеет больше вопросов, чем в сумме все остальные версии Java.
#java8
803
Какой, по вашему мнению, самый важный релиз в истории Java, который наибольшим образом продвинул язык и платформу?
(Считаем, как будто STS-релизов вообще не было и выходили только LTS-релизы, содержащие в себе все нововведения из предшествующих STS)
803
Самые популярные вендоры OpenJDK в 2023 году:
1. Amazon (31%)
2. Oracle (28%)
3. Eclipse Adoptium (12%)
4. Red Hat (11%)
5. Azul (6%)
6. SAP (3%)
7. BellSoft (1.9%)
8. Debian (1.8%)
Oracle впервые не первый 🫡
Источник: What Is the State of the Java Ecosystem in 2023?
803
В Java 21 появился долгожданный метод
reversed(), который возвращает view коллекции с обратным порядком:
jshell> List.of(1, 2, 3, 4, 5).reversed()
$1 ==> [5, 4, 3, 2, 1]
Этот метод есть у любой коллекции, реализующей интерфейс SequencedCollection (List, Deque, Stack и т.д). Кстати, всё это уже есть в последнем билде JDK 21-ea+20, так что можно затестить.
#java21803
Помните, были такие сырые строковые литералы? Их хотели добавить в Java 12, но потом отказались от этой идеи.
Так вот, эту идею подхватил C# 11. Смысл очень похожий на Java 12: сырой строковый литерал может начинаться с любого количества кавычек (минимум 3), но должен и заканчиваться на то же самое количество. А между этими n-арными кавычками можно вставить любую чухню (главное, чтобы не было n кавычек подряд):
string raw = """" Hello, "John"! """"Но это ещё не всё. В C# ведь ещё есть строковая интерполяция (
$"Hello, {name}!"). Как будут выглядеть сырые строковые литералы с интерполяцией?
А правило такое: количество долларов контролирует количество фигурных скобок, обрамляющих интерполяцию внутри литерала!
Например:
String name = "John";
string raw = $$"""
Hello, {{name}}!
My {name} is {{{name}}}
"""
Эта строка превратится в:
Hello, John!
My {name} is {John}
Т.е. понимаете? Не только количество кавычек произвольное, но и количество долларов! Например, вот такой код является валидным кодом на C# 11:
$$$$$$$$$$$$""""""""""""""""
Hello
""""""""""""""""
Но это ещё не всё. Всё это безумие ещё добавляется к буквальным строковым литералам, которые начинаются с @". Т.е. в C# теперь есть 6 видов литералов: обычные, обычные с интерполяцией, буквальные, буквальные с интерполяцией, сырые и сырые с интерполяцией.
Теперь вы понимаете, почему в Java так тщательно продумывают новые фичи и неспешно их вводят?
Лучше уж мало фич, но без подобного синтаксического сумасшествия.
#csharp