Новости Java #5

• На сайте 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, распознаёт из неё текст и компилирует.

Подписывайтесь на канал в Telegram, чтобы не пропускать новости.

Все материалы на этом сайте выложены под лицензией CC BY-SA 4.0
© Евгений Козлов, 2017-2021
Feed