Я пытаюсь перевести клиентский код Java Retrofit Api на Kotlin.Итак, вот что мы имеем в Java:
Модифицированный клиент, который возвращает модифицированный одноэлементный объект:
public class RetrofitClient {
private static Retrofit retrofit = null;
public static Retrofit getClient(String baseUrl) {
if (retrofit==null) {
retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
И Api-клиент, который использует вышеупомянутый модернизированный объект:
public class ApiUtils {
public static final String BASE_URL = "https://api.stackexchange.com/2.2/";
public static SOService getSOService() {
return RetrofitClient.getClient(BASE_URL).create(SOService.class);
}
}
Проблема в том, что в каждом примере, который я видел до сих пор в Интернете, используется объект-компаньон (каждый член внутри него является статическим), почему тогда наш шаблон синглтона исчезает?Почему бы не использовать объект вместо объекта-компаньона и как это сделать?Посмотрите пример с сопутствующим объектом в Kotlin:
interface WikiApiService {
@GET("api.php")
fun hitCountCheck(@Query("action") action: String): Observable<Model.Result>
companion object {
fun create(): WikiApiService {
val retrofit = Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("https://en.wikipedia.org/w/")
.build()
return retrofit.create(WikiApiService::class.java)
}
}
Не говоря уже о том, что это делается в том же классе, использование объекта-компаньона приведет к возврату нового объекта как дооснащения, так и WikiApiService.Я не могу быть согласен с этим.Пожалуйста, сделайте любые пояснения по поводу этих примеров.Может быть, я ничего не понимаю, поэтому мне это кажется неправильным, и, пожалуйста, прости, что я привел разные примеры для Java и Kotlin.