2017-09-25 66 views
2

例如:如何用相同的重复代码块来包围不同的代码块?

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

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

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

我的问题是,有没有办法不具有在每个功能(例如在try-catch块和IFS)的所有重复的代码?这真的会清理我的项目,并会帮助我专注于重要的代码。

+0

你可能想在这里研究一些方面。本质上是在建议之前,之后或周围修饰任何给定的方法调用,以便重复的超出范围的代码不会妨碍。既然你使用的是Spring,那么你很幸运,因为有一个特定的Spring AOP库。 – Mena

+0

是否在所有情况下处理异常? – Maroun

+0

因此,在你的例子中,你有所有相同的变量,在这种情况下,我不明白你为什么需要3种不同的方法,这是实际项目的方式吗? – user2023608

回答

4

如何将Runnable传递给一个新的方法来捕获异常呢?

public void foo(String something, Boolean flag, Object obj) { 
    runSafe(something, flag,() => /*some code capturing obj*/); 
} 

public void doo(String something, Boolean flag) { 
    runSafe(something, flag,() => /*different code*/); 
} 

public void roo(String something, Boolean flag, Integer id) { 
    runSafe(something, flag,() => /*some code capturing id*/); 
} 

private void runSafe(string something, Boolean flag, Runnable r) { 
    try { 
     if (flag) { 
      r.run(); 
     } 
    } catch(Exception e) { 
     // handle exception 
    } 
} 

但是,传递一个布尔表示是否执行代码对我来说看起来是错误的。为什么不使用这些方法的空对象实现(无所事事)而不是传递false?

+0

'Runnable'不能抛出检查异常。不知道是否检查OP的异常... – slim

+0

@slim好的一点,在这种情况下,'Callable '可以用来替代或者更好地使用合适的特定用户定义的功能接口来实现相同的想法。 – Joffrey

+0

如果函数foo/doo/roo不是void函数呢?运行我应该使用什么? – Wolfyaskingstuff

0

你可以用try-catch包围这个方法的调用。如果您需要每个异常的唯一响应,您可以创建一个扩展异常的对象,或者仅使用带有字符串消息的异常构造函数。

相关问题