我正在为我们创建的API编写演示代码,并且我一直在遇到同样的问题,我正在重复自己,一遍又一遍地恶心。我很痛苦地意识到Java计划添加闭包但我现在无法访问它们。以下是我想在其自己的小角落里插入的地方重复的内容:
public BarObj Foo(Double..._input){
try{
//things that vary per function
//but everything else...
} catch(NullException _null){
m_Logger.error("Null error exception caught in Blah::Foo");
return null;
} catch(Exception ex){
m_Logger.error( ex.getMessage() );
return null;
}
}
关于我想到的唯一方法是将Method
传递给一个函数,该函数带有try-catch逻辑并将其全部包装在另一个函数中,如下所示:
public BarObj MyFunc(Double..._input){
return compose("MyLogic",_input);
}
private BarObj MyLogic(Double..._input)
throws Exception{
//stuff
}
但它看起来很丑陋并带有很多样板。是否有更简单的方法在Java中编写函数?
答案 0 :(得分:8)
但是,您可以在对象中封装操作:
interface Function<R, T> {
R call(T... input);
}
然后将Foo
重构为:
static <R, T> R runFunction(Function<R, T> function, T ... input){
try{
return function.call(input);
} catch(NullPointerException _null){
m_Logger.error("Null error exception caught in Blah::Foo");
return null;
} catch(Exception ex){
m_Logger.error( ex.getMessage() );
return null;
}
}
测试用例:
class SumDoubles implements Function<Double, Double> {
@Override
public Double call(Double... input) {
Double sum = 0.0;
for (Double d : input) {
sum += d;
}
return sum;
}
}
@Test
public void sum() {
Double sum = runFunction(new SumDoubles(), 1.0, 2.0, 3.0);
assertThat(sum, is(6.0));
}
答案 1 :(得分:2)
试试lambdaj。它允许以非常轻松和可读的方式向Java添加一些FP。 特别是在这个closure wiki page中,你可以找到一个与你想要达到的非常相似的例子,
答案 2 :(得分:0)
这显然是你的电话,但对于我使用的大多数API演示,我更喜欢你在顶部拥有的更长的格式。在查看代码之后,我通常会进行复制和粘贴以验证API的工作方式,就像我认为的那样,然后从那里修改它。更改格式以隐藏一些重复的部分肯定是你想要为OO开发做什么,但我认为这种演示代码是“清洁代码之神”会理解的东西:-)。
答案 3 :(得分:0)
在java中无法做到这一点,但如果可能的话,请尝试使用groovy。您可以使用相似包装的另一个选项是使用方面。见aspectj。
答案 4 :(得分:0)
我在Java中学到了这样做的方法是创建一个有一个方法的接口。在您的代码中,您使用实现该接口的类。