如何使用相同的重复代码块包围不同的代码块?虽然能够返回不同的值

时间:2017-09-26 06:15:42

标签: java spring

例如:

public Object foo(string something, Boolean flag, Object obj){
  try{
    if(flag){
       //some code
    }
 } catch(Exception e) {
     // handle exception
 }
}

public Object doo(string something, Boolean flag){
  try{
    if(flag){
       //different code
    }
 } catch(Exception e) {
     // handle exception
 }
}

public Object roo(string something, Boolean flag, Integer id){
  try{
    if(flag){
       //a bit of code
    }
 } catch(Exception e) {
     // handle exception
 }
}

我的问题是,有没有办法在每个函数中没有所有重复代码(例如try-catch块和ifs)?它会真正清理我的项目,并帮助我专注于重要的代码。

我已经问过这个关于void函数的问题,并注意到所提出的解决方案(使用runnable)对返回类型不是null的函数不起作用。有没有不同的方法来实现这个?

链接到我之前(和非常相关)的问题:How do I surround different blocks of code with the same repeating block of code?

3 个答案:

答案 0 :(得分:0)

当您需要返回值时,可以使用Callable而不是Runnable。我修改了Joffrey在另一个帖子中给出的例子:

class CallableExample {
    public static void main(String[] args) {
        CallableExample ce = new CallableExample();
        System.out.println(ce.foo("", true, ""));
        System.out.println(ce.doo("", true));
        System.out.println(ce.roo("", true, 1));
    }

    public Object foo(String something, Boolean flag, Object obj) {
        return runCallable(something, flag, new Callable() {
            @Override
            public Object call() throws Exception {
                return "foo";
            }
        });
    }

    public Object doo(String something, Boolean flag) {
        return runCallable(something, flag, new Callable() {
            @Override
            public Object call() throws Exception {
                return "doo";
            }
        });
    }

    public Object roo(String something, Boolean flag, Integer id) {
        return runCallable(something, flag, new Callable() {
            @Override
            public Object call() throws Exception {
                return "roo";
            }
        });
    }

    private Object runCallable(String something, Boolean flag, Callable c) {
        Object result = null;
        try {
            if (flag) {
                result = c.call();
            }
        } catch(Exception e) {
            // handle exception
        }
        return result;
    }
}

答案 1 :(得分:0)

查看Template Method设计模式和Execute Around习语。但是,如果您发现自己经常编写捕获异常的代码,那就是设计嗅觉:问问自己为什么要这样做,如果确实有必要的话。通常让异常传播到调用上下文更好。

答案 2 :(得分:0)

为什么在不同的方法中使用相同的代码,而是使用带有try catch的if-else-if逻辑为同一组代码编写单个函数并最小化代码 例如:

public Object foo(string something, Boolean flag, Object obj) {
    try {
       //convert the object type to primitive type data like int, String or any
       if(flag) {
          //your code 
       }
    catch(Exception ex) {
       //your code
    }
    //return the object;
}

将对象类型数据转换为基本类型并相应地使用它 如果逻辑

,请使用if else