java中递进式判断如何优化?

代码如下,如何优化这类代码?

 private static void test(String a, String b, String c, String d) {
if (StringUtils.isNotEmpty(a) && StringUtils.isNotEmpty(b) && StringUtils.isNotEmpty(c) && StringUtils.isNotEmpty(d)) {
//都不为空 do something
} else if (StringUtils.isNotEmpty(a) && StringUtils.isNotEmpty(b) && StringUtils.isNotEmpty(c) && StringUtils.isEmpty(d)) {
//abc不为空且d为空 do something
} else if (StringUtils.isNotEmpty(a) && StringUtils.isNotEmpty(b) && StringUtils.isEmpty(c) && StringUtils.isEmpty(d)) {
//ab不为空且cd为空 do something
} else if (StringUtils.isNotEmpty(a) && StringUtils.isEmpty(b) && StringUtils.isEmpty(c) && StringUtils.isEmpty(d)) {
//a不为空且bcd为空 do something
} else if (StringUtils.isEmpty(a) && StringUtils.isEmpty(b) && StringUtils.isEmpty(c) && StringUtils.isEmpty(d)) {
//都为空 do something
}
}

回答

/**
 * 两种优化方案
 */
public class JudgeOptimize {

    /**
     * 都不为空
     */
    private static final int CODE_CONDITION_ONE = 0000;

    /**
     * abc不为空 d为空
     */
    private static final int CODE_CONDITION_TWO = 0001;

    private static final int CODE_CONDITION_THREE = 0011;

    private static final int CODE_CONDITION_FOUR = 0111;

    private static final int CODE_CONDITION_FIVE = 1111;

    private static void test(String a,String b,String c,String d){
        switch (init(a,b,c,d)){
            case CODE_CONDITION_ONE:
                // DO SOMETHING ...
                break;
            case CODE_CONDITION_TWO:
                //DO SOMETHING ...
                break;
            case CODE_CONDITION_THREE:
                //DO SOMETHING ...
                break;
            case CODE_CONDITION_FOUR:
                //DO SOMETHING ...
                break;
            case CODE_CONDITION_FIVE:
                //DO SOMETHING ...
                break;
        }
    }

    private static int init(String ... allParam){
        if(allParam == null){
            return 1;
        }
        String resultNumberStr = "";
        for (String s : allParam) {
            resultNumberStr += StringUtils.isNotEmpty(s) ? 0 : 1;
        }
        return Integer.valueOf(resultNumberStr);
    }


}

/**
 * 第二种解决方案
 * 全自动 但是涉及反射
 */
@Getter
class SolutionTwo{

    private static Object result;

    @Data
    private static class Action{
        /**
         * 目标类
         */
        private Class targetInvokeClass;

        /**
         * 目标类中目标方法
         */
        private String targetMethodName;

        /**
         * 参数类型
         */
        private Class[] parameterTypes;

        /**
         * 目标方法参数对象
         */
        private Object[] params;

        /**
         * 是否是当前类中方法
         */
        private boolean isCurrentClass;

        /**
         * 是否方法不需要参数
         */
        private boolean isNoParams;

        public Action(){

        }

        public Action(Class targetInvokeClass, String targetMethodName,Class[] parameterTypes, Object[] params, boolean isCurrentClass, boolean isNoParams) {
            this.targetInvokeClass = targetInvokeClass;
            this.targetMethodName = targetMethodName;
            this.parameterTypes = parameterTypes;
            this.params = params;
            this.isCurrentClass = isCurrentClass;
            this.isNoParams = isNoParams;
        }
    }

    /**
     * 映射Map
     * 泛型Object是指令,
     * 泛型Action是指令对应的执行方案
     */
    private static final HashMap<Object,Action> ACTION_MAP = new HashMap<>(16);

    static class ResultAction{

        public void helloWorld(String name){
            System.out.println(name + ",你好世界");
        }

    }


    static {
        //都不为空
        ACTION_MAP.put(0,new Action(ResultAction.class,"helloWorld",new Class[]{String.class},new String[]{"我是张三"},false,false));
        //abc不为空 d为空
        ACTION_MAP.put(1,new Action(ResultAction.class,"helloWorld",new Class[]{String.class},new String[]{"我是李四"},false,false));
        //ab不为空 cd为空
        ACTION_MAP.put(11,new Action(ResultAction.class,"helloWorld",new Class[]{String.class},new String[]{"我是王五"},false,false));
        //a不为空 bcd为空
        ACTION_MAP.put(111,new Action(ResultAction.class,"helloWorld",new Class[]{String.class},new String[]{"我是赵六"},false,false));
        //abcd都为空
        ACTION_MAP.put(1111,new Action(ResultAction.class,"helloWorld",new Class[]{String.class},new String[]{"我是张三他爹"},false,false));
    }

    private static void test(String a,String b,String c,String d){
        int result = init(a, b, c, d);
        Action action = ACTION_MAP.get(result);
        if(action != null){
            handler(action);
        }else{
            System.out.println("未找到对应映射键");
        }
    }

    private static void handler(Action action) {
        try {
            Method method = null;
            Class cls = null;
            if (action.isCurrentClass()) {
                method = getMethod(SolutionTwo.class,action.getTargetMethodName(),action.getParameterTypes());
                cls = SolutionTwo.class;
            }else{
                Class targetClass = action.getTargetInvokeClass();
                method = getMethod(targetClass, action.getTargetMethodName(), action.getParameterTypes());
                cls = action.getTargetInvokeClass();
            }
            result = method.invoke(cls.newInstance(), action.getParams());
        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | InstantiationException e) {
            e.printStackTrace();
        }
    }


    private static Method getMethod(Class cls,String methodName,Class[] parameterTypes) throws NoSuchMethodException {
        return cls.getMethod(methodName,parameterTypes);
    }


    private static int init(String ... allParam){
        if(allParam == null){
            return 1;
        }
        String resultNumberStr = "";
        for (String s : allParam) {
            resultNumberStr += StringUtils.isNotEmpty(s) ? 0 : 1;
        }
        return Integer.valueOf(resultNumberStr);
    }

    public static void main(String[] args) {
        test("1",null,null,null);
    }
}
以上是java中递进式判断如何优化?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>