重写Java计时器
在这个关于如何的伟大问题之后,Jon Skeet建议使用一个可替换的时钟,我在思考它如何与Timer类一起工作重写Java计时器,java,datetime,timer,clock,Java,Datetime,Timer,Clock,在这个关于如何的伟大问题之后,Jon Skeet建议使用一个可替换的时钟,我在思考它如何与Timer类一起工作 // Clock() is replacing Date() Date workTime = new Clock().plusSeconds(30).toDate(); Timer timer = new Timer(); timer.schedule(new ExampleClass(), workTime); 如果时钟的时间是过去的,Timer()将使用系统时钟并立即启动该方法,
// Clock() is replacing Date()
Date workTime = new Clock().plusSeconds(30).toDate();
Timer timer = new Timer();
timer.schedule(new ExampleClass(), workTime);
如果时钟的时间是过去的,Timer()
将使用系统时钟并立即启动该方法,即使在理想情况下,它将等待clock()
返回当前时间加30秒
处理这个问题的最佳方法是什么?
我希望得到一个更实际一点的答案,而不是继续覆盖所有答案…我会使用与第一个问题相同的方法。子类Timer()并让所有代码都使用它。以避免重写它 当
时钟
包裹系统.currentTimeMillis
时,将计时器
包裹在调度程序
中,并交上时钟。
调度器
对您的时钟
进行相关检查(即,它是否已经过了时间),并在发现满足条件时触发其内部计时器
然后,让您的代码使用调度程序
而不是计时器
显然,对于测试,您可以用更具体的行为替换该实现,或者使用mock
作为一个额外的好处,您可以获得一个为您的问题定制的API,而不是Java提供的通用解决方案。这样做可以,但它是最佳替代方案吗?我害怕通过重新编写来重新发明轮子……如果你看一下计时器源,它直接从System.currentTimeMillis()中提取时间,因此这与尝试更改日期()的情况相同。如果切换到系统源,currentTimeMillis()是本机调用。