Date类为何设计为可变的,而不是像String同样?

首先,不得不认可,这确实是类库设计的一个错误,因此“为何”进行了这个错误设计并无意义。但没有事物一诞生就是完美的,咱们的Java只是反应的慢了一点,再慢了一点。
更况且,Date类等日期/时间API又不是只有这一个问题。html

Java8以前,日期/时间API的问题

在Java8以前,日期和时间相关的类存在诸多问题:java

  1. Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。
  2. java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其归入java.sql包并不合理。另外这两个类都有相同的名字,这自己就是一个很是糟糕的设计。
  3. 对于时间、时间戳、格式化以及解析,并无一些明肯定义的类。对于格式化和解析的需求,咱们有java.text.DateFormat抽象类,但一般状况下,SimpleDateFormat类被用于此类需求。
  4. 全部的日期类都是可变的,所以他们都不是线程安全的,这是Java日期类最大的问题之一。
  5. 日期类并不提供国际化,没有时区支持,所以Java引入了java.util.Calendar和java.util.TimeZone类,但他们一样存在上述全部的问题。

限于篇幅,还有一些问题没有提到,但以上问题已经很清晰地代表:git

Java须要一个健壮的日期/时间类。这也是为何Joda Time在Java日期/时间需求中扮演了高质量替换的重要角色。github

Java8崭新的日期/时间API

Java 8日期/时间API是JSR-310的实现,它的实现目标是克服旧的日期时间实现中全部的缺陷。sql

新的日期/时间API的一些设计原则是:api

  1. 不变性:新的日期/时间API中,全部的类都是不可变的,这对多线程环境有好处。
  2. 关注点分离:新的API将人可读的日期时间和机器时间(unix timestamp)明确分离,它为日期(Date)、时间(Time)、日期时间(DateTime)、时间戳(unix timestamp)以及时区定义了不一样的类。
  3. 清晰:在全部的类中,方法都被明肯定义用以完成相同的行为。举个例子,要拿到当前实例咱们可使用now()方法,在全部的类中都定义了format()和parse()方法,而不是像之前那样专门有一个独立的类。为了更好的处理问题,全部的类都使用了工厂模式和策略模式,一旦你使用了其中某个类的方法,与其余类协同工做并不困难。
  4. 实用操做:全部新的日期/时间API类都实现了一系列方法用以完成通用的任务,如:加、减、格式化、解析、从日期/时间中提取单独部分,等等。
  5. 可扩展性:新的日期/时间API是工做在ISO-8601日历系统上的,但咱们也能够将其应用在非ISO的日历上。

具体应用不表。安全


参考:多线程


本文连接:Date类为何设计为可变的,而不是像String同样?
做者:猴子007
出处:https://monkeysayhi.github.io
本文基于 知识共享署名-相同方式共享 4.0 国际许可协议发布,欢迎转载,演绎或用于商业目的,可是必须保留本文的署名及连接。线程

相关文章
相关标签/搜索