【问题标题】:Kotlin data class optional variableKotlin 数据类可选变量
【发布时间】:2018-04-18 10:48:32
【问题描述】:
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?,
    ...
)

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

// creating a student 
Student(
    firstName = "Mark"
    lastName = "S"
)

我会得到 No value passed for parameter '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,
    ...
)

但它看起来很丑。

有没有更好的办法?

【问题讨论】:

  • 我认为这几乎是唯一的方法。您可以使 firstNamelastName 不可为空,但这不会真正改变类定义。

标签: kotlin


【解决方案1】:

你可以设置default values in your primary constructor如下图。

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 = "")

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

Student(firstName = "Mark", lastName = "S")

【讨论】:

    【解决方案2】:

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

    我唯一不喜欢使用空值作为默认参数,因为 Kotlin 提供空值安全,我们不要仅仅因为满足一些其他要求而将其删除。仅当它们可以为空时才将它们标记为空。其他旧的 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, "", "", "", "")
    }
    

    【讨论】:

    • 我不认为空值安全意味着不使用空值。我认为最好将空安全性视为在您不期望的地方没有出现空指针异常。通过添加一个问号,我们通知该类的每个用户期望一个空值并添加处理它的措施。我个人认为 null 更适合未提供的地址而不是空字符串。
    【解决方案3】:
    data class InLog(
    var clock_in_lat: String?="None",
    var clock_in_lng: String?="None",
    var clock_out_lat: String?="None",
    val clock_out_lng: String?="None",
    val created_at: String?="None",
    val duration: String?="None",
    val end_time: String?="None",
    val id: Int?=Int.MIN_VALUE,
    var late_duration: String? = "None",
    val start_time: String?="None",
    val type: String?="None",
    val updated_at: String?="None",
    val user_id: Int?=Int.MIN_VALUE) 
    

    在 Kotlin 中,我们确实喜欢这样的记忆吗?标记符号使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多