Java, parametro Object

di il
10 risposte

Java, parametro Object

Salve,

ho questa classe con il metodo equals:
public class Frazione 
{
     public static void main(String[] v)
     {
        Frazione f = new Frazione(88, 80);
     }
     private final int numeratore;
     private final int denominatore;

    public Frazione(int numeratore, int denominatore)
    {
        this.numeratore = numeratore;
        this.denominatore = denominatore;
    }

     public boolean equals(Object o)
     {

     }
}
Il metodo equals ritorna true se le frazioni sono uguali. Ma "Object o" cosa sarebbe? Oggetto di che tipo? Come lo confronto con la frazione?

Grazie

10 Risposte

  • Re: Java, parametro Object

    davide.fruci ha scritto:


    Ma "Object o" cosa sarebbe? Oggetto di che tipo? Come lo confronto con la frazione?
    Generalmente nel equals si verifica con l'operatore instanceof se l'oggetto passato soddisfa la relazione "è-un" rispetto alla tua classe. Per un controllo del tipo più "stretto" si verifica il Class dell'oggetto ma si fa raramente e in casi particolari.
    Una volta che hai verificato che l'oggetto è della tua classe, fai il cast e confronti le proprietà implicate nel criterio di uguaglianza.

    Se il valore passato a equals è null, da specifiche di equals, esso deve ritornare false. Il null viene anche testato da instanceof, quindi se il test con instanceof fallisce devi restituire false.
  • Re: Java, parametro Object

    Io ho fatto così:
       public boolean equals(Object o)
        {
            if(o == null)
                return false;
            if(!(o instanceof Frazione))
                return false; 
        }

    andbin ha scritto:


    Una volta che hai verificato che l'oggetto è della tua classe, fai il cast e confronti le proprietà implicate nel criterio di uguaglianza.
    Mi manca questa parte che non ho capito come implementare..

    Il cast lo farei così:
    Frazione F = (Frazione)o;
    poi che devo fare? Grazie
  • Re: Java, parametro Object

    davide.fruci ha scritto:


       public boolean equals(Object o)
        {
            if(o == null)
                return false;
            if(!(o instanceof Frazione))
                return false; 
        }
    Il primo test è ok ma il test con instanceof testa già il null, quindi il primo non servirebbe.
    In genere per evitare il ! e le parentesi che sono necessarie in quel caso, si fa il contrario: se o instance X allora cast e confronti, else return false. Ma è questione di gusti.

    Una tipica ottimizzazione invece è testare che o sia == con this (ovvero stesso identico oggetto) e in tal caso si restituisce direttamente true. Ma è un di più che non sempre serve.

    davide.fruci ha scritto:


    Il cast lo farei così:
    Frazione F = (Frazione)o;
    Sì. Ma non usare, in generale, nomi di variabili con la maiuscola iniziale.

    davide.fruci ha scritto:


    poi che devo fare? Grazie
    Frazione ha un numeratore e un denominatore. Quando è, secondo quello che tu sai/vuoi, che due oggetti Frazione sono uguali? Se confronti banalmente i campi tra i due oggetti hai la uguaglianza di "stato" ma non, in questo caso molto particolare, la uguaglianza matematica (es. 2/4 e 4/8)
  • Re: Java, parametro Object

       public boolean equals(Object o)
        {
            if(o instanceof Frazione)
            {
                Frazione f = (Frazione)o;
                if(numeratore == f.numeratore && denominatore == f.denominatore)
                    return true;
            }
            return false;
        }
    
    Va bene così?
  • Re: Java, parametro Object

    Sì, così è ok. Però, come ti diceva andbin, se confronti 1/2 e 2/4 ottieni false. Ora dipende da quello che vuoi ottenere: se per te sono due frazioni diverse perché hanno numeratori e denominatori diversi, allora va bene così. Se invece vuoi che siano considerate uguali perché il valore complessivo della frazione è lo stesso, allora devi fare una semplice modifica: anziché confrontare separatamente numeratore e denominatore, basta guardare il valore della divisione numeratore/denominatore.

    Ciao.
  • Re: Java, parametro Object

    Sì, questo è il caso "semplice" che diceva andbin: se ricevi due oggetti che rappresentano, ad esempio, entrambi la frazione "1/2" allora il test ha successo. In compenso se ricevi un oggetto che rappresenta "1/2" e un altro che rappresenta "2/4" allora il tuo metodo restituisce false. Questa cosa non è sbagliata di per sé, dipende solo dal comportamento che tu vuoi dare alla tua classe: per te due frazioni sono uguali solo se hanno stesso numeratore e denominatore oppure anche se hanno una "forma" diversa ma stesso valore risultante?
  • Re: Java, parametro Object

    Ok, vi ringrazio

    Sì, ci ho pensato anche io a quello che dite, so solo che la richiesta è la seguente:

    il metodo boolean equals(Object o) che ritorna true se le frazioni sono identiche.

    per voi cosa intende?
  • Re: Java, parametro Object

    Secondo me intende che devono avere solo lo stesso numeratore e denominatore..
  • Re: Java, parametro Object

    Sì anche io propendo per l'interpretazione data da Della. Se avesse inteso l'altro caso, il testo avrebbe dovuto specificare "aventi lo stesso valore". Invece quell'"identiche" mi fa pensare a numeratori e denominatori uguali.
  • Re: Java, parametro Object

    Grazie ragazzi! Buona serata
Devi accedere o registrarti per scrivere nel forum
10 risposte