在Kotlin类中声明值的最佳方法:在Constructor,body或init {}中

问题描述

我想知道在Kotlin中声明一个类的值的最佳方法是什么(不一定在性能方面,在标准方面)。 让我用代码解释一下,这是我看到的三种可能性:

private class Player(val editText: EditText,val state: Int,val name: String = editText.text.toString().trim()) {
    init{
        //we do some code here that read the String 'name'
    }
    //some other methods
}

private class Player(val editText: EditText,val state: Int) {
    val name: String = editText.text.toString().trim()
    init{
        //we do some code here that read the String 'name'
    }
    //some other methods
}

private class Player(val editText: EditText,val state: Int) {
    init{
        val name: String = editText.text.toString().trim()
        //we do some code here that read the String 'name'
    }
    //some other methods
}

我绝对想通过调用他们的getter访问玩家的名字(例如player1.name)。哪一个比另一个更好,为什么? (性能和标准)

解决方法

第一个选项与其他两个选项之间有明显的区别。

选项1-构造函数初始化:

除了自动设置“名称”属性外,此选项还允许对象的创建者通过以下方式设置名称:

val myPlayer = Player(EditText(),"Bob")

其他选项不允许呼叫者设置名称。

选项2 选项3 在功能上几乎相同。不应有任何明显的性能差异。最大的区别是选项2中的代码将在init块之前运行。

就标准而言:

  • 如果您希望呼叫者能够设置姓名,请选择选项1
  • 如果要强制使用设置的“ editText”对象,则选择选项2

没有严格的标准,所以如果选项3对您和将要阅读代码的其他人看起来更好,请继续进行选择。就个人而言,仅当初始化所需的代码比基本的单行代码复杂时,我才会初始化init块中的字段。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...