Здравствуйте, у меня есть фрагмент кода, подобный этому:
Date d1 = new java.sql.Timestamp(new Date().getTime());
Thread.sleep(10);
Date d2 = new java.sql.Timestamp(new Date().getTime());
System.out.println("Date1: " + d1);
System.out.println("Date2: " + d2);
System.out.println("Comparing times d1.t < d2.t: " + (d1.getTime() < d2.getTime()));
System.out.println("Comparing dates d1.before(d2): " + (d1.before(d2)));
Результат выглядит следующим образом:
Date1: 2013-03-26 11:04:01.093
Date2: 2013-03-26 11:04:01.103
Comparing times d1.t < d2.t: true
Comparing dates d1.before(d2): false
Что не так с этим классом java.sql.Timestamp?
Да, я это видел:
Примечание. Этот тип является составной частью java.util.Date и отдельной наносекундной стоимостью. В компоненте java.util.Date хранятся только целые секунды. Дробные секунды - нано - разделены. Метод Timestamp.equals(Object) никогда не возвращает true, когда передается значение типа java.util.Date, потому что компонент nanos даты неизвестен. В результате метод Timestamp.equals(Object) не является симметричным относительно метода java.util.Date.equals(Object). Кроме того, метод hashcode использует базовую реализацию java.util.Date и поэтому не включает в себя вычисления nos.
Из-за различий между классом Timestamp и классом java.util.Date, упомянутым выше, рекомендуется, чтобы код не отображал значения Timestamp в качестве экземпляра java.util.Date. Связывание наследования между Timestamp и java.util.Date действительно означает наследование реализации, а не наследование типов.
Но это для отношения Date ↔ Timestamp.
В моем примере у меня есть только Timestamps, и все же поведение неожиданно.
UPDATE: ANSWER
Причина этого в том, что метод before()
перегружен, а не переопределяется в java.sql.Timestamp
.
Я ожидал "переопределения" поведения.
Правильный способ сравнения временных меток состоит в том, чтобы иметь переменные Timestamp, а не Dates.
Это все еще плохое дизайнерское решение в ядре Java, поскольку наследование должно означать Timestamp is-Date, без штрафов и исключений.