1. 概述

在本教程中,我们将展示如何创建包含可选字段的类实例。首先,我们会介绍如何通过主构造函数设置默认值为 null 来实现。此外,我们还会介绍如何通过次构造函数设置默认值。

2. 使用 Null 初始化字段

在 Kotlin 中,数据类 主要用于封装数据。默认情况下,它会暴露一个主构造函数,该构造函数要求所有字段都必须提供值。例如:

class DataClassWithMandatoryFields(
    val name: String,
    val surname: String,
    val age: Number
)

创建实例时需要提供所有字段:

val objectWithAllValuesProvided = DataClassWithMandatoryFields("John", "Deere", 82)

默认情况下,数据类的主构造函数中所有字段都是必须的。 如果不提供任意字段的值,编译器会报错:No value passed for parameter '<parameter name>'

我们可以通过将字段类型设为可空类型(T?)并设置默认值为 null,实现可选字段:

class DataClassWithNullInitializedFields(
    val name: String? = null,
    val surname: String? = null,
    val age: Number? = null
)

现在可以创建不带参数的实例,或者只提供部分字段:

val objectWithNullInitializedFields = DataClassWithNullInitializedFields()
val objectWithNameInitializedFields = DataClassWithNullInitializedFields(name = "John")

但需要注意的是,这种做法要求我们在访问字段属性前必须进行非空判断:

assertThat(objectWithNameInitializedFields.name?.length).isEqualTo(4)

✅ 优点:字段可选
❌ 缺点:需要频繁使用安全调用(?.)处理可空类型

3. 在主构造函数中设置默认值

为了避免使用可空类型,我们可以为每个字段设置默认值,例如空字符串或默认数值:

class DataClassWithDefaultValues(
    val name: String = "",
    val surname: String = "",
    val age: Number = Int.MIN_VALUE
)

这样,我们就不需要再处理空值了:

val dataClassWithDefaultValues = DataClassWithDefaultValues()
val dataClassWithNameProvided = DataClassWithDefaultValues(name = "John")

访问字段时也不需要使用安全调用:

assertThat(dataClassWithNameProvided.name.length).isEqualTo(4)

✅ 优点:无需处理 null
❌ 缺点:默认值可能与业务逻辑冲突(比如 Int.MIN_VALUE

4. 使用次构造函数设置默认值

除了在主构造函数中设置默认值,我们还可以通过次构造函数实现更灵活的初始化方式:

class DataClassWithSecondaryConstructors(
    val name: String,
    val surname: String,
    val age: Number
) {
    constructor() : this("", "Doe", Int.MIN_VALUE)
    constructor(name: String) : this(name, "Deere", Int.MIN_VALUE)
    constructor(name: String, surname: String) : this(name, surname, Int.MIN_VALUE)
}

创建实例方式如下:

val dataClassWithSecondaryConstructors = DataClassWithSecondaryConstructors()
val objectWithNameSet = DataClassWithSecondaryConstructors(name = "John")

不同构造函数可以设置不同的默认值。例如,无参数构造函数默认 surname"Doe",而只传 name 时默认为 "Deere"

assertThat(objectWithNameSet.surname).isEqualTo("Deere")

✅ 优点:灵活设置默认值
❌ 缺点:构造函数数量可能爆炸,维护成本高

5. 总结

本教程中我们介绍了几种在 Kotlin 数据类中实现可选字段的方式:

  • 主构造函数中使用可空类型并设置默认值为 null
  • 主构造函数中使用非空类型并设置默认值
  • 使用多个次构造函数设置不同默认值

每种方式都有其适用场景,选择哪种方式取决于具体业务需求和代码可维护性。通常建议优先使用主构造函数加默认值的方式,简洁明了。

完整代码示例请参考:GitHub 仓库


原始标题:Kotlin Data Class With Optional Fields

« 上一篇: Kotlin Flow 类介绍
» 下一篇: Kotlin 中的对象比较