【问题标题】:Send a method implementation as parameter发送方法实现作为参数
【发布时间】:2017-06-21 07:12:07
【问题描述】:

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

我知道可以在 JavaScript 中发送函数,并且我认为我需要在 Java 中使用类似的构造..

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

你们觉得我最好的选择是什么?

【问题讨论】:

  • 要遵循有关 Lambda 的指南,它们正是您想要的。旧的方法是 Command Pattern 传递实例来执行它(这基本上是 lambda 会做的)

标签: java methods reflection lambda


【解决方案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"
}

如您所见,替换的实际实现由使用您的库的人处理(默认实现除外)。因此,您不必担心 如何 它是如何实现的,只需要在请求替换的情况下,它实际上是 实现的。这意味着,如果您想支持自定义渲染例程的选项,您可以通过使用适当的方法定义一个接口并简单地实现一个默认方法并允许使用方法进行替换(如第一个代码示例中所示) .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-25
    • 2021-10-10
    • 1970-01-01
    • 2011-07-15
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    相关资源
    最近更新 更多