为了账号安全,请及时绑定邮箱和手机立即绑定

用switch case分解复杂方法

用switch case分解复杂方法

Helenr 2022-07-27 09:13:34
我的应用程序中有一个取决于参数类型的逻辑,现在它的工作方式如下:   switch (parameter.getType()) {                case DOUBLE:                    countOfParameters = parameter.getDoubleValueCount();                    if (countOfParameters == 1) {                        propertiesBuilder.addProperty(parameter.getName(), parameter.getDoubleValue(0));                    } else if (countOfParameters > 1) {                        Double[] doubleValues = new Double[countOfParameters];                        for (int kj = 0; kj < countOfParameters; kj++) {                            doubleValues[kj] = parameter.getDoubleValue(kj);                        }                        propertiesBuilder.addProperty(parameter.getName(), doubleValues);                    }                    break;                case BOOLEAN:                    countOfParameters = parameter.getBoolValueCount();                    if (countOfParameters == 1) {                        propertiesBuilder.addProperty(parameter.getName(), parameter.getBoolValue(0));                    } else if (countOfParameters > 1) {                        Boolean[] booleanValues = new Boolean[countOfParameters];                        for (int kj = 0; kj < countOfParameters; kj++) {                            booleanValues[kj] = parameter.getBoolValue(kj);                        }                        propertiesBuilder.addProperty(parameter.getName(), booleanValues);                    }正如你所看到的,我有相同的逻辑,唯一改变的是一种解析值的方法。是否有可能摆脱重复的代码?我想可以制作一些函数式接口函数的映射,但不确定应该如何完成。有什么建议么?
查看完整描述

3 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

如果我理解正确,那么可能是这样的:


Map<Type, Consumer<Builder>> map = Map.of(

     BOOLEAN, x -> x.add(BOOLEAN.parseBool()),

     STRING, x -> x.add(STRING.parseString())

);



map.get(type).accept(builder);


查看完整回答
反对 回复 2022-07-27
?
万千封印

TA贡献1891条经验 获得超3个赞

不确定您需要什么,但您可以使用泛型类型。


public class Element<T> {

    // T stands for "Type"

    private T t;


    public void set(T t) { this.t = t; }

    public T get() { return t; }

}

您可以在您的功能中使用:


public Object parse(Element t){

    if( t.get() instanceof Boolean )

        return parseBoolean(t);

    else if ( t.get() instanceof String )

        return parseString(t);

}


查看完整回答
反对 回复 2022-07-27
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

首先映射 DOUBLE-to-Double 等等,可以在枚举中完成:


enum ValueType {

    DOUBLE(Double.class), // Or Double[].class

    BOOLEAN(Boolean.class),

    ...;


    public final Class<?> type;


    ValueType(Class<?> type) {

        this.type = type;

    }

}

显然代码已经太专业了,而实际上确切的类型是无关紧要的。在这个级别上,一个值可能只是一个 Object 并且可以有Object[]。


因此,一些深度重构将是理想的。


ValueType vt = parameter.getType();

Class<?> t = vt.type;


Object array = Array.newInstance(t, countOfParameters);

// Actuallly Double[] or such.


int countOfParameters = parameter.getValueCount();

if (countOfParameters == 1) {

    propertiesBuilder.addProperty(parameter.getName(), parameter.getValue(0));

} else if (countOfParameters > 1) {

    Object array = Array.newInstance(t, countOfParameters);

    Class<?> componentT = array.getClass().getComponentType(); // == t


    Object[] values = new Object[countOfParameters];

    for (int kj = 0; kj < countOfParameters; kj++) {

        Array.set(array, kj, parameter.getValue(kj));

        values[kj] = parameter.getValue(kj);

    }

    propertiesBuilder.addProperty(parameter.getName(), values); // or array

}

我添加了一些反射代码 ( Array),希望不需要。


查看完整回答
反对 回复 2022-07-27
  • 3 回答
  • 0 关注
  • 93 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信