用switch case分解复杂方法

我的应用程序中有一个取决于参数类型的逻辑,现在它的工作方式如下:


   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);

                    }


正如你所看到的,我有相同的逻辑,唯一改变的是一种解析值的方法。是否有可能摆脱重复的代码?我想可以制作一些函数式接口函数的映射,但不确定应该如何完成。有什么建议么?


Helenr
浏览 94回答 3
3回答

慕尼黑5688855

如果我理解正确,那么可能是这样的:Map<Type, Consumer<Builder>> map = Map.of(&nbsp; &nbsp; &nbsp;BOOLEAN, x -> x.add(BOOLEAN.parseBool()),&nbsp; &nbsp; &nbsp;STRING, x -> x.add(STRING.parseString()));map.get(type).accept(builder);

万千封印

不确定您需要什么,但您可以使用泛型类型。public class Element<T> {&nbsp; &nbsp; // T stands for "Type"&nbsp; &nbsp; private T t;&nbsp; &nbsp; public void set(T t) { this.t = t; }&nbsp; &nbsp; public T get() { return t; }}您可以在您的功能中使用:public Object parse(Element t){&nbsp; &nbsp; if( t.get() instanceof Boolean )&nbsp; &nbsp; &nbsp; &nbsp; return parseBoolean(t);&nbsp; &nbsp; else if ( t.get() instanceof String )&nbsp; &nbsp; &nbsp; &nbsp; return parseString(t);}

猛跑小猪

首先映射 DOUBLE-to-Double 等等,可以在枚举中完成:enum ValueType {&nbsp; &nbsp; DOUBLE(Double.class), // Or Double[].class&nbsp; &nbsp; BOOLEAN(Boolean.class),&nbsp; &nbsp; ...;&nbsp; &nbsp; public final Class<?> type;&nbsp; &nbsp; ValueType(Class<?> type) {&nbsp; &nbsp; &nbsp; &nbsp; this.type = type;&nbsp; &nbsp; }}显然代码已经太专业了,而实际上确切的类型是无关紧要的。在这个级别上,一个值可能只是一个 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) {&nbsp; &nbsp; propertiesBuilder.addProperty(parameter.getName(), parameter.getValue(0));} else if (countOfParameters > 1) {&nbsp; &nbsp; Object array = Array.newInstance(t, countOfParameters);&nbsp; &nbsp; Class<?> componentT = array.getClass().getComponentType(); // == t&nbsp; &nbsp; Object[] values = new Object[countOfParameters];&nbsp; &nbsp; for (int kj = 0; kj < countOfParameters; kj++) {&nbsp; &nbsp; &nbsp; &nbsp; Array.set(array, kj, parameter.getValue(kj));&nbsp; &nbsp; &nbsp; &nbsp; values[kj] = parameter.getValue(kj);&nbsp; &nbsp; }&nbsp; &nbsp; propertiesBuilder.addProperty(parameter.getName(), values); // or array}我添加了一些反射代码 ( Array),希望不需要。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java