(java || kotlin) && devOps
Еще одна интересная штука из последних JDK - правда не 27, а 26 - LazyConstants
https://openjdk.org/jeps/526
В чем суть? Вот пример кода - было\стало:
// OLD:
static final OrderController ORDERS = new OrderController();
// NEW:
static final LazyConstant<OrderController> ORDERS = LazyConstant.of(OrderController::new);
или так:
// OLD:
private static volatile OrderController instance;
public static OrderController getInstance() {
if (instance == null) {
synchronized (OrderController.class) {
if (instance == null) {
instance = new OrderController();
}
}
}
return instance;
}
Т.е. мы получаем из коробки:
1) ленивую инициализацию - Lazy
2) технический признак константы над формально обычным полем - Constant
3) однократное вычисление значения - как бонус.
Признак константы (@Stable) дает возможность провести различного рода оптимизации для компилятора и JIT.
Работает как с обычными, так и с static полями.
Можно подумать, что это подсмотрено в Kotlin - конструкция by lazy.
В плане boilerplate-less кода - возможно да.
Но у Kotlin это синтаксический сахар, в котором реализована ленивая инициализация и однократное вычисление.
Но нет признака @Stable, по крайней мере на данный момент.
Как по мне - штука полезная. Вспоминается один монолит, в разработке которого я лет 10 назад принимал участие. Монолит был большой, разрабатывало его под сотню человек. И периодически кто-то добавлял в один из классов static поле с тяжелой инициализацией, которая падала при старте из-за того, что нужных ресурсов еще не было.
#java #jvm #lang
96 ·