C'è qualche ragione per sovrascrivere gli uguali per un'entità?

4

Un'entità ha un'identità, il che implica che dovrebbe esserci solo un oggetto (ad esempio un particolare cliente) in memoria.

Come tale, l'uguaglianza di riferimento (che è ciò che la versione base di object.equals controlla) dovrebbe essere l'unica uguaglianza di cui ci preoccupiamo.

Un oggetto valore d'altra parte dovrebbe sovrascrivere gli Equali in quanto potrebbero essercene molti in memoria.

Ci sono problemi con il ragionamento sopra riportato?

Non riesco a immaginare perché avrei due oggetti cliente che rappresentano lo stesso cliente, e in ogni caso dove ho fatto (ad esempio, ho preso un clone per fare qualcosa con esso), non posso pensare a nessuna circostanza in cui dovrebbe verificare se fosse uguale all'oggetto originale.

Anche in un ambiente distribuito, qualsiasi processo client dovrebbe contenere solo un oggetto per un determinato cliente.

    
posta sturdytree 13.09.2014 - 15:59
fonte

3 risposte

2

I just can't imagine why I would have two customer objects representing the same customer, and in any case where I did (e.g. took a clone to do something with it), I can't think of any circumstances where I would need to check if it was equal to the orginal object.

Questo può facilmente accadere: leggi un elenco di oggetti da qualche parte (ad es. dal database) e ricevi un oggetto da altrove (ad es. da una richiesta web). Ora tu non chiami equals , cerchi l'oggetto nell'elenco, quindi ugualmente viene chiamato ugualmente.

Ecco dove un equals basato sul campo ha un senso. Tuttavia, selezionare i campi che dovrebbero partecipare ai controlli è qualcosa tra duro e impossibile. Considera la classe Person, quale proprietà aziendale non cambia mai? Nome? Sicuramente no. SSN? Nessuno dei due.

Ecco perché molti preferiscono un'eguaglianza basata su ID. Ciò ha altri problemi, ad esempio l'assegnazione dell'ID agli oggetti appena creati e ad altri. C'è una lunga discussione a riguardo da qualche parte sulle pagine di Hibernate.

Non definire equals è un modo di cui non ho mai sentito parlare.

Even in a distributed environment, any client process should only contain one object for a certain customer.

Cosa succede se un processo invia un'entità a un altro?

    
risposta data 13.09.2014 - 20:59
fonte
1

I just can't imagine why I would have two customer objects representing the same customer

Non tutti gli oggetti rappresentano "clienti". Altri oggetti rappresentano altri tipi di entità. In questi casi l'uguaglianza dei valori potrebbe essere più o meno utile in base alle regole di bussines, consentendo di essere in grado di verificare se un dato oggetto è passato o meno come parametro (basato sull'attività commerciale) in una determinata collezione.

Even in a distributed environment, any client process should only contain one object for a certain customer.

I sistemi distribuiti non sono centralizzati. Sono l'opposto di centralizzato. Interagiscono l'invio di oggetti avanti e indietro. Un'uguaglianza di valore aiuta in tale interoperabilità poiché, essendo distribuiti, gli indirizzi di posizione di memoria non corrisponderebbero. Inoltre, come impedirebbe ai processi indipendenti e distribuiti di creare istanze di oggetti uguali secondo una regola aziendale?

Ancora una volta, non tutti gli oggetti sono clienti e la tua domanda riguarda "entità". Forse dovresti rinominare la tua domanda in "C'è qualche motivo per ignorare gli equini per una classe di clienti?"

Un altro problema.

In base al tuo ragionamento, due oggetti cliente separati, con stato identico (valori) sarebbero clienti diversi poiché avranno indirizzi di memoria diversi (riferimenti variabili).

    
risposta data 13.10.2014 - 22:15
fonte
1

Non assumere mai la tua incapacità di immaginare perché qualcuno VOGLIA di fare qualcosa abbia qualche correlazione con ciò che qualcun altro FARÀ.

Ricorda la legge di Murphy e chiedi "c'è QUALUNQUE situazione in cui non essere in grado di riconoscere gli oggetti distinti come uguali può causare problemi". Se la risposta è sì, le poche righe di codice necessarie per confrontare l'uguaglianza in base al valore saranno utili.

    
risposta data 13.10.2014 - 23:37
fonte

Leggi altre domande sui tag