1

Jon Skeet が交換可能なクロックを使用することを提案しているJava System.currentTimeMillisをオーバーライドする方法に関するこの素晴らしい質問の後、私はそれが 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

すべてをオーバーライドしないように、「継承よりも構成を優先する」。

ラップとして、 でClock包み、手も でSystem.currentTimeMillis包みます。 は、関連するチェックを行い(つまり、すでに過去の時間であるか) 、条件が満たされた場合に内部をトリガーします。TimerSchedulerClock
SchedulerClockTimer

次に、コードで のScheduler代わりに を使用しますTimer

テストの場合、その実装をより具体的な動作に置き換えるか、明らかにモックを使用することができます。

追加の利点として、Java が提供する一般的なソリューションではなく、問題に合わせてカスタム作成された API を取得できます。

于 2012-08-06T12:44:05.823 に答える
0

最初の質問のアプローチと同じです。Timer() をサブクラス化し、すべてのコードでそれを使用します。

于 2012-08-06T00:54:18.843 に答える