Сравнение двух объектов Date с помощью метода Boolean Class - PullRequest
0 голосов
/ 10 января 2019

Меня просят использовать метод Boolean Class для сравнения года, месяца и дня для двух объектов Date. Я искал везде и не могу получить больше информации о том, как это сделать, я всегда использовал метод equals в классе Date, а не в булевом классе. Это то, что у меня есть, но выдает сообщение об ошибке.

public Boolean equals(Object obj) {        
    Date otherDate = (Date)obj;    
    return year == otherDate.year && month == otherDate.month && day otherDate.day;    
}

Это сообщение об ошибке:

'equals (Object)' в 'Date' конфликтует с 'equals (Object)' в 'java.lang.Object'; попытка использовать несовместимый тип возврата

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Может быть, мы можем попробовать другой подход.

Первый: Метод compareDates отбрасывает время, формируя дату.

public class EqualityDates {

    public static void main(String[] args) throws ParseException {

        System.out.println(compareDates(10,0,2019).equals(compareDates(1,0,2019)));

    }

    private static Date compareDates(int day, int month, int year)  throws ParseException {
        MyDate myDate = new MyDate();

        DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        Calendar cal = Calendar.getInstance();

        cal.set(Calendar.DAY_OF_MONTH, day);
        cal.set(Calendar.MONTH, month);
        cal.set(Calendar.YEAR, year);

        myDate.setMyDate(formatter.parse(formatter.format(cal.getTime())));

        return myDate.getMyDate();
    }

}

А затем: Класс MyDate переопределяет Equals и HashCode для сравнения дат.

class MyDate {

    Date myDate;

    public Date getMyDate() {
        return myDate;
    }

    public void setMyDate(Date myDate) {
        this.myDate = myDate;
    }

    @Override
    public boolean equals(Object obj) {

        if (this == obj) return true;
        if (obj == null) return false;
        if (getClass() != obj.getClass()) return false;

        MyDate otherDate = (MyDate) obj;

        if (myDate == null) {

            if (otherDate.myDate != null) return false;

        } else if (!myDate.equals(otherDate.myDate)) return false;

        return true;
    }

    @Override
    public int hashCode() {

        final int prime = 31;
        int result = 1;
        result = prime * result + ((myDate == null) ? 0 : myDate.hashCode());

        return result;
    }
}

Это просто попытка!

0 голосов
/ 11 января 2019

Я не уверен, какой смысл это имеет, но если я не понял неправильно, он удовлетворяет вашим требованиям:

public class Date {

    private int year;
    private int month;
    private int day;

    // Constructor etc.

    @Override
    public boolean equals(Object obj) {        
        Date otherDate = (Date) obj;    
        return Boolean.logicalAnd(year == otherDate.year, 
                Boolean.logicalAnd(month == otherDate.month, day == otherDate.day));    
    }

    @Override
    public int hashCode() {
        return Objects.hash(year, month, day);
    }

}

Я использую метод класса Boolean (статический метод в классе Boolean) logicalAnd вместо &&. Поскольку каждый аргумент вычисляется до вызова метода, это не приводит к короткому замыканию оценки, как &&. В противном случае это дает тот же результат. Поскольку у вас есть три подусловия, а метод принимает только два аргумента, мне нужно было вставить вызов в качестве одного из аргументов в первом вызове.

Как было сказано в комментариях, метод должен возвращать примитив boolean (маленький b) и должен иметь аннотацию @Override. Кроме того, при переопределении equals рекомендуется также переопределить hashCode и убедиться, что равные объекты имеют одинаковые хэш-коды.

Для производственного кода нужно использовать встроенный LocalDate, а не писать собственный класс Date. LocalDate уже переопределяет equals и hashCode, и нам не нужно беспокоиться о том, как они реализованы.

0 голосов
/ 10 января 2019

Два объекта даты всегда можно сравнить, используя их собственный метод equals, который использует getTime () в миллисекундах и сравнивает его.

date1.equals(date2);// returns boolean

Вы не можете переопределить метод equals логического класса, так как этот класс является окончательным, поэтому не может быть расширен.

...