Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 19 su 19
  1. #11
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Perdonami, non ho capito la differenza... entrambi, in questo caso, non controllano che i "nome" di entrambe le istanze coincidano? Non ho capito la differenza tra identità e contenuto...
    Se ridefinisci equals in una tua classe es. in IndirizzoPersona, sei tu che puoi (e devi) stabilire COSA confrontare per indicare se due oggetti sono "equivalenti". Solo nome e cognome? Anche email? Anche telefono?
    Quando per te due oggetti IndirizzoPersona sono in pratica "uguali"?


    Riguardo la identità vs contenuto, la identità si riferisce alla uguaglianza di reference.

    Integer a = new Integer(123);
    Integer b = new Integer(123);
    Integer c = a;


    a == b dà false. Hanno lo stesso contenuto (valore 123) ma sono due oggetti DISTINTI, il reference non è uguale. Hanno identità differenti.

    a == c dà true perché le due variabili hanno lo stesso reference (l'oggetto è uno solo, che lo "vedi" da a o da c).


    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    hashCode() non l'ho ancora studiato... vado a vedere!
    Potresti "sorvolare" su quest'aspetto. hashCode() si usa principalmente nelle collezioni basate su hash-table.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  2. #12
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Se ridefinisci equals in una tua classe es. in IndirizzoPersona, sei tu che puoi (e devi) stabilire COSA confrontare per indicare se due oggetti sono "equivalenti". Solo nome e cognome? Anche email? Anche telefono?
    Quando per te due oggetti IndirizzoPersona sono in pratica "uguali"?


    Riguardo la identità vs contenuto, la identità si riferisce alla uguaglianza di reference.

    Integer a = new Integer(123);
    Integer b = new Integer(123);
    Integer c = a;


    a == b dà false. Hanno lo stesso contenuto (valore 123) ma sono due oggetti DISTINTI, il reference non è uguale. Hanno identità differenti.

    a == c dà true perché le due variabili hanno lo stesso reference (l'oggetto è uno solo, che lo "vedi" da a o da c).



    Potresti "sorvolare" su quest'aspetto. hashCode() si usa principalmente nelle collezioni basate su hash-table.
    scusami ma non è esattamente quello che ho fatto io creando il mio metodo sonoUguali?

  3. #13
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    scusami ma non è esattamente quello che ho fatto io creando il mio metodo sonoUguali?
    Il sonoUguali che avevi scritto inizialmente riceve due stringhe (che potrebbero essere qualunque). NON confronta due oggetti IndirizzoPersona.


    Ti ribadisco che un conto è usare l'operatore == che con i tipi reference si basa SOLO sulla identità degli oggetti e NON sul loro contenuto.
    E un altro conto è usare/sfruttare equals(). Il equals implementato in Object si basa solo su == (non saprebbe che altro fare). Se in una tua classe ridefinisci equals, allora puoi cambiare il senso di equals per fare una comparazione sul contenuto degli oggetti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #14
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Il sonoUguali che avevi scritto inizialmente riceve due stringhe (che potrebbero essere qualunque). NON confronta due oggetti IndirizzoPersona.


    Ti ribadisco che un conto è usare l'operatore == che con i tipi reference si basa SOLO sulla identità degli oggetti e NON sul loro contenuto.
    E un altro conto è usare/sfruttare equals(). Il equals implementato in Object si basa solo su == (non saprebbe che altro fare). Se in una tua classe ridefinisci equals, allora puoi cambiare il senso di equals per fare una comparazione sul contenuto degli oggetti.
    Boh...davvero non sto capendo. Mi spiegheresti come definire un equals diverso da quello in Object che faccia altro rispetto a quello che fa ora?

    Nello specifico:

    codice:
    public static void sonoUguali (String s1, String s2){
            boolean check = s1.equals(s2);
                if (check)
                {
                    System.out.println("Sono uguali!");
                }
                else
                {
                    System.out.println("NON sono uguali!");
                }
            }
    si sono due stringhe generiche s1 e s2 ma poi nella chiamata del metodo uso:

    codice:
    sonoUguali(mariorossi.getNome(), rossimario.getNome());
    e quindi due oggetti di indirizzo persona, o sbaglio?

  5. #15
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    e quindi due oggetti di indirizzo persona, o sbaglio?
    Sbagli. Sono due stringhe (potrebbero arrivare anche da chissà dove). Il fatto che stai passando due nomi di due oggetti IndirizzoPersona non vuol dire che stai confrontando gli oggetti IndirizzoPersona in sé!


    Data una classe Persona:

    codice:
    public class Persona {
        private String nome;
        private String cognome;
    
        public Persona(String nome, String cognome) {
            this.nome = nome;
            this.cognome = cognome;
        }
    
        // ... metodi getNome/setNome/getCognome/setCognome omessi per brevità ...
    }

    Solo così, senza altro (e SENZA equals ridefinito) se fai:

    codice:
    Persona p1 = new Persona("Mario", "Rossi");
    Persona p2 = new Persona("Mario", "Rossi");
    
    System.out.println(p1.equals(p2));

    Stampa false. Cioè per equals i due oggetti NON sono uguali. Ma perché il equals è quello ereditato da Object che usa solo == e siccome sono oggetti DISTINTI, essi sono visti come diversi.

    Ma i due oggetti hanno lo stesso contenuto (stesso nome e cognome). Ripeto: == si basa solo sulla "identità" degli oggetti, NON sul loro contenuto.


    Se vuoi confrontare il contenuto, ridefinisci equals, in Persona si mette es.:

    codice:
    public class Persona {
        // ... come prima
    
        public boolean equals(Object altroOggetto) {
            if (altroOggetto instanceof Persona) {
                Persona altraPersona = (Persona) altroOggetto;
    
                return getNome().equals(altraPersona.getNome())
                    && getCognome().equals(altraPersona.getCognome());
            }
    
            return false;
        }
    }

    Adesso quel p1.equals(p2) dà true, il equals eseguito è quello scritto esplicitamente sopra nella classe, che confronta il contenuto di due oggetti Persona (il this e l'altro oggetto passato in argomento).
    Ultima modifica di andbin; 22-12-2016 a 16:26
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #16
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Scusami e come mai a me il metodo sonoUguali da risultato TRUE se i nomi sono uguali e FALSE se i nomi non sono uguali? Dovrebbe darmi sempre FALSE a questo punto, no?

  7. #17
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Scusami e come mai a me il metodo sonoUguali da risultato TRUE se i nomi sono uguali e FALSE se i nomi non sono uguali? Dovrebbe darmi sempre FALSE a questo punto, no?
    Il equals di String È ben definito e corretto per confrontare il contenuto ovvero la sequenza dei char. Quindi se le sequenze sono uguali .... sono UGUALI. Se sono diverse ... beh, ovviamente sono diverse!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #18
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Scusami e come mai a me il metodo sonoUguali da risultato TRUE se i nomi sono uguali e FALSE se i nomi non sono uguali? Dovrebbe darmi sempre FALSE a questo punto, no?
    No, il tuo metodo sonoUguali sta facendo il confronto tra le stringhe !! Il metodo che hai scritto non sa nulla del fatto che quelle stringhe sono campi di IndirizzoPersona !
    E' come se tu stessi scrivendo :

    codice:
    sonoUguali("Mario", "Mario"); // stamperà a video che sono uguali
    sonoUguali("Pluto", "Paperino"); // stamperà a video che sono diversi

    Ma tu vorresti (o dovresti) poter confrontare direttamente i due contatti, non le stringhe relative ai loro nomi. Questo puoi farlo ridefinendo equals() come ti è stato consigliato.
    Nota che potresti farlo anche con un metodo statico, ad esempio definendo un metodo come:

    codice:
    public static boolean sonoUguali (IndirizzoPersona primoContatto, IndirizzoPersona secondoContatto)
    Se dentro il metodo tu prendessi con getNome() il nome del primo contatto e del secondo contatto, ed eventualmente tutte le altre caratteristiche che vuoi conincidano per poter dire che due contatti sono uguali, allora avresti un metodo quasi equivalente all'equals.

    Ma NON si usa questo procedimento. Devi cercare di evitare il più possibile metodi statici di questo tipo, ti tiri solo addosso rogne e non utilizzi i concetti cardine della programmazione ad oggetti.
    In più quel metodo è visibile solo nella classe dove è definito. Mentre oggetto1.equals(oggetto2), lo puoi eseguire ovunque.
    Inoltre equals() è il metodo deputato a verificare l'uguaglianza logica di due oggetti. Questo vuol dire che anche altre classi lo utilizzeranno, e in molti contesti, quindi non dovrai neanche essere tu a richiamarlo spesso, verrà fatto in automatico.

    Quindi ti risparmierai anche di dover scrivere del codice in più. Ma i benefici di seguire questa prassi sono davvero tanti.

  9. #19
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Ok, provo...

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.