J'essaye de créer une classe de date simple. Mon professeur souhaite également que nous incluions notre propre méthode .equals dans la classe de date qui devrait comparer deux objets. Mon problème est que ma méthode retourne false sauf si je compare exactement le même objet, même si leurs valeurs sont les mêmes.

Voici mon chauffeur:

public class Lab3Driver {

    public static void main(String[] args) {
     Date theDate = new Date(6, 30, 1995);
     Date anotherDate = new Date(6, 30, 1995);
     System.out.println(theDate.equals(anotherDate));
     System.out.println(theDate);
     System.out.println(anotherDate);
    }
}

Voici ma classe de rendez-vous:

public class Date {
    private int month;
    private int day;
    private int year;
    public Date() // default no arg constructor
    {
        this.month = 1; // set to date I completed this class, for fun.
        this.day = 26;
        this.year = 2019;
    }

    public Date(int m, int d, int y) // normal constructor in case you want to initialize variables upon object declaration
    {
        this.month = m;
        this.day = d;
        this.year = y;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month)
    {
        if (month >= 1 && month <= 12) // if else that checks and makes sure months are between 1 and 12
        {
            this.month = month;
        }
        else
        {
            System.out.println("Invalid month input. Months are between 1 and 12.");
        }
    }

    public int getDay()
    {
        return day;
    }

    public void setDay(int day)
    {
        if (day >= 1 && day <= 31) // if else that checks and makes sure days are between 1 and 31
        {
            this.day = day;
        }
        else
        {
            System.out.println("Invalid day input. Days are between 1 and 31.");
        }
    }

    public int getYear()
    {
        return year;
    }

    public void setYear(int year) // year can be set to anything, in the case that this program is used for something
    {                             // other than the present day, as in a reference to the past or future
        this.year = year;
    }

    public String toString() // to string in order to print out the date that is stored
    {
        String theDate = "The date is: " + this.month + "/" + this.day + "/" + this.year;
        return theDate;
    }

    public boolean equals(Object that) // compares two objects and checks for null/type casting
    {
        if (this == that)
            return true;
        else if(that == null || that.getClass()!= this.getClass())
        {
            System.out.println("Null or type casting of argument.");
            return false;
        }
        else
            return false;
    }

Quelque chose avec cette méthode crée un problème, je pense:

 public boolean equals(Object that) // compares two objects and checks for null/type casting
    {
        if (this == that)
            return true;
        else if(that == null || that.getClass()!= this.getClass())
        {
            System.out.println("Null or type casting of argument.");
            return false;
        }
        else
            return false;
    }
-3
user9743667 26 janv. 2019 à 22:56

3 réponses

Meilleure réponse
if (this == that)

Cette ligne ne compare pas les objets. Cela vérifie uniquement si votre objet est dans le même espace mémoire, en demandant essentiellement s'il s'agit exactement du même objet (pointant vers le même endroit).

Si vous souhaitez comparer deux objets différents, deux instances différentes comme

Date theDate = new Date(6, 30, 1995);
Date anotherDate = new Date(6, 30, 1995);

Alors vous devrez ajouter plus de lignes de code qui vérifient chaque valeur de chaque variable dans chacun des objets, ou remplacer la méthode '==' pour la faire comparer les valeurs.

0
Alonso Mondal 26 janv. 2019 à 20:09

Quelques autres choses à ne pas faire:

Comme Nate l'a déjà dit, vous devez prendre en charge les champs individuels des deux objets que vous êtes en train de préparer. Pour ce faire, vous pouvez utiliser return year == that.getYear() && day == that.getDay() && mοnth == that.getMοnth().

Mais attendez! Votre méthode equals prend un Object. Par conséquent, nous ne pouvons pas utiliser ces méthodes. Il existe deux façons de résoudre ce problème.

  1. Effectuez une vérification instanceοf au début de la méthode, puis transtypez le paramètre en un objet Date.
  2. Limitez le paramètre de votre méthode à n'autoriser que Date objets.

Personnellement, je ferais ce dernier, car une erreur se produira au moment de la compilation si vous avez utilisé un objet non - Date. Cependant, si vous avez fait une vérification de type dans la méthode et levé une exception si la vérification de type a échoué, vous ne pouvez jamais faire une erreur si vous avez fourni un argument qui n'est pas un Date objet jusqu'à ce que la méthode soit appelée.

0
Embodiment of Ignorance 26 janv. 2019 à 21:08

C'est normal, parce que tu as écrit

else {
   return false;
}

Ainsi, chaque fois que l'objet that a une référence différente et appartient à la même classe, vous allez dans l'instruction else ci-dessus qui renvoie false. Vous devez implémenter le code au lieu de renvoyer false, par exemple:

public boolean equals(Object that) // compares two objects and checks for null/type casting
{
    if (this == that)
        return true;
    else if(that == null || that.getClass()!= this.getClass())
    {
        System.out.println("Null or type casting of argument.");
        return false;
    }
    else
        return this.year == that.getYear() && ...;
}
1
NAIT 26 janv. 2019 à 20:08