代码之家  ›  专栏  ›  技术社区  ›  wheaties

在Java中编写函数?

  •  9
  • wheaties  · 技术社区  · 14 年前

    我正在为我们创建的一个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中有更简单的方法来编写函数吗?

    5 回复  |  直到 14 年前
        1
  •  8
  •   dfa    14 年前

    在Java中,这是非常困难的,因为没有对函数的第一类支持(不像Culjule/Scala,也可能不同于其他)。

    但是,你可以 封装 对象中的操作:

    interface Function<R, T> {
    
         R call(T... input);
    }
    

    然后重构 Foo AS:

    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));
    }
    
        2
  •  2
  •   Mario Fusco    14 年前

    尝试 lambdaj .它允许以一种非常轻便和可读的方式向Java添加一点FP。 尤其是在这方面 closure wiki page 你可以找到一个与你想要达到的目标非常相似的例子,

        3
  •  0
  •   SOA Nerd    14 年前

    这显然是您的要求,但对于我使用过的大多数API演示,我更喜欢顶部的较长格式。在我查看了代码之后,我通常会进行复制和粘贴来验证API的工作方式,就像我认为的那样,然后从那里修改它。更改格式以隐藏一些代表性的部分显然是您想要为OO开发做的,但是我认为这种演示代码是“干净代码之神”可以理解的:—)。

        4
  •  0
  •   Teja Kantamneni    14 年前

    在Java中没有办法做到这一点,但是如果可能的话,尝试使用Groovy。另一个可以使用类似包装的选项是使用Aspect。看见 aspectj .

        5
  •  0
  •   DerMike Vladimír Schäfer    14 年前

    我在Java中学到的方法是创建一个具有一种方法的接口。在代码中,使用实现该接口的类。