android - 在 kotlin android 中使用 Companion 对象是一个好习惯吗?

标签 android kotlin

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

/*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 中的静态实例,所以我的问题是: 此代码遵循面向对象编程吗?推荐使用此方法吗?如果答案是否定的,那么哪个是此代码在面向对象中的最佳实现

最佳答案

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

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

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

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

因此,对于给定的代码 fragment ,它是 companion object 的有效使用。

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

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

关于android - 在 kotlin android 中使用 Companion 对象是一个好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59331118/

相关文章:

java - 同步请求失败 HTTP

android - 在 Horizo​​ntal RecyclerView 上相对于中心设置 Item Alpha

android - 获取 imageview 重复 : looks like titlebar

java - 我应该从正在使用的主要 Activity 中访问 fragment 中的内容吗?

kotlin - 如何在通知之前暂停Kotlin协程

android - 包在设置中的 uid : 10124 on disk, 10134 不匹配

android - 为什么在 Kotlin 中将内部对象传递给 Gson().toJson(object) 时 json 字符串为 null?

java - IntelliJ IDEA Ultimate 2018.3 认为我的 Java 9 项目是 Kotlin 项目

Android:使用 espresso 测试时如何失去对 editText 的关注

android - 如何在 Kotlin 的 fragment 内使用按钮在 fragment 之间切换?