【问题标题】:Use Companion object in kotlin android is a good practice?在 kotlin android 中使用 Companion 对象是一个好习惯吗?
【发布时间】:2019-12-13 23:47:23
【问题描述】:

我曾经使用 Java 在 android 中编程,但几周前我开始学习 kotlin,当我使用 Java 时,我尝试使用面向对象的方法并使用不太可能的静态对象或实例,所以当我看到一些互联网上关于在 kotlin 中使用 Web 服务的一些实现的材料我看到了这样的内容:

/*call of method from activity*/
val message = WebServiceTask.getWebservice(getString(R.string.url_service))

/*Class to do the call to webservice*/
class WebServiceTask {
    companion object {
        fun getWebService(url: String): WebServiceResponse {
            val call =
                RetrofitInstance.getRetrofit(url).create(ApiService::class.java).getList()
                    .execute()
            val webServiceResponse = call.body() as WebServiceResponse
            return user
        }
    }
}
/*Class to get Retrofit instance*/
class RetrofitInstance {
    companion object{
        fun getRetrofit(url: String): Retrofit {
            return Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
        }

    }
} 

如你所见,我在两个类中使用伴生对象,据我所知,伴生对象等同于 java 中的静态实例,所以我的问题是: 这段代码遵循面向对象编程吗?推荐这种方法吗?如果答案是否定的,那么在面向对象中哪个是这段代码的最佳实现

【问题讨论】:

  • 如果你不使用伴生对象,也许应该研究像 kodein (github.com/Kodein-Framework/Kodein-DI) 或 dagger (github.com/google/dagger) 之类的依赖注入,通常它们不会对你产生太大影响,如果你确实使用它们,但最好不要
  • companion object 是您在 Kotlin 中定义 static 变量/方法的方式。但是,您不应该在每次执行请求时都创建 Retrofit / ApiService 的新实例。

标签: android kotlin


【解决方案1】:

是的,companion object 相当于 Kotlin 中的 static Java 成员。适用于static 的所有内容也适用于companion object

companion object 的使用取决于它如何与类对象的状态交互。

如果您正在使用一些完全是 Pure functions 的方法,或者您需要提供对类本身外部的访问权限的一些最终值,那么在这种情况下使用伴随对象是完全有意义的。

推荐用于上述情况,因为它不会干扰类对象的状态。

因此,对于给定的代码 sn-p,companion object 的使用是有效的。

注意companion object 中的方法不会与未作为参数传递给它们的东西进行交互。您看到的所有内容都是仅在方法内部创建/初始化或使用的,只是它得到的结果。

注意: 但是,如果您的companion object 成员(值或函数)干扰了对象的状态,则会导致泄漏,从而导致您遇到从未遇到过的麻烦。

【讨论】:

    【解决方案2】:

    是的,它相当于静态。不,不建议这样做,因为它会导致模拟测试出现问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 2016-01-03
      • 2013-08-03
      • 2016-01-31
      • 2011-03-06
      • 1970-01-01
      相关资源
      最近更新 更多