当前位置: 首页 > 知识库问答 >
问题:

在Kotlin改造singleton

宗政卓
2023-03-14

我正在努力把这个改型班翻译成科特林。它基本上是一个作为客户机工作的单例,我不确定我的Kotlin实现。UserAPI和ProfileAPI只是接口。

public class RetrofitService {

private static final String BASE_URL = "https://test.api.com/";
private ProfileAPI profileAPI;
private UserAPI userAPI;
private static RetrofitService INSTANCE;

/**
 * Method that returns the instance
 * @return
 */
public static RetrofitService getInstance() {
    if (INSTANCE == null) {
        INSTANCE = new RetrofitService();
    }
    return INSTANCE;
}

private RetrofitService() {
    Retrofit mRetrofit = new Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .baseUrl(BASE_URL)
            .build();
    profileAPI = mRetrofit.create(ProfileAPI.class);
    UserAPI = mRetrofit.create(UserAPI.class);
}

/**
 * Method that returns the API
 * @return
 */
public ProfileAPI getProfileApi() {
    return profileAPI;
}

/**
 * Method that returns the API
 * @return
 */
public UserAPI getUserApi() {
    return userAPI;
}

}

这是我的Kotlin实现。正如我所理解的,当类实例化时,init块将首先执行。

class RetrofitService private constructor() {
/**
 * Method that returns the API
 * @return
 */
private val profileApi: ProfileAPI
private val userAPI: UserAPI

companion object {
    private const val BASE_URL = "https://test.api.com/"
    private var INSTANCE: RetrofitService? = null

    /**
     * Method that returns the instance
     * @return
     */
    fun getInstance(): RetrofitService? {
        if (INSTANCE == null) {
            INSTANCE = RetrofitService()
        }
        return INSTANCE
    }
}

init {
    val mRetrofit = Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .baseUrl(BASE_URL)
            .build()
    profileApi = mRetrofit.create(ProfileAPI::class.java)
    UserAPI = mRetrofit.create(UserAPI::class.java)
}
}

但有些事情告诉我,这不是正确的方法,或者可以做得更好。这里有什么我可以改进的吗?

更新!!!

object RetrofitService {
private const val BASE_URL = "https://test.api.com"

private fun retrofitService(): Retrofit {
    return Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .baseUrl(BASE_URL)
            .build()
}

val profileApi: ProfileAPI by lazy {
    retrofitService().create(ProfileAPI::class.java)
}

val userApi: UserAPI by lazy {
    retrofitService().create(UserAPI::class.java)
}
}
RetrofitService.profileApi

可以吗?

共有1个答案

何兴安
2023-03-14

您可以使用以下内容:

object MyApi {

    private const val BASE_URL = " https://www.MYAPI.com/"

    private val moshi = Moshi.Builder()
        .add(KotlinJsonAdapterFactory())
        .build()

    private fun retrofit(): Retrofit {
        return Retrofit.Builder()
            .addConverterFactory(MoshiConverterFactory.create(moshi))
            .addCallAdapterFactory(CoroutineCallAdapterFactory())
            .client(clientBuilder.build())
            .baseUrl(BASE_URL)
            .build()
    }

    val retrofitService: MyApiService by lazy {
        retrofit().create(MyApiService::class.java)
    }

    //If you want more service just add more val such as
    val otherService: MyOtherService by lazy {
        retrofit().create(MyOtherService::class.java
    }

}

//To use it you just need to do:
MyApi.retrofitService
MyApi.otherService

  • Object ClassName是一个单独的实例,它只实例一次,下次调用时重用
  • by lazy使用此关键字,您的RetrofitService将只在第一次调用时初始化,然后重用相同的值,有关详细信息,请参阅此处
 类似资料:
  • 如何使用RxJava和Kotlin中的改型创建api调用的泛型类? 我的JAVA实现是:: 首先添加Gradle依赖项:(更新到最新版本(如果可用)) //用于改装 实现“com.squareup.reverfit2:reverfit:2.3.0” 实现“com.squareup.reverfit2:converter-gson:2.3.0” //对于拦截器实现“com.squareup.okht

  • 我有来自一个API的数据,看起来如下所示 使用reverfit,我尝试使用下面的代码将它转换为一个对象。为了测试,它目前被提供了一个静态变量,如邮政编码,这是已知的工作。 服务类。 地址类 位置类 地址接口 在使用调试器时,我看到调用跳过onFailure和onResponse函数,只返回仍然为空的addresses。我甚至在这两个函数中都放入了print语句,但终端中都没有显示这两个函数,以确认

  • 我正在尝试使用SimpleXML将改装xml响应序列化到一个对象中。 但是出现以下例外情况: org.simpleframework.xml.core.值必需异常:无法满足@org.simpleframework.xml.ElementList(data=false,空=true,入口=,内联=true,名称=ALLFile,必需=true,类型=无效)字段'file" 响应示例: 对象: 我收到

  • 目前,我在改装方面面临一些问题。对于第二个请求,我提供给ReformInstance的URL正在更改。以下是代码: 以下是针对不同API请求的接口方法: UrlEndPoints.kt 对于第一个请求(loginUserByFacebook),我通过调试响应获得的URL是: http://test.sample.com/req/v1/user/auth/facebook 这很好,工作也很好。但是对

  • 我正在学习Android,我一直致力于让所有这些组件协同工作。我说的是ViewModel、LiveData、Room、改装和协同程序。 因此,我想实现以下目标: 当应用程序启动时,我想检查用户是否登录。如果没有登录,我什么也不做,如果他登录了,我将他的名字记录在主活动中。用户可以通过另一个api调用进行身份验证。然后,当用户被更新时,主活动应该向用户反映更改。我在这里部分遵循了谷歌代码实验室htt

  • 我想和Gradle建立一个建立Kotlin代码的项目。我已经按照这里的说明如何设置build.gradle文件,但收到一个错误 这样我就得到了错误: null null Gradle核心插件(插件不在'org.Gradle'命名空间中)-插件存储库(无法解析插件工件>'org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.Gradle.plugin:1