尝试删除冗余的开关盒

时间:2019-03-07 13:31:31

标签: java switch-statement backend

目前,我正在一个项目上,我想减少代码中的一些危险信号开关。我的解释很长,请忍受。

我有一个容器对象。此容器具有某个类型的值(bool,int,email ...),我需要能够切换此类型。例如,如果值是可转换的,则需要将“字符串”容器转换为“整数”容器。起初,我想到使用泛型,但由于其他原因,我无法重新制作容器对象。我需要能够在不新建容器的情况下进行更改。我创建了一个超类Supertype,并为每个可能的值创建了一个子类:IntTypeBooleanType等。这种方法的问题在于,在每个子类中都有一个方法“ {{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:必须将草稿中的代码与快速编写的想法结合起来,所以我希望我不会犯任何命名错误。

0 个答案:

没有答案