在撰寫測驗時,我遇到了一個非常奇怪的行為。我可以將其分解為以下代碼片段:
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}")
}
這個引數化變數是由 easy random ( https://github.com/j-easy/easy-random )隨機設定的,但是,這對這種情況沒有任何影響。
然后我將orderNumber每個串列條目的欄位設定為相應的索引并列印索引和訂單號(期望它是相同的)
之后,我再次列印它而不做任何更改。這是結果:
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 處的訂單號在沒有告知的情況下發生了變化?它始終在索引 2 處,并且始終更改為 3。包含的類orderNumber是由 hibernate 映射的資料庫物體。這是定義:
@Entity
@Table(name = "ecus")
class Ecu(
// ...
@Column(name = "order_number", nullable = false, updatable = true)
var orderNumber: Int,
// ...
)
uj5u.com熱心網友回復:
顯然,問題實際上是由于 EasyRandom。在生成具有該依賴關系的物件時,如果資料量太大,它將重用物件。這導致了索引 2 和 3 處的物件實際上是相同的但添加到串列中兩次的情況。將變數設定為一個索引處的物件,它也將在另一個索引處更改,因為物件是相同的。感謝@Sam 指出這一點。
對于這個問題,我有 2 個解決方案:
- 使用 限制 EasyRandom 的可能元素數量
val random = EasyRandom(EasyRandomParameters().collectionSizeRange(3, 5))。這可以確保資料量足夠小,EasyRandom 只能生成唯一的物件 - 增加池大小以便于隨機使用
val random = EasyRandom(EasyRandomParameters().objectPoolSize(SOME_LARGE_NUMBER)。不過要小心。Easy Random 使用反射來設定物件的變數,這非常慢。使用串列中的串列生成物件 (...) 可能需要很長時間
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/520441.html
標籤:科特林变量前锋
