为啥 Android+Kotlin 中 newStartIntent 的伴随对象?

Posted

技术标签:

【中文标题】为啥 Android+Kotlin 中 newStartIntent 的伴随对象?【英文标题】:Why companion object for newStartIntent in Android+Kotlin?为什么 Android+Kotlin 中 newStartIntent 的伴随对象? 【发布时间】:2020-09-26 06:06:07 【问题描述】:

我在 Kotlin 中看到过很多示例,其中 Activity 类有一个伴随对象来封装启动 Intent 的创建,如下所示。它似乎特别受到 Java 的启发。

class HomeActivity : AppCompatActivity() 

    companion object 

        fun newStartIntent(context: Context): Intent 
            val intent = Intent(context, HomeActivity::class.java)
            return intent
        

    

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        this.setContentView(R.layout.activity_home)
        // ...
    

    // ...

既然 Kotlin 有***函数,为什么不跳过伴随对象而只拥有一个***函数呢?

fun newHomeActivityStartIntent(context: Context): Intent 
    val intent = Intent(context, HomeActivity::class.java)
    return intent


class HomeActivity : AppCompatActivity() 

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        this.setContentView(R.layout.activity_home)
        // ...
    

    // ...

【问题讨论】:

【参考方案1】:

实际上,您的方法没有任何问题。我想到了为什么我会选择伴随对象而不是***函数的几个原因:

    每个人都可以看到***功能,因此每次您开始输入 new... 时,您都会得到一个部分不相关结果的列表; Companion 对象可以保存您不希望向公众公开的私有值,并使它们仅在您的类中可见,但仍使它们保持静态。也许有一些参数是在这个函数调用下计算出来的,并且是有意传递的,你想隐藏这些计算或参数键; 这不是您的情况,但仍然相关:使用伴随对象,您可以将所有构造函数设为私有并控制传递给对象初始化的所有参数。这就是在 Kotlin 中创建 Singleton 的方式; 自以为是对我个人而言,它使事情看起来很整洁。我通常只提取简单且相对广泛使用的函数。例如日期转换函数或数学函数计算。

这是风格问题。只需选择一个并保持一致!

【讨论】:

以上是关于为啥 Android+Kotlin 中 newStartIntent 的伴随对象?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的失败吐司在android kotlin中不断出现

为啥 Kotlin 插件为 Android 项目添加 kotlin-stdlib-jre7(不是 kotlin-stdlib)参考

Android : Kotlin : MVVM : 为啥 viewModel.onButtonClicked() 会导致应用程序崩溃?

为啥我会收到错误消息:Android Gradle 插件仅支持 Kotlin Gradle 插件版本 1.3.10 及更高版本

为啥我在 Kotlin 中键入视图名称/ID 时会出现“未解析的引用”错误?

为啥 kotlin multiplatform 不执行和导出 iOS 框架?