|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
[Java] Fare l'overriding dei metodi toString(), hasCode(), equals()
Ciao ragazzi,
allora ho una 20ina di classi per le quali mi è stato detto di implementare l'overriding dei metodi equals(), toString(), hashCode() seguendo le specifiche di Sun\Oracle Non è che potreste farmi un esempio su una delle mie classi? tanto per capire bene che devo fare...poi oviamente per le restanti 19 farò da me... Questa è una delle mi classi su cui dovrei fare questa operazione (credo siano poche linee di codice): Codice:
import java.io.Serializable; import java.util.Date; public class Addresses implements Serializable { /** * */ private static final long serialVersionUID = 1L; private int addressesPk, contactFk; private String addressesText, addressesNumber, city, countryCode2, districtCode, zipCode, latitude, longitude; private boolean isPrimary; private Date creationDate, lastUpdate; private int creatdBy, modifiedBy; public Addresses(int addressesPk, int contactFk){ this.addressesPk = addressesPk; this.contactFk = contactFk; } // GETTER PK E FK: public int getAddressesPk() { return addressesPk; } public int getContactFk() { return contactFk; } // GETTER E SETTER: public String getAddressesText() { return addressesText; } public void setAddressesText(String addressesText) { this.addressesText = addressesText; } public String getAddressesNumber() { return addressesNumber; } public void setAddressesNumber(String addressesNumber) { this.addressesNumber = addressesNumber; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getCountryCode2() { return countryCode2; } public void setCountryCode2(String countryCode2) { this.countryCode2 = countryCode2; } public String getDistrictCode() { return districtCode; } public void setDistrictCode(String districtCode) { this.districtCode = districtCode; } public String getZipCode() { return zipCode; } public void setZipCode(String zipCode) { this.zipCode = zipCode; } public String getLatitude() { return latitude; } public void setLatitude(String latitude) { this.latitude = latitude; } public String getLongitude() { return longitude; } public void setLongitude(String longitude) { this.longitude = longitude; } public boolean isPrimary() { return isPrimary; } public void setPrimary(boolean isPrimary) { this.isPrimary = isPrimary; } public Date getCreationDate() { return creationDate; } public void setCreationDate(Date creationDate) { this.creationDate = creationDate; } public Date getLastUpdate() { return lastUpdate; } public void setLastUpdate(Date lastUpdate) { this.lastUpdate = lastUpdate; } public int getCreatdBy() { return creatdBy; } public void setCreatdBy(int creatdBy) { this.creatdBy = creatdBy; } public int getModifiedBy() { return modifiedBy; } public void setModifiedBy(int modifiedBy) { this.modifiedBy = modifiedBy; } } Tnx Andrea |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
non capisco cosa intendi con "secondo le specifiche oracle"...
![]() L'override di un metodo appartenente a una superclasse (nel tuo caso Object) si fa inserendo nella classe un metodo con lo stesso nome che implementa la funzionalità che vuoi tu. Per esempio: Codice:
@Override public String toString(){ String toReturn = new String(); toReturn.concat("..."); ..... return toReturn; } In genere overridare il toString serve per poter avere un metodo (toString) che se richiamato, restituisce una stringa contenente alcuni dati ritenuti importanti da sapere per quell'oggetto. Nel tuo caso potrebbe essere l'indirizzo stesso o altri dati (non mi è ben chiaro che fa la tua classe). Overridare l'equals invece è più "raffinato". In pratica l'equals è un metodo che ti dice se un oggetto è "equivalente" a un altro. Quando equals non è overridato, restituisce true se e solo se l'oggetto passato come parametro è lo stesso oggetto chiamante (cioè se si riferisce proprio allo stesso oggetto in memoria). Esempio: Codice:
Integer a = new Integer(1); Integer b = new Integer(1); Integer c = a; a.equals(b); a.equals(c); Nel tuo caso devi overridare equals in modo che restituisca true se due indirizzi sono uguali (ammesso che stiamo parlando di indirizzi). Usando l'esempio precedente degli interi... Codice:
public class newInteger extends Integer{ ... public boolean equals (Object obj){ if (obj instancef Integer) if (obj.intvalue() == this.intValue()) return true; return false; } ![]() Il codice di ogni override dipende dalla classe e da cosa prendi in considerazione per dire che due oggetti sono uguali o cosa ti interessa che venga mandato in output come stringa.
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight Ultima modifica di demos88 : 03-11-2011 alle 14:04. |
![]() |
![]() |
![]() |
#3 | ||||
Member
Iscritto dal: Dec 2001
Città: Cernobbio -Co-
Messaggi: 47
|
Quote:
Quote:
Ritornano entrambi true, nel caso della classe Integer l'equals è sottoposto a override e controlla a tutti gli effetti l'uguaglianza del contenuto. Quote:
In generale, col toString puoi fare quello che vuoi, basta che ritorni un qualche tipo di rappresentazione testuale dell'oggetto. L'equals invece ha implicazioni molto più profonde, devi innazitutto rispettare le 5 proprietà definite dal contratto (riflessiva, simmetria, transitiva, consistenza e condizione sul null) e devi anche garantire che l'hashcode si comporti di conseguenza, cioè che se due oggetti sono "equals" allora i loro i hashcode devono essere uguali e la relativa consistenza. Arriva poi la spinosa questione dell'uguaglianza comportamentale, che Java di per sè non richiede, ma la buona norma sì. Questo principio dice che se due oggetti in un dato momento dell'esecuzione del programma sono equals, allora io posso continuare l'esecuzione prendendone uno o l'altro indifferentemente e avere gli stessi risultati. L'implicazione che ne consegue è che, in generale, che gli oggetti immutabili possono ridefinire l'equals (e di conseguenza hashcode), mentre gli oggetti mutabili è meglio che rimangano con l'implementazione di default, cioè che siano equals solo se si tratta dello stesso oggetto. Questo principio risolve moltissimi problemi, tant'è che nella Javadoc di Set troviamo questo: Quote:
__________________
micheledellatorre.net |
||||
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Si l'esempio con Integer e equals ho notato essere infelice, non ho controllato il codice, avessi usato un'altra classe (anche la stessa classe in cui è definito il main) avrei ottenuto un false-true.
Ovviamente un override di quei metodi andrebbe documentato in quanto se fatto non correttamente violerebbe il princìpio da te citato e potrebbe introdurre bug in fase di modifica del progetto, ma non lo ritengo per forza una pratica nociva, certo non è rigorosa... Con l'Integer è effettivamente un brutto esempio di override, ma se lavorassi con una classe creata da me, non mi farei troppi problemi a dire che il metodo equals deve fare quello che dico io ![]() Questo anche perchè non mi è chiaro il livello di professionalità che deve avere il progetto del quale si discute, però se gli è stato specificato che deve instrinsicamente rispondere a quelle proprietà dovrebbe effettivamente fare attenzione. Comunque hai portato alla luce un discorso vero, che spesso ignoro anche io, ogni tanto dovrei ricordarmi anche dello stile "corretto".
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight Ultima modifica di demos88 : 03-11-2011 alle 20:01. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quell'articolo di AngelikaLanger non l'avevo mai letto, mi ero fermato dopo un'abbuffata di pagine sui Generics (mai lette tutte se devo essere onesto...)
Rilancio con questo articoletto di Brian Goetz su hasCode, equals e compagnia bella.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Aug 2006
Messaggi: 334
|
Ciao,
l'overriding in Java è veramente semplice e ti è notevolmente facilitato se usi un ambiente di lavoro eclipse o netbeans. In poche parole che cos'è l'overriding? E' una tecnica che ti permette di ridefinire dei metodi di un oggetto, quando si rende necessario (per esempio hai un componente padre e lo stai estendendo, vuoi perciò aggiungere delle funzionalità in più all'oggetto figlio, aumentandone la specificità). Per farlo devi semplicemente conoscere il paradigma del metodo che vuoi ridefinire cioè valore di ritorno, nome del metodo, tipo e numero degli argomenti nella giusta sequenza. Se definisci un metodo che rispecchia lo stesso paradigma di un altro metodo già presente, allora lo stai "sovrascrivendo" (ridefinendolo). Per essere sicuro di aver definito un metodo con lo stesso paradigma, fai precedere la clausola "@Override" al metodo che vuoi ridefinire. Se hai mancato o sbagliato qualcosa, l'ambiente di programmazione ti segnalerà l'anomalia. Se non inserisci la clausola "@Override" e sbagli il paradigma (parzialmente) allora stai effettuando un "@Overloading", ma questa è un'altra sotria ![]() |
![]() |
![]() |
![]() |
#8 | |
Member
Iscritto dal: Sep 2008
Città: Milano
Messaggi: 126
|
Quote:
ciao! british |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:45.