[英]scala trait (or abstract class): set a timestamp variable (or parameter) at instantiation of instance
我有一個特征,並從中繼承了幾個案例類。 像這樣:
sealed trait Event
case class Meeting(name: String)
case class Call(number: String)
我想為每個事件實例添加一個時間戳。 這個想法是為每個類實例設置實例化期間的時間戳。 將它放在每種情況下的類定義中很容易。 但是我想知道是否可以將它放入Event
。
給定大小寫類的語義( .equals
, .hashCode
, .toString
等),您可能更喜歡這樣:
import java.time.LocalDateTime
sealed trait Event {
val time: LocalDateTime
}
final case class Meeting(name: String, override val time: LocalDateTime = LocalDateTime.now())
extends Event
final case class Call(number: String, override val time: LocalDateTime = LocalDateTime.now())
extends Event
誠然,這不是那么優雅,但是它將更加一致地工作。 例如,考慮以下Scala REPL會話:
scala> val m1 = Meeting("Some meeting")
m1: Meeting = Meeting(Some meeting,2017-10-27T17:15:37.389)
scala> val m2 = Meeting("Some meeting")
m2: Meeting = Meeting(Some meeting,2017-10-27T17:15:46.829)
scala> m1 == m2
res0: Boolean = false
m1
和m2
不相等,因為它們的開始時間不同。
您還可以利用案例類的全部功能,按時間進行模式匹配等,同時還將Meeting
和Call
視為Event
。 例如:
val events: List[Event] = //...
// Filter events that occurred in the last week.
val oneWeekAgo = LocalDateTime.now().minusDays(7)
val recent = events.filter(_.time.isAfter(oneWeekAgo))
// Convert to log messages.
val msg = recent.map {
case Meeting(n, t) => s"Meeting $n, held on ${t.toString}"
case Call(n, t) => s"Telephone call to $n, made on ${t.toString}"
}
由於可以包括明確的開始時間,因此該版本也更易於測試。
您可以在特征中聲明它
sealed trait Event {
val time = LocalDateTime.now()
}
case class Meeting(name: String) extends Event
case class Call(number: String) extends Event
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.