目前,我正在一个项目上,我想减少代码中的一些危险信号开关。我的解释很长,请忍受。
我有一个容器对象。此容器具有某个类型的值(bool,int,email ...),我需要能够切换此类型。例如,如果值是可转换的,则需要将“字符串”容器转换为“整数”容器。起初,我想到使用泛型,但由于其他原因,我无法重新制作容器对象。我需要能够在不新建容器的情况下进行更改。我创建了一个超类Supertype
,并为每个可能的值创建了一个子类:IntType
,BooleanType
等。这种方法的问题在于,在每个子类中都有一个方法“ {{1 }}(对应于类型的枚举)”,它具有一个switch语句,用于检查我们可以使用的不同类型。
开关是危险信号,我知道,这是一个危险信号,因为每次引入新类型时,我都必须将其添加到每个子类的开关中。
我的想法是将当前值转换为String并将该String与集中式类中的每种类型进行比较,这样,如果有新类型,我只能在该位置添加一个比较。
是否有更好的方法来解决此问题?
编辑:
canValueConvertToType
在旧版本中,每个子类都可以使用此开关。
<<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;
}
vs
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());
}
}
PS:必须将草稿中的代码与快速编写的想法结合起来,所以我希望我不会犯任何命名错误。