Retrofit 2.0 (beta 2) 中的 validateEagerly() 方法

validateEagerly() method in Retrofit 2.0 (beta 2)

validateEagerly()(Retrofit 2.0 beta 2)方法到底有什么作用? 我在哪里可以应用此方法?

JavaDoc 说 When calling create on the resulting Retrofit instance, eagerly validate the configuration of all methods in the supplied interface. 但这个描述不是很清楚。

validateEagerly() 验证您在构建 Retrofit 实例时提供的配置。这将检查您的接口注释是否有有效的 Retrofit 注释,检查参数和方法参数,如果它们与注释集一致,还会检查可能不正确的方法 return 类型(不同于 Call<T>)。

通常在构建 Retrofit 实例之前调用检查。

private Retrofit getRetrofit() {
        OkHttpClient okClient = getOkHttpClient();
        GsonBuilder builder = getGsonBuilder();
        Retrofit.Builder retrofitBuilder = new Retrofit.Builder();
        retrofitBuilder.client(okClient);
        retrofitBuilder.baseUrl(API_ENDPOINT);
        retrofitBuilder.addConverterFactory(GsonConverterFactory.create(builder.create()));
        retrofitBuilder.validateEagerly();
        return retrofitBuilder.build();
    }

如果某些内容无效,它可以抛出 IllegalArgumentException 不同的消息和原因。

如果您想尽快验证接口中的所有方法,您希望validateEagerly(true)

  public <T> T create(final Class<T> service) {
Utils.validateServiceInterface(service);
if (validateEagerly) {//here 
  eagerlyValidateMethods(service);
}
return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
    new InvocationHandler() {
      private final Platform platform = Platform.get();

      @Override public Object invoke(Object proxy, Method method, Object... args)
          throws Throwable {
        // If the method is a method from Object then defer to normal invocation.
        if (method.getDeclaringClass() == Object.class) {
          return method.invoke(this, args);
        }
        if (platform.isDefaultMethod(method)) {
          return platform.invokeDefaultMethod(method, service, proxy, args);
        }
        ServiceMethod serviceMethod = loadServiceMethod(method);
        OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);
        return serviceMethod.callAdapter.adapt(okHttpCall);
      }
    });
  }

      // validate your all methods
  private void eagerlyValidateMethods(Class<?> service) {
    Platform platform = Platform.get();
    for (Method method : service.getDeclaredMethods()) {
      if (!platform.isDefaultMethod(method)) {
        loadServiceMethod(method);
       }
    }
   }

  //thie method will cash method in LinkedHashMap
  ServiceMethod loadServiceMethod(Method method) {
    ServiceMethod result;
    synchronized (serviceMethodCache) {
      result = serviceMethodCache.get(method);
      if (result == null) {
        result = new ServiceMethod.Builder(this, method).build();
        serviceMethodCache.put(method, result);
      }
    }
    return result;
  }