调用作为参数传入的方法的非静态通用函数

Non-Static Generic function that invokes a method passed in as a parameter

我正在尝试将 2 个方法合并为 1 个,因为它们处理异常的方式相同。我知道在 C# 中你可以将 functions/actions 作为参数传递给其他函数。我尝试创建一个通用方法来调用一个函数,但似乎无法弄清楚。

public String getTheStuff(String client) {
    try {
        return extService.getProduct(client);
    } catch (UIException e) {
        notHealthy();
    } catch (HostException e) {
        notHealthy();
    } catch (Exception e) {
        Throwables.propagate(e);
    }
}

public CustomType getsomeMoreStuff(String source, int offset) {
    try {
        return extService.getMetrics(source, offset);
    } catch (UIException e) {
        notHealthy();
    } catch (HostException e) {
        notHealthy();
    } catch (Exception e) {
        Throwables.propagate(e);
    }
}

我要找的是

public T invokeExtService(Function functionToInvoke, Parameters[] params){
    try {
        return functionToInvoke.Invoke(params);
    } catch (UIException e) {
        notHealthy();
    } catch (HostException e) {
        notHealthy();
    } catch (Exception e) {
        Throwables.propagate(e);
    }
}

正如@LouisWasserman 所说,这在 Java 8 中会好得多,但是这样的东西怎么样(未经测试):

public <T> T invoke(Callable<T> function) {
    try {
        return function.call();
    } catch (UIException e) {
        notHealthy();
    } catch (HostException e) {
        notHealthy();
    } catch (Exception e) {
        Throwables.propagate(e);
    }
}

public String getTheStuff(final String client) {
    return invoke(new Callable<String>() {
        @Override
        public String call() {
            return extService.getProduct(client);
        }
    });
}

public CustomType getsomeMoreStuff(final String source, final int offset) {
    return invoke(new Callable<CustomType>() {
        @Override
        public CustomType call() {
            return extService.getMetrics(source, offset);
        }
    });
}

老实说,考虑到您的方法有多短(使用 multi-catch 它们可能会更短),我不确定这样做是否值得。