TimeUnit.SECONDS.sleep(1); // 為什麼枚舉常數能呼叫實例方法?
TimeUnit 是 enum,其常數 SECONDS、MILLISECONDS 等**本身就是 TimeUnit 的實例**。(每個枚舉常數都是該枚舉類別的單例實例。)sleep(long timeout) 是 TimeUnit 定義的實例方法(非 static)。TimeUnit.SECONDS.sleep(1) 等同於 someTimeUnitInstance.sleep(1),完全合法。public enum TimeUnit {
NANOSECONDS { ... },
MICROSECONDS { ... },
MILLISECONDS { ... },
SECONDS { ... }, // 這是一個 TimeUnit 實例
MINUTES { ... },
HOURS { ... },
DAYS { ... };
public void sleep(long timeout) throws InterruptedException {
if (timeout > 0) Thread.sleep(toMillis(timeout)); // 呼叫抽象方法 toMillis
}
// ...
}
toMillis、toNanos),呼叫端無需記憶換算公式。TimeUnit.SECONDS.sleep(1000) 編譯器保證單位正確,避免 Thread.sleep(1000*60) 易寫錯的情況。枚舉常數就是實例,實例當然能呼叫實例方法——這正是枚舉設計的精髓。