有没有办法重用构建器代码进行改造

时间:2013-12-14 02:57:02

标签: java android retrofit

我正在使用Retrofit,在每项任务中我都要做这样的事情:

public class MyTask extends AsyncTask<String, String, String> {

    private void someMethod() {
        final RestAdapter restAdapter = new RestAdapter.Builder()
            .setServer("http://10.0.2.2:8080")
            .build();
        final MyTaskService apiManager = restAdapter.create(MyTaskService.class);
    }

    // ...

}

将此代码设为DRY的好方法是什么?

3 个答案:

答案 0 :(得分:44)

正如Jake所说,你应该使用singleton pattern以确保始终使用相同的实例。

以下是一个例子:

public class ApiManager {

    public interface GitHubService {

        @GET("/users/{user}/repos")
        List<Repo> listRepos(@Path("user") String user);

    }

    private static final String API_URL = "https://api.github.com";

    private static final RestAdapter REST_ADAPTER = new RestAdapter.Builder()
        .setEndpoint(API_URL)
        .setLogLevel(LogLevel.FULL)
        .build();

    private static final GitHubService GIT_HUB_SERVICE = REST_ADAPTER.create(GitHubService.class);

    public static GitHubService getService() {
        return GIT_HUB_SERVICE;
    }
}

您可以像这样使用此示例中的服务:

ApiManager.getService().listRepos(...);

答案 1 :(得分:43)

RestAdapter和生成的服务实例(在本例中为MyTaskService)都是极其昂贵的对象,应该用作单例。

这意味着您只需拨打restAdapter.create一次,并在每次需要互动时重复使用MyTaskService的同一个实例。

我不能强调这一点。

您可以使用常规单例模式,以确保在任何地方只使用这些对象的单个实例。依赖注入框架也可用于管理这些实例,但如果您尚未使用它,则会有点过分。

答案 2 :(得分:5)

首先使用所有常见行为声明您的父类

public abstract class MyAbstractTask extends AsyncTask<String, String, String> {

 protected void someMethod() { //note that i change private to protected
  final RestAdapter restAdapter = new RestAdapter.Builder().setServer("http://10.0.2.2:8080").build();
  final MyTaskService apiManager = restAdapter.create(MyTaskService.class);
 }

}

然后,你用每个任务扩展它

public   class MyTask extends MyAbstractTask {

 //your someMethod() is available from everywhere in your class

}

public  class MyOtherTask extends MyAbstractTask {

 //your someMethod() is available from everywhere in your class

}

但我不知道你在哪里使用restAdapter和apiManager,如果实际上每个任务需要创建一次,因为你可能可以在这些任务之外创建它。

如果你在外面创建它们,然后你需要在你的任务中使用某些东西,那么记住Dependency_injection模式也是很好的。


此外,您应该避免在类中使用硬编码值,例如http://10.0.2.2:8080

您应该至少使用final static final String server= "http://10.0.2.2:8080"然后使用它,或者更好地使用最内层类中的setter或构造函数,并从activity或主控制器设置tha值。