Date类为什么设计为可变的,而不是像String一样?
来源:互联网 发布:淘宝首页宝贝展示框架 编辑:程序博客网 时间:2024/06/03 16:44
首先,不得不承认,这确实是类库设计的一个错误,所以“为什么”进行了这个错误设计并没有意义。但没有事物一诞生就是完美的,我们的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的日历上。
具体应用不表。
参考:
- Java8:健壮、易用的时间/日期API
- Java8日期/时间(Date Time)API指南
本文链接:Date类为什么设计为可变的,而不是像String一样?
作者:猴子007
出处:https://monkeysayhi.github.io
本文基于 知识共享署名-相同方式共享 4.0 国际许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名及链接。
阅读全文
0 0
- Date类为什么设计为可变的,而不是像String一样?
- 写出像printf一样可变长参数的函数
- shiro-密码比较的设计 CredentialsMatcher -为什么Java中的密码优先使用 char[] 而不是String?
- 为什么Java的String设计为不可变的?
- 为什么你不能像创业者一样对待自己的工作?
- 为什么String被设计为不可变
- 为什么String被设计为final
- 像瑞士军刀一样设计软件
- 像懒人一样去设计
- 如何设计一个像人的大脑皮层一样的产品?
- 像人类大脑一样的欺骗检测架构设计
- 像数据库一样设计你的 redux 数据
- String类型的Date数据转换为Date
- java Date格式的string转换为Date类型
- String转换为Date
- 为可变而设计
- 为什么推荐std::string而不是char*
- 为什么输出是String而不是Object
- Android Bmob--免费的网络存储的使用
- Android 自定义View画一条线
- 砥砺奋进!GitChat 发布 1.9 版本更新公告
- 滑动+底部导航
- 20171020Java入门笔记(四)线程
- Date类为什么设计为可变的,而不是像String一样?
- Java堆内存Heap与非堆内存Non-Heap概要
- Android代码内存优化建议-Android资源篇
- UISearchBar 去边框 改背景 (蛮恶心得控件 不如UITextFile 自己封装个)
- Android Material Design控件学习NavigationView和Toolbar使用
- export、export default、import的用法
- Quartz
- JAVA虚拟机内存分配概要
- 下载和使用网络上的XYZ格式栅格切片