• На сайте OpenJDK опубликован черновик JEP «Enhanced javadoc support for code samples (snippets)». В нём предлагается ввести в javadoc новый тег @snippet
, с помощью которого можно будет вставлять в документацию примеры кода и делать это лучше, чем это делается сейчас с использованием блоков <pre>{@code ...}</pre>
. Новые сниппеты будут предоставлять механизм для лучшей проверки корректности кода, подсветки синтаксиса, улучшенной поддержки редактирования в IDE.
Пример сниппета:
/** * The following code shows how to use Optional.isPresent: * {@snippet : * if (v.isPresent()) { * System.out.println("v: " + v.get()); * } * } */
Сниппеты в javadoc будут поддерживать вложенные комментарии /* ... */
(с помощью <pre> это сделать нельзя), ссылки на код из внешнего файла (@snippet file="SomeFile.java"
), обрезание ненужных пробельных символов в началах строк (как в блоках текста), подсветку определённых участков сниппета и многие другие возможности.
• Вышел ещё один черновик JEP «Improve regex performance». В этом JEP'е предлагается заменить движок регулярных выражений, который в Java работает довольно быстро, но не даёт гарантированной максимальной сложности алгоритма поиска. Это делает сервисы, написанные на Java, потенциально уязвимыми к DoS-атакам на основе регулярных выражений (ReDoS). Особенно легко такие атаки могут быть организованы, если пользователь знает, какое именно регулярное выражение используется на сервере для валидации полей, и уж тем более, если сам может загружать своё регулярное выражение.
Чтобы избежать этого, можно использовать движок регулярных выражений, основанный на детерминированных конечных автоматах (DFA), который даёт гарантированную сложность O(N)
, однако он поддерживает не все возможности регулярных выражений. В JEP'е предлагаются варианты решений такой проблемы, например, использовать разные алгоритмы в зависимости от указанного выражения или позволять пользователю указывать с помощью флага, какой именно алгоритм использовать. Пока что в JEP'е нет окончательного ответа относительно выбора подхода, и, видимо, он ещё будет сильно дорабатываться.
• Вышла IntelliJ IDEA 2021.1 EAP (Early Access Program). В этой версии среды появилась базовая поддержка Java 16, WSL 2 (Windows Subsytem for Linux 2), новая возможность Run Targets (выполнение программы в среде: Docker, SSH, WSL), улучшения в UI и т.д.
• Вышел JDK Misson Control 8.0.0 EA.
• Ну и напоследок немного юмора. Известный программист, Java-чемпион Heinz Kabutz выложил в Твиттере задачку со следующим вопросом:
Как, не меняя ни одного символа, сделать так, чтобы программа скомпилировалась:
public class InnerStaticMember { public class Inner { public static void main(String... args) { System.out.println("Look Ma, no hands!"); } } }
Среди ответов отметилось несколько правильных: нужно просто перейти на Java 16, потому что Java 16 разрешает статические члены во внутренних классах.
Однако самым смешным (но в то же время абсолютно корректным) оказался ответ, где написан конвейер Linux-команд, который берёт исходное изображение, обрезает её так, что из неё остаётся только кусок с классом Inner
, распознаёт из неё текст и компилирует.