将改造服务声明划分为多个接口

2022-09-03 02:19:41

我正在创建一个链接到API的应用程序,其中包含大约265种方法。我非常想将这些API的声明分解为多个文件,以保持它们的组织和可访问性。但是,改造明确禁止通过扩展组合接口。

java.lang.IllegalArgumentException: Interface definitions must not extend other interfaces.

我一直试图宣布如下。

public interface ApiService extends ProfileService, AccountService {
    // Empty interface, methods divided into other services
}

public interface ProfileService {
    @GET("/api/v1/protected/profile")
    public void getProfile(Callback<Profile> callback);

    ...
}

public interface AccountService {
    @GET("/api/v1/protected/account")
    public void getAccount(Callback<Account> callback);


    ...
}

在拉取请求上有关于此问题的讨论。库的作者已经决定,像这样的扩展接口不符合库的精神。https://github.com/square/retrofit/pull/676

Jake Wharton(作者)说:“改造有利于构图。在回应“你真的有一个带有大量代理的适配器吗?”,“是的。它们由 protos 中的服务声明生成。每个服务一个接口。

我一直在阅读关于构图与继承的文章,却没有掌握如何实现分解宣言的目标。

如何将接口声明划分?是否有我缺少的最佳实践?

谢谢。


答案 1

只需创建单独的接口即可。

public interface ProfileService {

  /* ... */
}

public interface AccountService {

  /* ... */
}

ProfileService profileService = mRestAdapter.create(ProfileService.class);
AccountService accountService = mRestAdapter.create(AccountService.class);

答案 2

我仍在尝试这是否是使用它的最佳方式,但这是我到目前为止所拥有的。它可能不是最干净的方法,但我喜欢它,而不是一个具有100个api调用的服务。将其拆分一点,使其更易于阅读。

这是访问数据的主类。我已经看到很多将我拥有的两个静态方法分离到一个单独的类中,但我只是将其作为一个类包含在一起。

public class RetrofitApi {
   public enum ApiTypes {
        USER_API(UserApi.class);

        private final Class<? extends RetrofitApi> apiClass;
        ApiTypes(Class<? extends RetrofitApi> apiClass){
            this.apiClass = apiClass;
        }
        Class<? extends RetrofitApi> getApiType() {return this.apiClass;}
    }
    public static  <T> T getApi(RetrofitApi.ApiTypes type) {
        try {
            return (T) type.getApiType().newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static RestAdapter getRestAdapter() {
        RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint(BASE_URL)
            .setLogLevel(retrofit.RestAdapter.LogLevel.HEADERS)
            .build();
        return restAdapter;
    }
}

每个服务都有自己的 API。这确实意味着更多的类。我将它们分为API,服务,模型。API 是您将使用和公开的高级 API。服务或多或少只是一个调用列表。模型是模型(数据对象)。

public class UserApi extends RetrofitApi {

    private UserService service;

    public UserApi() {
        RestAdapter restAdapter =
                RetrofitApi.getRestAdapter();
        service = restAdapter.create(UserService.class);
    }

    public void login(String email,
                      String password,
                      Callback<User> callback) {
        service.login(email, password, callback);
    }
}

服务是接口。它或多或少只是一个公开的api调用列表。

public interface UserService {

    @GET("/api/users/login")
    void login(@Query("email") String email,
                   @Query("password") String password,
                   Callback<User> callback);
}

然后使用它。

 UserApi api = RetrofitApi.getApi(RetrofitApi.ApiTypes.USER_API);
 api.login(email,password,callback);

这是项目结构。对我来说,它目前似乎很干净。我敢肯定,当我有20多个时,它最终会变大。但是,当这20个电话有多个呼叫时,它可能会更干净一些。enter image description here


推荐