首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin (Bug?)变量在forEachIndexed中设置后立即更改

Kotlin (Bug?)变量在forEachIndexed中设置后立即更改
EN

Stack Overflow用户
提问于 2022-10-14 09:47:29
回答 1查看 33关注 0票数 1

在写测试时,我遇到了一种非常奇怪的行为。我可以将其分解为以下代码片段:

代码语言:javascript
复制
val random = EasyRandom()
val parametrization = random.nextObject(Parametrization::class.java)
parametrization.ecus.forEachIndexed { index, ecu ->
    ecu.orderNumber = index
    println("index: $index, orderNumber: ${ecu.orderNumber}")
}
println("And again")
parametrization.ecus.forEachIndexed { index, ecu ->
    println("index: $index, orderNumber: ${ecu.orderNumber}")
}

这个参数化变量是由简单随机(https://github.com/j-easy/easy-random)随机设置的,但是这不应该对这种情况产生任何影响。

然后,我将每个列表条目的orderNumber字段设置为相应的索引,并打印索引和序号(期望它是相同的)。

在那之后,我再打印一次,没有做任何改变。其结果是:

代码语言:javascript
复制
index: 0, orderNumber: 0
index: 1, orderNumber: 1
index: 2, orderNumber: 2
index: 3, orderNumber: 3
index: 4, orderNumber: 4
And again
index: 0, orderNumber: 0
index: 1, orderNumber: 1
index: 2, orderNumber: 3 // <-- Take a look at this
index: 3, orderNumber: 3
index: 4, orderNumber: 4

所以..。为什么索引2处的订单号没有告诉它就改变了呢?包含orderNumber的类是hibernate映射的数据库实体。这是一个定义:

代码语言:javascript
复制
@Entity
@Table(name = "ecus")
class Ecu(

    // ...

    @Column(name = "order_number", nullable = false, updatable = true)
    var orderNumber: Int,

    // ...
)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-14 10:02:40

显然,问题实际上是由于EasyRandom造成的。当生成具有该依赖项的对象时,如果数据量过大,它将重用对象。这导致了这样的情况,即索引2和3中的对象实际上是相同的,但是两次添加到列表中。在一个索引中将一个变量设置为一个对象,它也将在另一个索引处被更改,因为该对象是相同的。谢谢萨姆把这件事弄清楚了。

对于这个问题,我有两个解决方案:

  1. 通过使用val random = EasyRandom(EasyRandomParameters().collectionSizeRange(3, 5))限制了EasyRandom可能的元素数量。这可能确保数据量足够小,以便EasyRandom只生成唯一的EasyRandom,即池大小,便于使用val random = EasyRandom(EasyRandomParameters().objectPoolSize(SOME_LARGE_NUMBER)进行随机处理。不过,小心点。Easy随机使用反射来设置对象的变量,这是相当慢的。用列表中的列表生成对象(.)可能需要很长时间
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74067427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档