Date類為什麼設計為可變的,而不是像String一樣?
阿新 • • 發佈:2018-12-22
首先,不得不承認,這確實是類庫設計的一個錯誤,所以“為什麼”進行了這個錯誤設計並沒有意義。但沒有事物一誕生就是完美的,我們的Java只是反應的慢了一點,再慢了一點。
更何況,Date類等日期/時間API又不是隻有這一個問題。
Java8之前,日期/時間API的問題
在Java8之前,日期和時間相關的類存在諸多問題:
- Java的日期/時間類的定義並不一致,在java.util和java.sql的包中都有日期類,此外用於格式化和解析的類在java.text包中定義。
- java.util.Date同時包含日期和時間,而java.sql.Date僅包含日期,將其納入java.sql包並不合理。另外這兩個類都有相同的名字,這本身就是一個非常糟糕的設計。
- 對於時間、時間戳、格式化以及解析,並沒有一些明確定義的類。對於格式化和解析的需求,我們有java.text.DateFormat抽象類,但通常情況下,SimpleDateFormat類被用於此類需求。
- 所有的日期類都是可變的,因此他們都不是執行緒安全的,這是Java日期類最大的問題之一。
- 日期類並不提供國際化,沒有時區支援,因此Java引入了java.util.Calendar和java.util.TimeZone類,但他們同樣存在上述所有的問題。
限於篇幅,還有一些問題沒有提到,但以上問題已經很清晰地表明:
Java需要一個健壯的日期/時間類。這也是為什麼Joda Time在Java日期/時間需求中扮演了高質量替換的重要角色。
Java8嶄新的日期/時間API
Java 8日期/時間API是JSR-310的實現,它的實現目標是克服舊的日期時間實現中所有的缺陷。
新的日期/時間API的一些設計原則是:
- 不變性:新的日期/時間API中,所有的類都是不可變的,這對多執行緒環境有好處。
- 關注點分離:新的API將人可讀的日期時間和機器時間(unix timestamp)明確分離,它為日期(Date)、時間(Time)、日期時間(DateTime)、時間戳(unix timestamp)以及時區定義了不同的類。
- 清晰:在所有的類中,方法都被明確定義用以完成相同的行為。舉個例子,要拿到當前例項我們可以使用now()方法,在所有的類中都定義了format()和parse()方法,而不是像以前那樣專門有一個獨立的類。為了更好的處理問題,所有的類都使用了工廠模式和策略模式,一旦你使用了其中某個類的方法,與其他類協同工作並不困難。
- 實用操作:所有新的日期/時間API類都實現了一系列方法用以完成通用的任務,如:加、減、格式化、解析、從日期/時間中提取單獨部分,等等。
- 可擴充套件性:新的日期/時間API是工作在ISO-8601日曆系統上的,但我們也可以將其應用在非ISO的日曆上。
具體應用不表。