Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Intel Xeon 6+: è tempo di Clearwater Forest
Intel Xeon 6+: è tempo di Clearwater Forest
Intel ha annunciato la prossima generazione di processori Xeon dotati di E-Core, quelli per la massima efficienza energetica e densità di elaborazione. Grazie al processo produttivo Intel 18A, i core passano a un massimo di 288 per ogni socket, con aumento della potenza di calcolo e dell'efficienza complessiva.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 03-11-2011, 13:37   #1
e-commerce84
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;
	}

}
Come potrei rimplementare questi 3 metodi secondo le specifiche di Oracle?

Tnx
Andrea
e-commerce84 è offline   Rispondi citando il messaggio o parte di esso
Old 03-11-2011, 14:00   #2
demos88
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 questo modo, una chiamata del tipo System.out.println(oggettoAddresses) ritornerà la stringa 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);
Il primo equals ritorna falso, il secondo true.

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;
   }
Non ho controllato il codice che ho scritto, ma il senso dovrebbe esserti chiaro
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.
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 03-11-2011, 19:02   #3
U-Boat
Member
 
Iscritto dal: Dec 2001
Città: Cernobbio -Co-
Messaggi: 47
Quote:
Originariamente inviato da demos88 Guarda i messaggi
non capisco cosa intendi con "secondo le specifiche oracle"...
Le specifiche Oracle/Sun sono quelle riportate nella documentazione di Object

Quote:
Originariamente inviato da demos88 Guarda i messaggi
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.
Detto così è un po' impreciso, bisogna sempre ricordare che non bisogna violare il principio di Liskov altrimenti iniziano i mal di testa.

Quote:
Originariamente inviato da demos88 Guarda i messaggi
Il primo equals ritorna falso, il secondo true.
Ritornano entrambi true, nel caso della classe Integer l'equals è sottoposto a override e controlla a tutti gli effetti l'uguaglianza del contenuto.

Quote:
Originariamente inviato da demos88 Guarda i messaggi
Usando l'esempio precedente degli interi...
Codice:
public class newInteger extends Integer{
Esempio abbastanza infelice perchè viola il principio di Liskov.

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:
Great care must be exercised if mutable objects are used as set elements. The behavior of a set is not specified if the value of an object is changed in a manner that affects equals comparisons while the object is an element in the set
__________________
micheledellatorre.net
U-Boat è offline   Rispondi citando il messaggio o parte di esso
Old 03-11-2011, 19:44   #4
demos88
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.
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 03-11-2011, 20:03   #5
british
Member
 
L'Avatar di british
 
Iscritto dal: Sep 2008
Città: Milano
Messaggi: 126
La questione sull'override di equals() è spinosa, guarda questo articolo.

ciao!

british
british è offline   Rispondi citando il messaggio o parte di esso
Old 04-11-2011, 08:58   #6
banryu79
Senior Member
 
L'Avatar di banryu79
 
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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2011, 18:56   #7
webking
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
webking è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2011, 20:43   #8
british
Member
 
L'Avatar di british
 
Iscritto dal: Sep 2008
Città: Milano
Messaggi: 126
Quote:
Originariamente inviato da webking Guarda i messaggi
Ciao,
l'overriding in Java è veramente semplice e ti è notevolmente facilitato se usi un ambiente di lavoro eclipse o netbeans.
Questa è la sintassi, e va bene, ma qui si parlava di altro e dopo la firma del metodo prima o poi dovrai scriverne il corpo..

ciao!

british
british è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Recensione Google Pixel Watch 4: basta sollevarlo e si ha Gemini sempre al polso Recensione Google Pixel Watch 4: basta sollevarl...
Le sonde spaziali ESA ExoMars e Mars Exp...
Roscosmos: static fire per i propulsori ...
Alcune partite NBA saranno trasmesse in ...
Intel Core 13000 e 14000 aumentano uffic...
Gemini sta per arrivare in Google Maps: ...
2 minuti per vedere le 27 offerte imperd...
Ray-Ban Meta Display: tecnologia sorpren...
Un mini PC a prezzo stracciato, non cerc...
Al via i coupon nascosti di ottobre: qua...
Ferrari Elettrica si aggiorna solo in of...
Doppio sconto sugli smartphone top Xiaom...
Samsung è sempre più prota...
ChatGPT ha pregiudizi politici? Ecco cos...
Un solo iPhone rubato ha portato alla sc...
Xiaomi 17 Ultra sta arrivando: ecco come...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 22:45.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v