Возвращает универсальное значение из выражения switch в Java-12

Мне интересно, есть ли возможность вернуть универсальный тип из выражения переключателя Java 12.

Базовый код может выглядеть так:

boolean result = switch(ternaryBool) {
    case TRUE -> true;
    case FALSE -> false;
    default -> throw new IllegalArgumentException("Seriously?!");
};

Есть ли что-то против этого?

T result = switch(ternaryBool) {
    case TRUE -> BooleanUtils.toBoolean('true');
    case FALSE -> new Integer(0);
    default -> throw new IllegalArgumentException("Seriously?!");
};

РЕДАКТИРОВАТЬ:

Может быть, лучший пример из моего случая: мне нужно несколько классов, представляющих примитивные и сложные структуры данных. У меня есть также фабричный метод, который создает это DataPointValue на основе перечисления из другой системы и неизвестного значения (давайте забудем о приведении исключений):

public static <T> IDataPointValue create(T value, DATA_TYPE dataType) throws Exception {
    try {
        switch (dataType) {
            case BOOL:
                return new BoolDataPointValue((Boolean) value);
            case INT:
                return new IntDataPointValue((Integer) value);
            case WORD:
                return new IntDataPointValue((Integer) value);
            case STRING:
                return new StringDataPointValue((String) value);
            case REAL:
            case FLOAT:
                return new RealDataPointValue((Float) value);
            case DINT:
                return new DIntDataPointValue((Integer) value);
            case DWORD:
                return new DWordDataPointValue((Integer) value);
            default:
                throw new Exception("Data Type not implemented: " + dataType);
        }
    } catch (ClassCastException e){
        throw new Exception("Could not create DPV in terms of Type incompability");
    }
}

Есть ли какая-то прибыль, чтобы переместить этот код и использовать выражение переключения из Java 12?

2 ответа

Есть ли какая-то прибыль, чтобы переместить этот код и использовать выражение переключения из java12?

Это действительно зависит от того, что вы считаете прибылью. Есть несколько вещей, которые сразу приходят на ум при взгляде на соответствующие switch выражение:

public static <T> IDataPointValue create(T value, DATA_TYPE dataType) {
    return switch (dataType) {
        case BOOL ->        new BoolDataPointValue((Boolean) value);
        case INT ->         new IntDataPointValue((Integer) value);
        case REAL, FLOAT -> new RealDataPointValue((Float) value);
        // ...
    };
}
  1. Вам не нужно default случай, поскольку компилятор знает, что вы имеете дело со всеми значениями перечисления (изменения перечисления во время выполнения вызовут проблемы).
  2. Это немного более читабельно, так как вы return в целом выражение, а не в каждом case явно, и так как вам не нужно иметь дело с семантикой сквозного доступа.

Что касается непатентованной стороны вопроса, это не так ясно. Во-первых, ваш метод объявляет генетический параметр без границ и использует его только один раз, так что в этом нет никакого смысла. Декларация

public static <T> IDataPointValue create(T value, DATA_TYPE dataType)

такой же как

public static IDataPointValue create(Object value, DATA_TYPE dataType)

так как T не добавляет никакой информации. Возможно, вы захотите задать новый вопрос о ваших структурах данных.

Есть ли что-то против этого?

JEP 325: Выражения-переключатели (предварительный просмотр) в одном из столбцов приводят следующее о расширенном представлении оператора-переключателя (мое форматирование):

Выражение-переключатель является поли-выражением; если тип цели известен, этот тип проталкивается вниз в каждую руку.

Тип выражения switch является его целевым типом, если известен; если нет, то отдельный тип вычисляется путем комбинирования типов руки каждого случая.

Принимая выше как истину, тип выражения switch, как вы его написали, может быть Object если вы специально не сформировали собственную модель и не инкапсулировали типы.

Другие вопросы по тегам