import java.util.Calendar;
import java.util.Date;
public class exercise4 {
public static void main (String[] args) throws InterruptedException {
Calendar cal1 = new CalendarSubclass();
cal1.setTime(new Date());
Thread.sleep(1000);
Calendar cal2 = new CalendarSubclass();
cal2.setTime(new Date());
System.out.println(cal2.after(cal1));
System.out.println(cal1.after(cal2));
System.out.println(cal1.after(cal1));
System.out.println(cal2.after(cal2));
}
}
class CalendarSubclass extends Calendar {
@Override
public boolean after(Object when) {
if (when instanceof Calendar && super.compareTo((Calendar) when) == 0) {
//if (when instanceof Calendar && ((Calendar) when).toString().equals(this.toString())) {
//if (when instanceof Calendar && equals((Calendar) when)) {
// System.out.println("lala");
return true;
}
return super.after(when);
}
@Override
public int compareTo(Calendar anotherCalendar) {
return compareDays(this.getFirstDayOfWeek(), anotherCalendar.getFirstDayOfWeek());
}
private int compareDays(int currentFirstDayOfWeek, int anotherFirstDayOfWeek) {
return (currentFirstDayOfWeek > anotherFirstDayOfWeek) ? 1
: (currentFirstDayOfWeek == anotherFirstDayOfWeek) ? 0 : -1;
}
}
La salida es:
false, false, true, true
pero debe ser
true, false, true, true
ya que tengo overrode el método que utiliza después CalenderSubclass.
Editar: Cuando he eliminado el método compareTo y compareDays funciona, pero sólo se me permite modificar el método después!
Con su actualización puedo ver lo que causa el problema:
El overriden compareTo(Calendar anotherCalendar)
es una aplicación válida para el Calendar.compareTo
método. La documentación de los Calendar.compareTo()
estados de método:
Compara los valores de tiempo [..] representados por dos objetos de calendario.
Sin embargo, el reemplazo de métodos claramente hace algo más (que compara el campo "FirstDayOfWeek", que sólo tiene sentido para Calendar
las instancias configuradas para diferentes lugares.)
Si usted puede: huir y buscar refugio de dicho código roto!
Si no se puede: reimplementar lo que el calendarios originales compareTo
hace método:
@Override
public boolean after(Object when) {
if (when instanceof Calendar) {
Calendar other = (Calendar) when;
return getTimeInMillis() >= other.getTimeInMillis();
}
return super.after(when);
}