我在代碼中大量使用了case類,回答了case類的基礎相等定義以正確行爲。然後,現在我發現我需要將另一個字段成員添加到案例類。case類中的var成員是否會影響case類的相等性?
- 因此,如果我在案例類中添加一個
var
字段成員,它會混淆案例類的相等屬性嗎? - 如果1是肯定的,那麼如果我只更改
var
字段值一次,那麼在case類進入任何集合或進行等式比較之前,不會發生任何重新分配,這是否仍然會擾亂平等行爲?
我在代碼中大量使用了case類,回答了case類的基礎相等定義以正確行爲。然後,現在我發現我需要將另一個字段成員添加到案例類。case類中的var成員是否會影響case類的相等性?
var
字段成員,它會混淆案例類的相等屬性嗎?var
字段值一次,那麼在case類進入任何集合或進行等式比較之前,不會發生任何重新分配,這是否仍然會擾亂平等行爲?案例類的平等是完全基於其主構造屬性,無論他們是var
或val
(是的,你可以通過給一個明確的var
覆蓋暗示val
這種情況下,類構造函數ARGS擁有使他們var
。)添加屬性case class
沒有影響編譯器生成的equals(other: Any)
方法。
證人:
package rrs.scribble
object CCVarEq
{
case class CC1(i: Int, j: Float, var k: Double)
case class CC2(i: Int, j: Float, var k: Double) {
var l = math.Pi
}
def show {
val cc11 = CC1(1, 2.0f, 3.0)
val cc12 = CC1(1, 2.0f, 3.0)
val cc21 = CC2(1, 2.0f, 3.0); cc21.l = math.E
val cc22 = CC2(1, 2.0f, 3.0)
printf("cc11 == cc12: %s%n", cc11 == cc12); cc12.k = math.Pi * math.E
printf("cc11 == cc12: %s%n", cc11 == cc12)
printf("cc21 == cc22: %s%n", cc21 == cc22)
}
}
在REPL:
scala> import rrs.scribble.CCVarEq._
import rrs.scribble.CCVarEq._
scala> show
cc11 == cc12: true
cc11 == cc12: false
cc21 == cc22: true
和所有傑米的關於併發點是有效的,太。
並不那麼簡單。您在一個線程上更新一個case類var,並且另一個線程正在執行相等性檢查。除非var是易失性的,否則在執行相等性檢查之前,var的更改不會傳播到其他線程。所以你可能有競爭條件。無論這種情況只發生一次還是多次。
一旦未定義該值,該值是否會被更改?如果是這樣,請使用懶惰的val。它有一個同步問題,可能會降低高性能代碼,但會滿足您的使用情況。
我看到的競爭條件。感謝告訴我懶惰的val,直到現在我還沒有使用它,我確實想延遲新添加字段的初始化,我想它不會破壞任何提及的.... – monica