#java #switch-statement #backend
#java #switch-инструкция #серверная часть
Вопрос:
На данный момент я работаю над проектом, и у меня есть несколько переключений с красным флагом в моем коде, которые я хотел бы уменьшить. Мое объяснение довольно длинное, пожалуйста, потерпите меня.
У меня есть объект-контейнер. Этот контейнер имеет значение определенного типа (bool, int, email …), и мне нужно иметь возможность переключать этот тип. Например, мне нужно переключить «строковый» контейнер на «Целочисленный» контейнер, если значение можно преобразовать. Сначала я думал использовать Generics, но по другим причинам я не могу переделать объект container. Мне нужно иметь возможность изменять его, не создавая новый контейнер. Я создал суперкласс Supertype
и для каждого возможного значения подкласс: IntType
, BooleanType
и т.д. Проблема с этим подходом заключается в том, что в каждом подклассе существует метод « canValueConvertToType
(перечисление, соответствующее типу)», который имеет оператор switch, который проверяет наличие различных типов, которые мы можем использовать.
Переключатели — это красные флажки, я знаю, и это красный флаг в огне, поскольку каждый раз, когда вводится новый тип, мне пришлось бы добавлять его к переключателю в каждом отдельном подклассе.
Моя идея состояла в том, чтобы преобразовать текущее значение в строку и сравнить эту строку с каждым типом в централизованном классе, чтобы при наличии нового типа я добавлял только одно сравнение в этом одном месте.
Есть ли лучший способ решить эту проблему?
Редактировать:
<<centralized class>>
public class HulpMethodes {
public static SuperType createSuperType(Enum type, Object value){
switch(type){
case BOOLEAN: return new BoolType((Boolean) value);
case INTEGER: return new IntType((Integer) value);
}
return null;
}
public static boolean canValueConvertToType(Enum type, String value){
switch(type){
case BOOLEAN: return <<method to check this>>
case INTEGER: return <<method to check this>>
}
}
}
В старой версии этот переключатель был бы доступен для каждого подкласса.
<<Old example of canConvert-Method in IntType>>
@Override
public boolean canValueConvertToType(Enum type) {
switch(type){
case BOOLEAN:
return false;
case EMAIL:
return false;
case STRING:
return true;
case INTEGER:
return true;
}
return false;
}
Способ вызова этих методов изменится на.
public class Container {
private SuperType type;
public Container(Enum type, Object value){
this.type = HulpMethodes.createSuperType(type,value);
}
public void canValueConvertToType(Enum type){
HulpMethodes.canValueConvertToType(type, this.type.valueToString());
}
}
против
public class Container {
private SuperType type;
public Container(Enum type, Object value){
this.type = HulpMethodes.createSuperType(type,value);
}
public void canValueConvertToType(Enum type){
this.type.canValueConvertToType(type);
}
}
PS: пришлось объединить код из черновика с быстро написанной идеей, поэтому я надеюсь, что я не допустил ошибку в именовании или что-то в этом роде.
Комментарии:
1. Покажите нам какой-нибудь код. Я слишком глуп и ленив, чтобы визуализировать это.
2. Можете ли вы обновить код, который пытаетесь исправить?
3. я надеюсь, что это вам немного поможет 🙂