Возвращает универсальное значение из выражения switch в Java-12 - PullRequest
0 голосов
/ 11 марта 2019

Мне интересно, есть ли возможность вернуть универсальный тип из выражения переключателя 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?!");
};

EDIT:

Может быть, лучший пример из моего случая: мне нужно несколько классов, представляющих примитивные и сложные структуры данных. У меня также есть фабричный метод, который создает 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 ]

1 голос
/ 31 марта 2019

Есть ли прибыль, чтобы переместить этот код и использовать выражение переключения из 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 не добавляет никакой информации.Возможно, вы захотите задать новый вопрос о ваших структурах данных.

1 голос
/ 11 марта 2019

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

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

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

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

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

...