Проблема сопоставления шаблонов Java 16 с Intellij IDEA 2020.3.3 (ожидается выражение)
Как мы знаем, в Java 16 появились новые функции, такие как записи, запечатанные интерфейсы и классы, а также сопоставление с образцом.
Сегодня я хотел использовать их в своем учебном проекте. Однако столкнулся с проблемой, может я чего-то не понимаю.
Итак, ситуация выглядит так, как на данном изображении, которое представляет мой проект Intellij Idea: у меня есть пакеты: client и order Класс клиента - это запечатанный интерфейс с тремя реализациями: Regular, Vip и SuperVip:
package com.example.records.domain.client;
public sealed interface Client permits Client.Regular, Client.SuperVip, Client.Vip {
Limit currentLimit();
record Regular() implements Client {
@Override
public Client.Limit currentLimit() {
return Client.Limit.of((short) 10);
}
}
record Vip() implements Client {
@Override
public Client.Limit currentLimit() {
return Client.Limit.of((short) 20);
}
}
record SuperVip() implements Client {
@Override
public Client.Limit currentLimit() {
return Client.Limit.of((short) 100);
}
}
record Limit(short value) {
public Limit {
if (value < 0) throw new IllegalArgumentException("Values below 0 not allowed!");
}
static Limit of(short value) {
return new Limit(value);
}
}
}
Класс заказа - это простой агрегат, известный из DDD: Но есть проблема с оператором switch:
package com.example.records.domain.order;
import com.example.records.domain.OrderId;
import com.example.records.domain.client.Client;
import com.example.records.domain.client.Client.*;
import com.example.records.shared.Money;
import com.example.records.shared.Result;
import java.util.LinkedList;
import java.util.List;
public class Order() {
private final OrderId orderId;
private final Client client;
private final LinesItems linesItems = LinesItems.empty();
Order(OrderId orderId, Client client) {
this.orderId = orderId;
this.client = client;
}
public Result add(LineItem lineItem) {
return switch (client) {
case Regular r -> addAnItemIfTheLimitIsNotExceeded(r.);
case Vip v -> addAnItemIfTheLimitIsNotExceeded(v.);
case SuperVip sv -> addAnItemIfTheLimitIsNotExceeded(sv.);
};
}
private Result addAnItemIfTheLimitIsNotExceeded(Limit limit) {
// TODO need impl
return Result.OK;
}
private static class LinesItems {
private final List<LineItem> lines = new LinkedList<>();
private LinesItems() {}
void add(LineItem lineItem) {
this.lines.add(lineItem);
}
Money cost() {
return lines.stream().map(LineItem::cost).reduce(Money.ZERO, Money::add);
}
static LinesItems empty() {
return new LinesItems();
}
}
}
record LineItem(Money cost) {}
Другие классы:
package com.example.records.domain;
public record OrderId(String value) {
public OrderId {
validate();
}
private void validate() {
if (value == null)
throw new IllegalArgumentException("Null value not allowed!");
if (value.isBlank())
throw new IllegalArgumentException("Blank value not allowed!");
}
}
package com.example.records.shared;
import java.math.BigDecimal;
public record Money(BigDecimal value) {
public static final Money ZERO = new Money(new BigDecimal("0.00"));
public Money add(Money money) {
return new Money(this.value.add(money.value));
}
}
package com.example.records.shared;
public sealed interface Result {
Success OK = new Success();
record Success() implements Result{}
record Failure(String message) implements Result {}
}
Я получаю "(Ожидаемое выражение)" Где я ошибся? (Экспериментальные функции включены, я установил Java 16 open jdk)
2 ответа
Типовые узоры в
instanceof
являются последней (не предварительной) функцией в Java 16. Однако шаблоны типов в
switch
еще не в Java 16; ожидается, что они скоро прибудут.
Владелец jeps 394 Гэвин Бирман уже представил JEP для этой функции.
Сопоставление с шаблоном для переключателя (предварительная версия)
Он еще не нацелен на выпуск.