1

在这个关于如何覆盖 Java System.currentTimeMillis的好问题(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 秒。

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

我一直在寻找一个比继续覆盖这一切更实际的答案......

4

2 回答 2

0

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

于 2012-08-06T00:54:18.843 回答
0

“优先组合而不是继承”以避免覆盖所有内容。

Clock包裹起来System.currentTimeMillis时,将您的包裹Timer在 a 中Scheduler,并将手也包裹在 aClock中。
对您的(即是否已经过去)Scheduler进行相关检查,并在发现条件满足时触发其内部。ClockTimer

然后,让您的代码使用.Scheduler而不是Timer.

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

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

于 2012-08-06T12:44:05.823 回答