[英]How to translate Retrofit client from Kotlin to Java preserving singleton?
我正在尝试将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编写了不同的示例。
不要尝试每次都返回WikiApiService。
你可以创建一个类
class RetData {
private lateinit var retrofit: Retrofit
var wikiApiService: WikiApiService
init {
if (!::retrofit.isInitialized) {
retrofit = Retrofit.Builder()
.baseUrl("https://api.stackexchange.com/2.2/")
.addConverterFactory(GsonConverterFactory.create())
.build()
}
wikiApiService = retrofit.create(WikiApiService::class.java)
}
}
和访问
fun test() {
val retrofit = RetData()
val apiService = retrofit.wikiApiService
println(apiService)
val apiService2 = retrofit.wikiApiService
println(apiService2)
val apiService3 = retrofit.wikiApiService
println(apiService3)
val apiService4 = retrofit.wikiApiService
println(apiService4)
}
最好使用像dagger 2这样的依赖注入库
如果要在Kotlin中创建单例,只需...使用对象,而不是类。
object Retrofit {
val instance = ...
}
见# https://kotlinlang.org/docs/reference/object-declarations.html用于科特林对象图案的多个示例。
但这仍然是不好的做法。 使用DI框架要好得多,例如Kodein或Dagger2。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.