Я пытаюсь найти лучший ОО способ сделать это, и я был бы признателен за вашу помощь в этом.
Я думаю, что самый простой способ - показать вам, как я это сделал, и попытаться объяснить, чего я хочу после (я упростил это):
abstract public class MyServiceApi {
private static MyServiceApi instance = null;
public static <T extends MyServiceApi> T getInstance(Class<T> cls) {
if (instance == null) {
try {
instance = cls.newInstance();
}
catch (InstantiationException e) {}
catch (IllegalAccessException e) {}
}
return (T) instance;
}
private private HashMap<String, String> headers;
protected MyServiceApi() {}
public HashMap<String, String> getHeaders() {
return headers;
}
public void setHeaders(HashMap<String, String> headers) {
this.headers = headers;
}
protected <T extends IMyServiceApiResponse> T send(String url, IMyServiceApiRequest request, Class<T> to) {
// Do some stuffs
// IMPORTANT : Also set headers to the request
}
protected String getBaseUrl() {
return "http://api.mywebsite.com/";
}
}
public class UsersApi extends MyServiceApi {
public static UsersApi getInstance() {
return getInstance(UsersApi.class);
}
protected UsersApi() {
super();
}
@Override
protected String getBaseUrl() {
return super().getBaseUrl() + "Users/";
}
// mutliple function that calls a specific URL in the API, and return specifics object based on the call, for example :
public MyServiceApiUsersResponse getUsers(MyServiceApiUsersRequest request) {
return send(getBaseUrl() + "get", request, MyServiceApiUsersResponse.class);
}
}
public class ItemsApi extends MyServiceApi {
public static ItemsApi getInstance() {
return getInstance(ItemsApi.class);
}
protected ItemsApi() {
super();
}
@Override
protected String getBaseUrl() {
return super().getBaseUrl() + "Items/";
}
// mutliple function that calls a speicfic URL in the API, and return specifics object based on the call, for example :
public MyServiceApiItemsResponse getUsers(MyServiceApiItemsRequest request) {
return send(getBaseUrl() + "get", request, MyServiceApiItemsResponse.class);
}
}
Теперь, когда у вас есть идея, я застрял на чем-то.
Прежде всего, я не знаю, правильно ли то, что я сделал (в стиле Java OO). Я думаю, что это не плохо, но мне не хватает опыта, чтобы быть уверенным.
Во-вторых, когда мой проект будет запущен, MyServiceApi
сохранит те же заголовки, я не буду вызывать другой API или другие учетные данные. Вот почему я подумал об Singleton: я установил заголовки при запуске приложения, а затем мне просто нужно сделать запрос.
Но я считаю, что UsersApi
и ItemsApi
расширение MyServiceApi
- лучший способ сделать это. Они используют MyServiceApi
, они не расширяют его возможности.
Кроме того, я слышал, что SingleTon - это анти-паттерн, плохо подходит для тестов и т. Д.
Так что теперь я свободен и не знаю, что делать. Как бы вы это сделали?
Возможная идея состоит в том, чтобы удалить реферат MyServiceApi
и установить для него Singleton, имея UsersApi
и ItemsApi
для использования MyServiceApi
, но не путем его расширения, но как мне тогда управлять getBaseUrl?
Большое спасибо за вашу помощь, я очень ценю!