Боюсь, что нет способа обойти какую-либо распечатку / отображение между значениями каждого входного MessageType и возвращаемого.
Возможно, вы могли бы попытаться применить некоторый подход, основанный на рефлексии, учитывая, что имена очень похожи ... однако я думаю, что это не принесет ничего, кроме проблем в будущем, если такие имена изменятся, и у вас будет снижение производительности, если вы будете выполнять это преобразование. часто.
В дополнение к другим ответам, основанным на статических картах, которые, кстати, вполне хороши, если у вас есть контроль над кодом, возвращайте MessageType
enum (т.е. вы разрабатываете такое enum). Я думаю, что вы должны рассмотреть возможность инкапсуляции преобразования в этом enum путем перегрузки одного и того же имени для каждого типа аргумента.
Здесь есть несколько вариантов ... Я лично предпочитаю of
для названия. valueOf
приемлемо, но так как valueOf (String) выдаст исключение NoSuchElementException, вы должны сохранить это поведение. Давайте придерживаться of
здесь:
enum MessageType {
WARN, INFO, ERROR;
private static Map<pl.different.MessageType, MessageType> byPlDiffMType =
new EnumMap<>(Map.of(
pl.different.MessageType.WARN, WARN,
pl.different.MessageType.INFO, INFO,
pl.different.MessageType.ERROR, ERROR
));
private static Map<com.other.MessageType, MessageType> byCOthMType =
new EnumMap<>(Map.of(
com.other.MessageType.WARNING, WARN,
com.other.MessageType.INFO, INFO,
com.other.MessageType.ERROR, ERROR
));
public static MessageType of(pl.different.MessageType value) {
return of(byPlDiffMType, value);
}
public static MessageType of(com.other.MessageType value) {
return of(byCOthMType, value);
}
private static <V> MessageType of(Map<V, MessageType> map, V value) {
final MessageType result = map.get(value);
if (result == null) {
throw new IllegalArgumentException();
} else {
return result;
}
}
}
Даже если у вас нет контроля над этим источником класса, вам, вероятно, лучше по производительности использовать EnumMap
, а не обычные Map
с (например, HashMap
).
Я знаю, что вы не экономите много кода, хотя ... но я думаю, что преобразование в перечисление имеет смысл быть инкапсулированным в самом классе перечисления, если вы его разрабатываете.
Единственный способ уменьшить линию - это сделать какое-то сопоставление через общие имена, добавив if
s для тех, кто отличается, но я бы не советовал делать это, так как это молча сломалось бы с изменениями в будущем и вероятно, меньше "перформанс".