【问题标题】:Java 8: Pass object's method & its arguments as parameterJava 8:将对象的方法及其参数作为参数传递
【发布时间】:2018-04-13 23:38:47
【问题描述】:

我有两个班级 AB ,像这样:

class A {
    public Integer fetchMax() {
       // Make a network call & return result
    } 
}

class B {
    public Double fetchPercentile(Integer input) {
        // Make a network call & return result
    } 
}

现在我需要为fetchMax()fetchPercentile(Integer) 两种方法提供retry 机制。我想使用helper 类提供此行为,其中retry 方法可以采用(A 或B)的instancemethod-namemethod-arguments。重试基本上会重新尝试提供的对象方法。

类似这样的:

class Retry {
     public static R retry(T obj, Function<T, R> method,  Object... arguments) {
           // Retry logic
           while(/* retry condition */)
           {
                obj.method(arguments);
           }
     }
}

【问题讨论】:

    标签: java design-patterns lambda java-8


    【解决方案1】:

    只需将Callable 作为参数:

    public static <R> R retry(Callable<R> action) {
        // Retry logic
        while(/* retry condition */) {
            action.call();
        }
    }
    

    这样称呼它:

    Retry.retry(() -> a.fetchMax());
    Retry.retry(() -> b.fetchPercentile(200));
    

    您可能想要使用或从 guava-retrying 获得灵感,这是 Google 的 Guava library 的一个小扩展,以允许创建可配置的重试策略(免责声明:我是原作者)。

    【讨论】:

    • 在整个问题中,我不能只看到那里需要什么以及它是否与使用 Callable 相关,但在阅读完这篇文章后,我认为这可能是 OP 应该使用的。
    • 是的,这也是你在 pre java 8 中的做法。它应该仍然有效。 lambda 表达式可能也可以与接口一起使用,stackoverflow.com/questions/13604703/…
    猜你喜欢
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多