检查默认响应时避免代码重复

Sch*_*ute 2 java code-duplication

我有一个调用外部 API 的 Java 程序(RealApi在下面的代码中),有时我想避免调用这个 API,而是返回预先构造的响应(由 生成FakeApi)。

所以,我最终在我的大多数方法中复制了这种结构:

public Type1 m1(String s) {
    try {
        Type1 r = FakeApi.m1(s);
        if (r != null) {
            return r;
        }
    } catch (Exception e) {
        // log error
    }

    return RealApi.m1(s);
}
Run Code Online (Sandbox Code Playgroud)

有哪些选项可以避免在任何地方复制这个 try/catch 块?重要的是,如果FakeApi抛出异常或返回 null,则RealApi必须调用 。

Tho*_*sPr 6

一种选择是将错误检查行为封装到它自己的方法中:

public <T> T fakeOrReal(Supplier<T> fake, Supplier<T> real) {
  try {
    T r = fake.get();
    if (r != null) {
      return r;
    }
  }
  catch (Exception e) {
    // log error
  }

  return real.get();
}
Run Code Online (Sandbox Code Playgroud)

然后你可以调用它

public Type1 m1(String s) {
  return fakeOrReal(() -> FakeApi.m1(s), () -> RealApi.m1(s));
}
Run Code Online (Sandbox Code Playgroud)