• Вышли обновления Java:
• Вышел новый черновик JEP: No longer require super()
and this()
to appear first in a constructor. В нём предлагается разрешить писать инструкции кода до вызова super()
и this()
в конструкторах.
Напомним, что сейчас эти вызовы всегда должны быть первыми вызовами в конструкторах, иначе код не скомпилируется:
public class PositiveBigInteger extends BigInteger { public PositiveBigInteger(long value) { if (value <= 0) throw new IllegalArgumentException("non-positive value"); super(value); // error: call to super must be first statement in constructor } }
Такое ограничение иногда создаёт неудобства, например, при необходимости проверять входные аргументы до вызова суперконструктора (как в примере выше), при передаче одного и того же вычисляемого параметра в суперконструктор несколько раз или при нетривиальной подготовке параметра перед передачей его в суперконструктор.
JEP предлагает это ограничение снять и позволить писать инструкции до вызова super()
/ this()
. Однако для кода до вызова остаётся ограничение, что он должен быть в статическом контексте, то есть не должен ссылаться на текущий объект явно или неявно (использовать this
, вызывать нестатические методы и так далее).
Любопытно, что в спецификации JVM подобного ограничения нет, и она разрешает произвольный код до вызова super()
/ this()
, если он не ссылается на конструируемый объект. Таким образом, предлагаемое изменение будет чисто языковым изменением, без необходимости менять что-то в виртуальной машине.
• Черновик JEP "Support for primitive types in instanceof
and type patterns", о котором мы писали в выпуске #49, был переименован в "Primitive types in patterns, instanceof
, and switch
". Добавилось важное дополнение, что примитивные типы смогут появляться в ветках switch
. Например:
int i = ...; switch (i) { case byte b -> ... ; case float f -> ... ; default -> ...; }
Кроме того, список типов константных выражений в ветках будет расширен до всех примитивных типов, включая long
, float
, double
и boolean
:
float f = ...; switch (f) { case 1.0f -> ... case 1.5f -> ... case float g -> ... }
long x = ...; switch (x) { case 10_000_000_000L -> ... case 20_000_000_000L -> ... default -> ... }
boolean b = ...; switch (b) { case true -> ... case false -> ... }
• Oracle изменила правила платной подписки на Java SE. Теперь единицей, по которой рассчитывается стоимость, становится сотрудник компании, а не процессор. Таким образом, теперь на цену подписки влияет только количество сотрудников, а не количество серверов и настольных компьютеров, на которых запущена Java (если только у вас не больше 50000 процессоров на серверах). Это приведёт к подорожанию подписки для большинства случаев. В некоторых случаях такой рост будет на порядок.
Напомним, что Java была и остаётся свободным ПО, и вышеупомянутое изменение ценовой политики Oracle никак не повлияет на пользователей OpenJDK, которая продолжает оставаться бесплатной. Останется бесплатной и Oracle JDK 17, в том числе и для коммерческого использования. Повышение тарифных планов коснётся только компаний, имеющих Oracle Java SE Universal Subscription.