我使用ORM模型的案例類。每個模型都有一個ID,但該ID不應公開訪問。所以我有一個父特徵Scala案例類副本成員的父母特質時調用複製()
trait WithId {
private var id: Long = 0
}
和大量的case類(模型)的繼承了它現在
case class C1(a: Int, b: String) extends WithId
case class C2(...) extends WithId
...
,如果有人叫副本()上的情況下類,它不用它複製id,但將其設置爲0.
val c1 = C1(3, "bla")
//Set c1.id to a value != 0
val c2 = c1.copy(b="bla2")
//c1.id !=0, but c2.id = 0
我希望它也複製id。
由於我有很多這些案例類,我寧願在案例類自己有儘可能少的代碼。因此,在每種情況下實現copy()方法將會有很多樣板代碼。
有沒有辦法在trait中實現某些東西,使copy()也複製id?也許使用宏的東西?還是有另一種方式我根本沒有想過?
編輯:
我可以覆蓋id字段在每種情況下類像
case class C1(a: Int, b: String, protected var id: Long)
然後,它會被複制。但這也是我必須爲每個case類編寫的樣板代碼,並且很難解釋爲什麼必須將id字段添加到case類,儘管您從不會注意到它,或者在使用case類時可以在任何其他地方使用它。如果可能,我想避免這種情況。
我無法幫您解答,但我建議您付出一些努力並重構您的代碼。在案例類中添加(可變)字段是一種臭味的代碼異味。例如。兩個不同'id'的實例可能是相同的。 – poroszd
@poroszd - 儘管可變性可能是一個問題,但也不難將兩個實例分配錯誤的ID。可變ID的問題在於,如果不是,您可以指望它穩定。 –
該ID不能從ORM框架外部訪問。我必須在內部使它變化,因爲ORM模型在初始化時id = 0,並且一旦對象被添加到數據庫就更新此id。但是你是對的,我應該重寫==運算符。 – Heinzi