java - ventajas - ¿Hay una manera de reutilizar el código del constructor para la modificación
video sobre la importancia de reciclar (3)
Como dijo Jake, debes usar el patrón de singleton para asegurarte de que siempre se use la misma instancia.
Aquí hay un ejemplo:
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;
}
}
Puedes usar el servicio en este ejemplo así:
ApiManager.getService().listRepos(...);
Estoy usando Retrofit y en cada tarea tengo que hacer algo como esto:
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);
}
// ...
}
¿Cuál es una buena manera de hacer que este código sea SECO?
Primero declara su clase padre con todos los comportamientos comunes.
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);
}
}
Luego, lo amplías con cada tarea.
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
}
pero no sé dónde está utilizando restAdapter y apiManager, y si realmente necesita crearse una vez por tarea, ya que probablemente pueda crearlo fuera de estas tareas.
Si los crea fuera, y luego necesita usar algo dentro de su tarea, también es bueno tener en cuenta el patrón de Dependency_injection .
Además, debes evitar los valores de codificación en tus clases, como http://10.0.2.2:8080
Debe usar al menos un final static final String server= "http://10.0.2.2:8080"
y luego usar eso, o mejor, usar un definidor o el constructor en la clase más interna, y establecer los valores de la actividad o el controlador principal.
Tanto el RestAdapter
como la instancia generada de sus servicios ( MyTaskService
en este caso) son objetos extremadamente caros y deben usarse como singletons.
Esto significa que solo debe llamar a restAdapter.create
una vez y volver a usar la misma instancia de MyTaskService
cada vez que necesite interactuar.
No puedo enfatizar esto lo suficiente.
Puede usar el patrón de singleton regular para asegurarse de que solo haya una única instancia de estos objetos que use en todas partes. Un marco de inyección de dependencias también sería algo que podría usarse para administrar estas instancias, pero sería un poco excesivo si aún no lo está utilizando.