Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Pannello QD-OLED da 32 pollici con risoluzione 4K, frequenza di aggiornamento a 240Hz e tempi di risposta rapidissimi: il Gigabyte MO32U24 evolve il progetto del suo predecessore MO32U e alza ulteriormente l'asticella delle prestazioni. È ancora una volta un monitor indirizzato ai giocatori più esigenti
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
realme 16 5G è un nuovo smartphone con sensore Sony IMX 852 da 50MP sul retro e uno specchio selfie fisico integrato nella camera bar, una prima nel segmento di mercato. Batteria da 6550mAh in un corpo da 8,1mm e 183g, certificazione IP69K e ricarica da 45W completano un pacchetto aggressivo per la fascia media, per uno dei prodotti più interessanti del produttore sul piano commerciale
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Sono ormai definitive le nuove norme del Codice della Strada per i monopattini elettrici. Non solo targa e assicurazione, le regole sono tante e riguardano diversi aspetti, vi spieghiamo come evitare sanzioni che possono essere salate
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


Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming Gigabyte MO32U24 OLED: il 4K a 240Hz su un panne...
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh Recensione realme 16 5G: lo smartphone con Selfi...
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni Come rispettare tutte le nuove regole per i mono...
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta DLSS 4.5: con Dynamic Frame Generation e MFG 6X ...
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere) Plaud NotePin S, il registratore IA si fa indoss...
AMD Ryzen 9 7950X3D danneggiato: approva...
I Mac con chip Apple Silicon hanno meno ...
Scandalo nel Regno Unito: agente sotto i...
TOP 15 offerte Amazon del weekend: 10 tu...
DJI Neo Fly More Combo a 245€: il mini d...
JBL Live Beam 3 a 129€ invece di 199€ su...
L'FBI ha costruito una città segr...
AMD usa il MacBook Neo come bersaglio in...
Intel prepara 'Raptor Lake Next'? Nel 20...
Una telefonata del CEO di Amazon dietro ...
Grazie a GLIMPSE-17775 il telescopio spa...
Samsung Galaxy A27 5G è ufficiale...
TCL aggiorna la sua gamma di monitor per...
Anche OPPO avrà uno smartphone co...
La Radeon RX 9070 XT appare su Steam e m...
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: 11:30.


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