【发布时间】:2018-06-13 00:55:45
【问题描述】:
当我看到这个时,我感到困惑:
public class Timestamp extends java.util.Date {
//...
public boolean equals(java.lang.Object ts) {
if (ts instanceof Timestamp) {
return this.equals((Timestamp)ts);
} else {
return false;
}
}
public int hashCode() {
return super.hashCode();
}
确实用粗体记录了<strong>Note</strong>
(见https://docs.oracle.com/javase/7/docs/api/java/sql/Timestamp.html)
对我来说,做出这样一个非常糟糕的决定的原因是什么? 与 java.util.Date 对象进行比较时,为什么不调用 super.equals(this) 以使相等比较对称?
【问题讨论】:
-
因为当时做出了错误的决定。
-
这是一个非常古老的api。它利用了当时可用的东西
-
如果
Date.equals()认为日期不等于Date子类的实例,则正确的解决方案是。但是当他们在 JDK 1.1 中添加java.sql包时,他们不敢在Date类中进行这种更改,因为这从 JDK 1.0 就已经存在了。 -
好消息是您不必在意。如今,您可以将
java.time.Instant和java.time.LocalDateTime对象存储到SQL 数据库的时间戳列中,并再次将它们作为相同类型检索。您根本不需要使用旧的java.sql.Timestamp类。 -
投反对票的人:三思而后行,并在投票的同时发表评论。此问题有效,并表现出深思熟虑的好奇心。这个类继承确实是一个糟糕的设计,一个有缺陷的hack,值得探究的人讨论。
标签: java timestamp java.util.date datetime-comparison