首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java TimeUnit 枚舉實例調用實例方法的原理:SECONDS 是 TimeUnit 的實例而非類別

     編輯:程式設計綜合問答

疑惑點

TimeUnit.SECONDS.sleep(1); // 為什麼枚舉常數能呼叫實例方法?

解析

  1. TimeUnit 是 enum,其常數 SECONDS、MILLISECONDS 等**本身就是 TimeUnit 的實例**。(每個枚舉常數都是該枚舉類別的單例實例。)
  2. sleep(long timeout) 是 TimeUnit 定義的實例方法(非 static)。
  3. 因此 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) 易寫錯的情況。
  • 可擴展:自訂單位只需繼承 enum(但 Java enum 不可繼承,可用類別模擬)。

枚舉常數就是實例,實例當然能呼叫實例方法——這正是枚舉設計的精髓。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved