我正在阅读该课程的scala 文档scala.concurrent.duration.Duration
,我刚刚发现它以:
此类并不意味着作为时间的通用表示,它针对 scala.concurrent 的需求进行了优化。
为什么这句话的含义?有什么更好的选择?
我正在阅读该课程的scala 文档scala.concurrent.duration.Duration
,我刚刚发现它以:
此类并不意味着作为时间的通用表示,它针对 scala.concurrent 的需求进行了优化。
为什么这句话的含义?有什么更好的选择?
我想我对此负有部分责任。
这里的一般问题是时间系统很难。真的,真的,真的很难。
致力于标准化 Futures 的 Akka 开发人员需要一个构造来描述两个“匿名”时间点之间的长度,以实现其功能。Duration
旨在解决这一特定要求。
我担心的是人们可能会开始使用这个与时间相关的类来处理它不是为了让我们陷入与java.util.Date
/java.util.Calendar
相当的麻烦情况(不是因为Duration
它实际上适用于它的用例),在这种情况下,很多人会滥用它作为某种 scala.time
它从未打算成为的东西。
这就是为什么它有这个注释并被打包到scala.concurrent.duration
而不是 eg scala.time
。
我期待java.time
与 Java 8 一起发布的软件包。将来可能会对其进行标准化,这将稍微提高互操作性,并具有为更广泛的用例而设计的额外好处。(不过,Scala 使用 Java 8 作为基线可能需要很长时间……)
时间可以根据您的需要以各种方式表示。我个人使用过:
Long
——很多工具直接拿来更新:java.time.*
感谢@Vladimir Matveev
该包由 Joda Time (Stephen Colebourne) 的作者设计。他说它设计得更好。
java.util.Date
单独的类层次结构:
trait Time
case class ExactTime(timeMs:Long) extends Time
case object Now extends Time
case object ASAP extends Time
case class RelativeTime(origin:Time, deltaMs:Long) extends Time
有序时间表示:
case class History[T](events:List[T])
模型时间。一旦我有一个全局Timer
对象var currentTime:Long
:
object Timer {
private var currentTimeValue:Long
def currentTimeMs = currentTimeValue
def currentTimeMs_=(newTime:Long) { ... some checks and notifications}
def pseudoRandom:Double = ...
}
在程序中的任何地方,我都打电话Timer.currentTimeMs
来获取时间。它允许编写具有受控时间偏移的确定性测试。(注意全局变量!现在我更喜欢使用单独的实例Timer
来避免并发问题。)