Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
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 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / 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 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / 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


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
La Serie A con DAZN e Amazon Prime con l...
Giochi Ubisoft su Steam senza Ubisoft Co...
Miami Beach ha autorizzato la maxi opera...
Apple regala un altro anno di funzioni s...
Alla fine è successo davvero: Vol...
Il meglio di Amazon del weekend in uno s...
Speciale TV in offerta su Amazon: Hisens...
Non c'è pace per Trezor: 347.000 e-mail ...
È un portatile Dell e li vale tut...
Apple iPhone 17 Pro Max 256GB a 1.195€ (...
GPT-6 Astra è davvero AGI o non s...
LG OLED G6S 48'' a 845€ e G6 55'' a 1368...
Mantax Otax: il malware Android che crip...
Musk incassa un altro maxi contratto IA:...
Le vendite di EV sono esplose in tutto i...
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:27.


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