重写Java计时器

重写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()将使用系统时钟并立即启动该方法,

在这个关于如何的伟大问题之后,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()
返回当前时间加30秒

处理这个问题的最佳方法是什么?


我希望得到一个更实际一点的答案,而不是继续覆盖所有答案…

我会使用与第一个问题相同的方法。子类Timer()并让所有代码都使用它。

以避免重写它

时钟
包裹
系统.currentTimeMillis
时,将
计时器
包裹在
调度程序
中,并交上
时钟。
调度器
对您的
时钟
进行相关检查(即,它是否已经过了时间),并在发现满足条件时触发其内部
计时器

然后,让您的代码使用
调度程序
而不是
计时器

显然,对于测试,您可以用更具体的行为替换该实现,或者使用mock


作为一个额外的好处,您可以获得一个为您的问题定制的API,而不是Java提供的通用解决方案。

这样做可以,但它是最佳替代方案吗?我害怕通过重新编写来重新发明轮子……如果你看一下计时器源,它直接从System.currentTimeMillis()中提取时间,因此这与尝试更改日期()的情况相同。如果切换到系统源,currentTimeMillis()是本机调用。