【问题标题】: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)
        // ...
    }

    // ...
}

【问题讨论】:

    标签: android kotlin android-intent


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      相关资源
      最近更新 更多