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
相关产品推荐
相关产品推荐

