亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用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 關注
  • 125 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號