gpt4 book ai didi

Kotlin,减少重复代码

转载 作者:行者123 更新时间:2023-12-02 13:06:39 28 4
gpt4 key购买 nike

我的每个 API 服务接口(interface)类都有创建静态方法,

interface AuthApiService {
@FormUrlEncoded
@POST("api/auth/login")
fun postLogin(@Field("username") username: String, @Field("password") password: String):
io.reactivex.Observable<LoginApiResponse>

companion object Factory {
fun create(): AuthApiService {
val gson = GsonBuilder().setLenient().create()

val retrofit = Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.baseUrl("http:192.168.24.188:8080")
.build()
return retrofit.create(AuthApiService::class.java)
}
}
}


interface BBBApiService {
companion object Factory {
fun create(): BBBApiService {
val gson = GsonBuilder().setLenient().create()

val retrofit = Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.baseUrl("http:192.168.24.188:8080")
.build()
return retrofit.create(BBBApiService::class.java)
}
}
}

但是,我只想定义一次 create() 方法。

所以我做了 ApiFactory 类,
interface ApiFactory {
companion object {
inline fun <reified T>createRetrofit(): T {
val gson = GsonBuilder().setLenient().create()

val retrofit = Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.baseUrl("http://192.168.24.188:8080")
.build()

return retrofit.create(T::class.java)
}


}
}

interface AuthApiService {
@FormUrlEncoded
@POST("api/auth/login")
fun postLogin(@Field("username") username: String, @Field("password") password: String):
io.reactivex.Observable<LoginApiResponse>

companion object Factory {
fun create(): AuthApiService {
return ApiFactory.createRetrofit()
}
}

但是,我仍然需要在 AuthApiService 中定义 create() 方法。

有没有办法将 ApiFactory 类实现到 SubApi 类,这样我就不必在每个子类中定义 create 方法?

最佳答案

一个简单的解决方案就是调用你的 ApiFactory 的函数。直接地:

val authApiService = ApiFactory.createRetrofit<AuthApiService>()

但是如果你想能够调用 AuthApiService.create() ,然后你可以定义一个标记接口(interface),比如说, ApiFactoryClient<T> , 并标记一个空的 companion object用它。
interface ApiFactoryClient<T>

interface AuthApiService {
/* ... */

companion object : ApiFactoryClient<AuthApiService>
}

然后制作一个与 ApiFactoryClient<T> 一起使用的扩展函数:
inline fun <reified T> ApiFactoryClient<T>.create(): T = ApiFactory.createRetrofit<T>()

用法是:
val authApiService = AuthApiService.create()

关于Kotlin,减少重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44650946/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com