Новости Java #53

• Вышли обновления 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.

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

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