【问题标题】:Override Java Timer覆盖 Java 计时器
【发布时间】:2012-08-06 00:48:06
【问题描述】:

在这个关于如何 Override 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 秒。

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

我一直在寻找一个比继续覆盖它更实用的答案......

【问题讨论】:

    标签: java datetime timer clock


    【解决方案1】:

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

    【讨论】:

    • 会这样做,但它是最好的选择吗?我害怕通过开始重新编写所有内容来重新发明轮子......
    • 如果你看Timer源,它直接从System.currentTimeMillis()中提取时间,所以和试图改变Date()的情况是一样的。如果切换到 System 源,currentTimeMillis() 是一个本地调用。
    【解决方案2】:

    "Favor composition over inheritance" 避免全部覆盖。

    Clock 包裹System.currentTimeMillis 时,将Timer 包裹在Scheduler 中,同时提交Clock
    Scheduler 对您的 Clock 进行相关检查(即它是否已经过去)并在发现满足条件时触发其内部 Timer

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-03-09
      • 2014-06-08
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 2010-12-09
      • 1970-01-01
      相关资源
      最近更新 更多