3. Начнем издалека
public class NetworkClient {
}
private static final class NetworkClientHolder {
static NetworkClient INSTANCE = new NetworkClient();
}
public FutureTask<Response> execute(Request request) {
...
}
public NetworkClient() {
this.client = new OkHttpClient();
}
public static NetworkClient getInstance() {
return NetworkClientHolder.INSTANCE;
}
4. Продолжаем
public class MyFragment extends Fragment {
}
@Override
public void onResume() {
super.onResume();
updateFeed();
}
private void updateFeed() {
NetworkClient client = NetworkClient.getInstance();
FutureTask<Response> response =
client.execute(request);
...
}
6. 〉 Весь проект начинает зависеть именно от этих классов-синглтонов
〉 Проект становится монолитным
〉 И как следствие - его очень тяжело поддерживать
Проблемы
синглтонов:
8. Внедрение зависимости через
конструктор
public class NetworkClient {
}
public FutureTask<Response> execute(Request request) {
...
}
public NetworkClient(Client client) {
this.client = client;
}
9. Внедрение зависимости через
конструктор
public class MyFragment extends Fragment {
@Override public void onResume() {
super.onResume();
updateFeed();
}
}
private void updateFeed() {
NetworkClient client = NetworkClient.getInstance();
FutureTask<Response> response =
client.execute(request);
...
}
private void updateFeed() {
Client client = new OkHttpClient();
NetworkClient client = new NetworkClient(client);
FutureTask<Response> response =
client.execute(request);
...
}
22. В чем прикол?
〉Сгенерированный код как будто бы это было написано человеком
〉Обфускация через Proguard без единой настройки
〉Полное отсутствие рефлексии