Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java日期API(Java.util.date、.Calendar)如此混乱?_Java_Date_Api Design - Fatal编程技术网

为什么Java日期API(Java.util.date、.Calendar)如此混乱?

为什么Java日期API(Java.util.date、.Calendar)如此混乱?,java,date,api-design,Java,Date,Api Design,正如大多数人现在痛苦地意识到的那样,用于处理日历日期的JavaAPI(特别是类Java.util.Date和Java.util.calendar)非常混乱 不经意间: 日期是可变的 日期表示时间戳,而不是日期 无法在日期组件(日、月、年…)和日期之间轻松转换 Calendar使用起来很笨重,试图将不同的日历系统合并到一个类中 总结得比较好,也排除了这些问题 现在我的问题是: 这些类是如何进入JavaSDK的?这些问题中的大多数似乎相当明显(特别是日期是可变的),应该很容易避免。那么这是怎么发

正如大多数人现在痛苦地意识到的那样,用于处理日历日期的JavaAPI(特别是类
Java.util.Date
Java.util.calendar
)非常混乱

不经意间:

  • 日期是可变的
  • 日期表示时间戳,而不是日期
  • 无法在日期组件(日、月、年…)和日期之间轻松转换
  • Calendar使用起来很笨重,试图将不同的日历系统合并到一个类中
总结得比较好,也排除了这些问题

现在我的问题是:

这些类是如何进入JavaSDK的?这些问题中的大多数似乎相当明显(特别是日期是可变的),应该很容易避免。那么这是怎么发生的呢?时间压力?或者,这些问题仅仅是回顾过去才明显


我意识到这并不是一个严格意义上的编程问题,但我会发现理解API设计为什么会出错是很有趣的。毕竟,错误总是一个很好的学习机会(我很好奇)。

Java早期的API不过是时代的产物。在那之后几年,不变性才成为一个流行的概念。你说不变性是“显而易见的”。现在可能是这样,但那时不是这样。就像依赖注入现在“显而易见”,但它不是10年前

曾经创建日历对象的成本也很高


出于向后兼容性的原因,它们仍然保持这种方式。更不幸的是,一旦意识到这个错误,旧类并没有被弃用,并且为以后的所有API创建了新的日期/时间类。在某种程度上,JDK 8采用了类似JodaTime的API(
java.time
,JSR 310),这在某种程度上已经发生了,但实际上这太少太晚了。

有人比我说得更好:

  • Class
    Date
    表示特定的时间瞬间,以毫秒为单位 精确这门课的设计是一个非常糟糕的笑话——一个发人深省的笑话 即使是优秀的程序员也会出错的例子。中的大多数方法 Date现在已弃用,替换为下面类中的方法
  • 日历
    是一个抽象类,用于在
    日期
    对象和一组整数字段,如年、月、日和小时

  • gregoriacalendar
    是JDK中
    Calendar
    的唯一子类。 它在中为日历系统执行日期到字段的转换 常用的。Sun从Taligent-a许可了这种过度设计的垃圾 普通程序员是如何搞砸的一个严肃的例子

来自Peter van der Linden的Java程序员常见问题解答,版本自07.X.1998,但这一部分已从以后的版本中删除

至于可变性,许多早期的JDK类都会受到它的影响(
矩形
维度
,…)。我听到一些人说优化方向错误


其思想是您希望能够重用对象(
o.getPosition().x+=5
),而不是像处理不可变对象那样创建副本(
o.setPosition(o.getPosition().add(5,0))
)。对于早期的虚拟机来说,这甚至可能是一个好主意,而对于现代虚拟机来说,这很可能不是一个好主意。

时间本身并不容易测量和处理。只要看看维基百科关于这个问题的文章的长度就知道了。然后,对时间本身有不同的理解:绝对时间点(作为常数)、某个地点的时间点、时间范围、时间分辨率

我记得,当我第一次看到java.util.Date(JDK1.0?)时,我非常高兴。我所知道的语言没有这样的特点。我没有考虑过时间转换等问题

我认为这是一团糟,因为如果从一个理解层次(XMLGregorianCaldender vs.Date)和需求层次(纳秒,超过2030年)发展到更高的层次,所有变化都会留下一团混乱,但保持旧的不变。java.util.Date也不例外。只要看看I/O子系统或从AWT到Swing的转换


正因为如此,“我们有时应该按下重置按钮。”(谁说的,顺便说一下?)

你可能会发现下面的帖子很有趣。它基本上解释了Calendar类最初是如何进入JavaAPI的,并揭示了date类的起源


双负数总是不好的形式…日期是可变的,而不是日期是不可变的。希望JSR-310的新日期和时间API基于Joda Time,将在Java 7中发布。DateFormat的设计不是线程安全的。。。我不同意。我们不是孤立地生活。我们并不是天生的伟大的软件架构师,他们知道正确的解决方案,却没有先见之明。我们必须学习,从过去的错误中学习是很有用的。@Thilo:是的,但这实际上是它最小的问题。我甚至可以原谅这一点,因为程序员习惯于从0开始计数。但话说回来,每月的第二天和每年的第二天都是以一为基础的。。。所以这不是真正的借口。几何类是可变的,有些有公共字段,因为很多意图都是由Swing创建的,回到一开始,这是一个提高性能的技巧。哈,来这里就是为了发布这个!无法编辑您的帖子(需要更多的重复),但是:“…Date表示特定的时间瞬间,精度为毫秒。此类的设计是一个非常糟糕的笑话-一个令人清醒的例子,说明即使是优秀的程序员也会搞砸[…]GregorianCalendar是JDK中日历的唯一子类。[…]Sun从Taligent授权了这种过度工程化的垃圾软件,这是一个普通程序员如何出错的清醒例子。”摘自Peter van Der Linden的comp.lang.java.programmers“java程序员常见问题解答”,在线网址:e.g.@Cowan:你确定吗?我在您链接到的常见问题解答中找不到引用。@sleske:in