发送方法实现作为参数

时间:2017-06-21 07:12:08

标签: java methods reflection lambda

好的我正在开发这个库,我需要用户能够实现自己的渲染方法实现,如果"默认"不满意,我该怎么做?

我知道可以用JavaScript发送函数,我想我需要一个类似Java的构造。

我一直在考虑lambdas以及Java的Method类。

你们会说什么是我最好的选择?

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你会想要一个系统,其中使用你的库的人可以通过某种方式覆盖默认算法和他们自己的实现。这看起来像这样:

public class Renderer{
    // Declare an interface which specifies a single method that handles rendering
    public interface RenderHandler{ void render(float f, float f1); }

    // Declare a default implementation that is created with each instance of the Renderer
    protected RenderHandler handler = (f, f1) -> { System.out.println("Replace me!"); };

    // Define a system of replacement for the rendering routine
    public void replaceHandler(RenderHandler replacement){
        if(replacement!=null) handler = replacement; // Determine a viable replacement
    }

    // This shows that the same method can be called but yield different results
    // based on how the RenderHandler object in the "handler" field is implemented
    public void handleRender(float f, float f1){ handler.render(f, f1); }
}

现在,此示例将允许您的库的用户使用自定义实现调用replaceHandler()来替换Renderer对象附带的默认实现。例如:

public static void main(String[] args){
    Renderer r = new Renderer();                              // Create Renderer object
    r.handleRender(1f, 2f);                                   // Prints "Replace me!"
    r.replaceHandler((f, f1)->{ System.out.println(f*f1); }); // Lambda implementation
    r.handleRender(1f, 2f);                                   // Prints "2"
}

如您所见,替换的实际实现由使用您的库的人员处理(默认实现除外)。因此,您不必担心 它的实施方式,只有在请求替换时,它才会真正 实现。这意味着如果要支持自定义呈现例程的选项,可以通过使用适当的方法定义接口并简单地实现默认接口并允许使用方法替换(如第一个代码示例中所示)来实现