В данный момент я работаю над проектом, и в моем коде есть несколько переключателей с красным флагом, которые я бы хотел уменьшить.Мое объяснение довольно длинное, пожалуйста, потерпите меня.
У меня есть контейнерный объект.Этот контейнер имеет значение определенного типа (bool, int, email ...), и мне нужно иметь возможность переключать этот тип.Например, мне нужно переключить «String» -контейнер на «Integer» -контейнер, если значение является конвертируемым.Сначала я думал об использовании Generics, но по другим причинам я не могу переделать контейнерный объект.Я должен быть в состоянии изменить это, не делая новый контейнер.Я создал суперкласс Supertype
и для каждого возможного значения подкласс: IntType
, BooleanType
и т. Д. Проблема с этим подходом состоит в том, что в каждом подклассе есть метод "canValueConvertToType
(перечисление, соответствующее типу)msgstr "в котором есть оператор 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());
}
}
vs
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: пришлось комбинировать код из черновика с быстро написанной идеей, поэтому я надеюсь, что я не сделалименная ошибка или что-то.