Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [JAVA] equals

    Leggendo inutili dispense di ingegneria del software, mi sono imbattuto in una questione poco chiara riguardo la ridefinizione di equals.

    Infatti si dice che:

    1. due oggetti immutabili sono equals se e solo se hanno lo stesso stato astratto.
    -->Quindi dovrei ridefinire la nativa equals e controllare "personalmente" lo stato dell'oggetto.

    Quello che non capisco è la motivazione:
    MOTIVO: "due oggetti immutabili non possono essere distinti tramite
    mutazioni; inoltre gli observer della classe permettono solo di distinguere
    gli oggetti se hanno un diverso stato astratto (altrimenti le osservazioni non
    danno differenza)"

    2. due oggetti mutabili sono equals se e solo se sono lo stesso oggetto...
    allora non ci deve essere nessuna ridefinizione.
    MOTIVOerche' i due oggetti sono attraverso mutazioni...

    Le due motivazioni non mi sono chiare...
    Sapreste darmi una mano?
    ...c'è chi come te attende l'alba...

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    81
    Praticamente se gli oggetti sono modificabili (quindi esistono dei metodi che ne modificano lo stato) l'equals deve solo controllare che siano effettivamente lo stesso oggetto, quindi le variabili che identificano i due oggetti devono puntare alla stessa locazione di memoria e ciò viene controllato dall'equals di Object (quindi non c'è bisogno che tu nella tua classe ridefinisca equals)

    Se invece hai due oggetti non modificabili essi sono equals se hanno effettivamente lo stesso stato e ciò si può verificare tramite i metodi osservatori dell'oggetto


    Spero di esserti stato di aiuto

  3. #3
    Non ho capito proprio perchè se due oggetti sono modificabili allora l'equals devo controllare che siano effettivamente lo stesso oggetto...
    e perchè se sono non modificabili bisogna controllare lo stato. :master:

    grazie
    ...c'è chi come te attende l'alba...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] equals

    Originariamente inviato da np2k
    Leggendo inutili dispense di ingegneria del software, mi sono imbattuto in una questione poco chiara riguardo la ridefinizione di equals.
    Hai appena spiegato che quelle dispense sono inutili ... ascolta questo allora:

    La questione del equals() non centra niente con il fatto che un oggetto sia immutabile (vedi ad es. String) o mutabile. equals() serve per stabilire se 2 oggetti sono, come si dice in inglese, "meaningfully equivalent", cioè se i 2 oggetti sono di significato equivalente. In pratico se hanno lo stesso contenuto.

    Prendiamo questo codice (che ho scritto io per fare un esempio):
    codice:
    public class Prova
    {
        public static void main (String[] args)
        {
            Numero n1 = new Numero (12);
            Numero n2 = new Numero (12);
    
            System.out.println ("n1.equals (n1) = " + n1.equals (n1));
            System.out.println ("n1.equals (n2) = " + n1.equals (n2));
        }
    }
    
    class Numero
    {
        private int num;
    
        public Numero (int n)
        {
            num = n;
        }
    }
    Come vedi non ho fatto l'override di equals() nella classe Numero. Quindi viene usato il equals() della classe Object, che ovviamente, non sapendo come confrontare gli oggetti, è solo in grado di confrontare i 2 reference.

    Se provi questo codice, stampa:
    n1.equals (n1) = true
    n1.equals (n2) = false


    Questo perché come ho appena detto, equals() di Object non sa fare altro che confrontare i reference quindi n1 è un reference diverso da n2 e quindi false. Anche se in realtà hanno lo stesso contenuto.

    Ora metti questo metodo nella classe Numero:
    codice:
        public boolean equals (Object o)
        {
            if (o instanceof Numero)
                return num == ((Numero) o).num;
            
            return false;
        }
    Riprova e vedrai che stampa:
    n1.equals (n1) = true
    n1.equals (n2) = true


    Quindi ridefinendo equals() posso stabilire se 2 oggetti hanno lo stesso "significato".

    Nota che la classe Numero potrei farla mutabile o immutabile, la questione del equals() non cambia. Potrei aggiungere un metodo void setNumero (int n) per fare in modo da poter modificare l'oggetto Numero anche dopo la sua creazione, rendendolo così mutabile. Ma equals non cambia!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.