You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin如何初始化data class内各含30个Foo实例的三个数组成员

实现方法

Kotlin 提供了专门的数组构造函数,可以直接指定数组长度和每个元素的初始化逻辑,直接给构造参数加默认值即可实现你要的效果。

如果你的 Foo 默认初始状态是固定值(比如 a=0, b=0),代码可以直接改成:

data class Container (
    val first: Array<Foo> = Array(30) { Foo(0, 0) },
    val second: Array<Foo> = Array(30) { Foo(0, 0) },
    val third: Array<Foo> = Array(30) { Foo(0, 0) },
)

data class Foo (val a: Int, val b: Int)

说明

  • Array(30) { 初始化逻辑 } 会生成一个长度为30的数组,大括号内的初始化逻辑会执行30次,每次生成独立的 Foo 实例,不存在多个数组元素共享同一个对象引用的问题。
  • 如果你需要每个位置的 Foo 初始值和索引挂钩,可以直接用 lambda 内置的索引参数(默认名为 it),比如要让 a 的值从0到29随索引递增,就写成 Array(30) { Foo(it, 0) }。

额外注意

Array 类型在 data class 中默认的 equals、hashCode 是按引用判断的,不会比较数组内容,如果你需要按内容判断两个 Container 是否相等,有两个可选方案:

  • 手动重写 Container 的 equals 和 hashCode 方法
  • 用 List<Foo> 代替 Array<Foo>,List 的默认 equals 是按内容比较的,写法几乎一致:
data class Container (
    val first: List<Foo> = List(30) { Foo(0, 0) },
    val second: List<Foo> = List(30) { Foo(0, 0) },
    val third: List<Foo> = List(30) { Foo(0, 0) },
)

这种写法也是 Kotlin 日常开发中更推荐的写法。

内容的提问来源于stack exchange,提问作者AndreKR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:24:29