在使用之前检查来自另一个 class 的伴生对象是否已初始化

Check if an companion object from another class is initialized before using it

我在基础应用程序 android class 中初始化我的改造客户端,在 MainActivity 中我用它来调用 api。 有时,api 调用在 Base class 可以初始化我的改装客户端之前开始,它会导致应用程序崩溃。 如果 api 接口客户端在进行其余 api 调用之前是否已初始化,我如何在进行 api 调用之前检查 MainActivity?

我知道我们可以这样做来检查 class 中 lateinit 变量的初始化。

::variable.isInitialized

但是在这种情况下它不起作用,因为我像这样访问静态对象 BaseApp.apiInterface 这是我的代码:

BaseApp.kt

 class BaseApp : Application() {   
        companion object {     
            lateinit var apiInterfaceLogin: ApiInterface
            lateinit var apiInterface: ApiInterface   
            lateinit var okHttpClient: OkHttpClient.Builder
        }
       
     override fun onCreate() {
            super.onCreate()
            fetchPrefs()
            initData()
        }
    
     private fun initData() {           
     val interceptor = Interceptor { chain ->
                    val newRequest = chain.request().newBuilder()
                        .addHeader("app-token", Constants.APP_TOKEN)
                        .addHeader("Cache-Control", "no-cache")
                        .build()
                    chain.proceed(newRequest)
                }
                okHttpClient = OkHttpClient.Builder()
                okHttpClient.interceptors().add(interceptor)
                val client = okHttpClient.build()
    
                val retrofit: Retrofit = Retrofit.Builder()
                    .baseUrl(ApiInterface.BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .client(client)
                    .build()
                apiInterface = retrofit.create(ApiInterface::class.java)
        }  
    }

MainActivity.kt

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    companion object {
        
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        checkShifts()  
    }

    private fun checkShifts() {
        val checkShiftsApiCall = BaseApp.apiInterface.startRun(BaseApp.userId)
        checkShiftsApiCall.enqueue(object : Callback<MyAvailableShiftsResponse> {
            override fun onResponse(call: Call<MyAvailableShiftsResponse>, response: Response<MyAvailableShiftsResponse>) {
               
            }

            override fun onFailure(call: Call<MyAvailableShiftsResponse>, t: Throwable) {
                }
            }
        })
    }
}

您可以在 BaseApp 同伴中使用额外的 属性 公开它:

val isApiInterfaceInitialized get() = ::apiInterface.isInitialized

附带说明一下,您可以访问伴随对象的属性,但需要显式引用它们,例如:

BaseApp.Companion::apiInterface

仍然不允许从对象外部访问 isInitialized,因为这被认为是 apiInterfacelateinit 的实现细节。

此外,lateinit 的主要用例是我们确定在首次使用前对其进行了初始化。如果你需要在使用前always/often检查它或者你在对象之外使用它,那么常规的可空属性可能是更好的选择。