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

Ted*_*nry 3 android android-intent kotlin

我在 Kotlin 中看到了很多例子,其中活动类有一个伴随对象来封装启动意图的创建,如下所示。似乎特别受 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)
        // ...
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

既然 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)
        // ...
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

Jen*_*anu 6

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

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

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