我写的演示代码,我们已经创建了一个API和我一直运行到同样的问题在那里我重复自己,一遍又一遍广告nauseum。我痛苦地意识到,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中的功能更简单的方法?

有帮助吗?

解决方案

在Java中,因为对于功能(不像Clojure的或阶和可能其它)无第一级的支持,这是非常困难的。

然而,可以的包封在一个对象的操作:

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));
}

其他提示

尝试 lambdaj 。它允许有点FP添加到Java技术很轻可读的方式。 特别是在这个关闭维基页面你可以找到一个例子非常相似,你想实现的,

这显然是你的电话,但与大多数API演示我用我喜欢,你必须在顶部的长格式。我期待在代码后,我通常做复制和粘贴到验证API作品就像我认为它然后从那里修改。更改格式隐藏某些但却难免重复件的肯定是你想要OO开发做什么,但我认为这有点演示代码是值得的“干净的代码神”将:-)理解。

有没有在Java这样的方式,但尽量使用Groovy是否有可能适合你。你可以有类似的包装另一种选择是使用方面。请参阅的AspectJ

我认识到这是用Java做的方式是创建一个有一个方法的接口。在你的代码使用实现该接口的类。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top