日々常々

ふつうのプログラマがあたりまえにしたいこと。

TimeUnitという物体

小ネタ。

java.util.concurrent.TimeUnit というクラスはご存知だろうか。ご存知?なら回れ右してください。お疲れさまでした。またの機会によろしくお願いします。

...

さて、読み進めているならばご存知でないはずなので、まずJavadocのリンクをば。

J2SE 5.0 からいらっしゃるので、別段目新しくないどころか古参とも言えるクラスです。 クラスというかenumです。定義されている列挙はナノ秒、マイクロ秒、ミリ秒、秒、分、時、日の7種類。名前の通りTimeのUnitです。できることはその時間に応じた何かしら。

TimeUnitを使えば、3日が何時間かとかすぐに出せます。忘れがちな「1日が何秒か?」とかにも答えてくれます。

long 三日の時間数 = TimeUnit.DAYS.toHours(3);
long 一日の秒数 = TimeUnit.DAYS.toSeconds(1);

便利ですね!こんな使い方をしたことはありませんが。

...

なんで今回こんな記事を書いているか?それはこんなコードをなるべく見たくないからです。

// 3分スリープする
Thread.sleep(3 * 60 * 1000);

3分とかコメントに書いてしまうと、コードを変更する時にコメントも変更しなきゃいけないです。二重メンテですね。で、コメントは変更しなくても動くので忘れられがちですし、変更忘れに気づいても対応は後回しにされがちです。なので書く必要がないならば書かないほうがいい。(このあたりは過去の記事を参照くださいませ。)

に対して、それっぽく書けるのがTimeUnitさんです。

TimeUnit.MINUTES.sleep(3);

これならコメントも要らないですし、定型的な掛け算をしなくてもいいです。1000や60の意味を気にしなくて良くもなります。 掛け算せずに計算後の数字を180000とか書いて0の数を間違えたりして、「そこで数値リテラルのアンダースコアだ!180_000と書くんだ!」とか無理にProjectCoinを使おうとせずにTimeUnitを使ったほうがいいと思うんです。

そんな事態に遭遇したことはないですけど。