Kotlin数据类可选变量

Exp*_* be 16 kotlin

data class Student(
    val id: Int?,
    val firstName: String?,
    val lastName: String?,
    val hobbyId: Int?,
    val address1: String?,
    val address2: String?,
    val created: String?,
    val updated: String?,
    ...
)
Run Code Online (Sandbox Code Playgroud)

我喜欢上面的数据类,我想创建一个只有名字和姓氏的Student实例.所以,如果我运行这个,

// creating a student 
Student(
    firstName = "Mark"
    lastName = "S"
)
Run Code Online (Sandbox Code Playgroud)

我将获得没有传递参数'id'...错误的值.

为了避免这种情况,我修改了这样的Student类,

data class Student(
    val id: Int? = null,
    val firstName: String? = null,
    val lastName: String? = null,
    val hobbyId: Int? = null,
    val address1: String? = null,
    val address2: String? = null,
    val created: String? = null,
    val updated: String? = null,
    ...
)
Run Code Online (Sandbox Code Playgroud)

但它看起来很难看.

有没有更好的方法?

New*_*bie 24

您可以在主构造函数中设置默认值,如下所示.

data class Student(val id: Int = Int.MIN_VALUE,
               val firstName: String,
               val lastName: String,
               val hobbyId: Int = Int.MIN_VALUE,
               val address1: String = "",
               val address2: String = "",
               val created: String = "",
               val updated: String = "")
Run Code Online (Sandbox Code Playgroud)

然后,您可以在创建新学生实例时使用命名参数,如下所示.

Student(firstName = "Mark", lastName = "S")
Run Code Online (Sandbox Code Playgroud)


Har*_*edi 14

我不确定我给你的解决方案是否是最好的.但绝对整洁.

我唯一不喜欢使用null作为默认参数,因为Kotlin提供Null Safety,不要因为满足其他要求而删除它.仅当它们可以为null时才将它们标记为null.其他旧的Java方式很好.使用一些默认值初始化它们.

data class Student(val id: Int,
                   val firstName: String,
                   val lastName: String,
                   val hobbyId: Int,
                   val address1: String,
                   val address2: String,
                   val created: String,
                   val updated: String) {
    constructor(firstName: String, lastName: String) :
            this(Int.MIN_VALUE, firstName, lastName, Int.MIN_VALUE, "", "", "", "")
}
Run Code Online (Sandbox Code Playgroud)

  • 我不认为null安全意味着不使用null。我认为最好将null安全视为在您不期望的地方没有得到nullpointerexception。通过添加问号,我们通知该类的每个用户都希望有一个空值,并添加处理该空值的措施。我个人认为空值比空字符串更适合未提供的地址。 (3认同)