Programmazione.it v6.4
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Forum
Semplificare la realizzazione dell'operatore equals() di Java
Scritto da Francesco Carotenuto il 28-06-2011 ore 08:45
Intel Cluster Studio XE
La realizzazione di un bean con molti campi può diventare molto tediosa, se dobbiamo utilizzare l'operatore equals(...) preposto a verificare se un'istanza di una classe sia uguale o meno a un'altra istanza della stessa classe.

Per realizzare tale operatore si procede facendo l'override del metodo boolean equals(Object obj), definito all'interno di Object. Per cui se abbiamo un bean come Address con i seguenti campi:
  1. public class Address 
  2. {
  3. 	private Integer houseNumber;
  4. 	private String street;
  5. 	private String city;
  6. 	private String stateOrProvince;
  7. 	private String country;
  8. ...
l'implementazione dell equals(...) sarà molto simile alla seguente:
  1. ...
  2. @Override
  3. 	public boolean equals(Object obj) 
  4. 	{
  5. 		if (this == obj)
  6. 			return true;
  7. 		if (obj == null)
  8. 			return false;
  9. 		if (getClass() != obj.getClass())
  10. 			return false;
  11.  
  12. 		Address other = (Address) obj;
  13.  
  14. 		if (city == null) 
  15. 		{
  16. 			if (other.city != null)
  17. 				return false;
  18. 		} 
  19. 		else if (!city.equals(other.city))
  20. 			return false;
  21.  
  22. 		if (country == null) 
  23. 		{
  24. 			if (other.country != null)
  25. 				return false;
  26. 		} 
  27. 		else if (!country.equals(other.country))
  28. 			return false;
  29.  
  30. 		if (houseNumber == null) 
  31. 		{
  32. 			if (other.houseNumber != null)
  33. 				return false;
  34. 		} 
  35. 		else if (!houseNumber.equals(other.houseNumber))
  36. 			return false;
  37.  
  38. 		if (stateOrProvince == null) 
  39. 		{
  40. 			if (other.stateOrProvince != null)
  41. 				return false;
  42. 		} 
  43. 		else if (!stateOrProvince.equals(other.stateOrProvince))
  44. 			return false;
  45.  
  46. 		if (street == null) 
  47. 		{
  48. 			if (other.street != null)
  49. 				return false;
  50. 		} 
  51. 		else if (!street.equals(other.street))
  52. 			return false;
  53.  
  54. 		return true;
  55. 	}
  56. ...
Tale implementazione, oltre che essere molto dispendiosa da realizzare, è anche molto poco leggibile, per cui si può pensare di semplificare lo stesso equals() nel modo seguente:
  1. ...
  2. @Override
  3. 	public boolean equals(Object obj) 
  4. 	{
  5. 		boolean result;
  6.  
  7. 		if (this == obj)
  8. 			result = true;
  9. 		else if (obj!=null && getClass() == obj.getClass())
  10. 		{
  11. 			Address other = (Address) obj;
  12.  
  13. 			Object[] fields = 
  14. 				{houseNumber, street, city, stateOrProvince, country};
  15.  
  16. 			Object[] otherFields = 
  17. 						{other.houseNumber, other.street, other.city, 
  18. 						other.stateOrProvince, other.country};
  19.  
  20. 			result = Arrays.equals(fields, otherFields);
  21. 		}
  22. 		else result = false;
  23.  
  24. 		return result;
  25. 	}
  26. ...
In pratica il confronto tra i vari campi presenti nelle due istanze viene eseguito in due fasi: nella prima si costruiscono due array fields e otherFields, che conterranno tutti i valori dei campi delle due istanze da confrontare; nella seconda fase, si applicherà, sui due array realizzati, la funzione Arrays.equals(...), che confronta gli elementi dei due array, a uno a uno, restituendone il risultato.

Possiamo notare che il confronto di due istanze della stessa classe bean, porta ad avere a che fare con due array delle stesse dimensioni; è di conseguenza possibile utilizzare, allo scopo di migliorare le perfomance, la funzione Arrays.deepEquals(...).
Precedente: Le basi della sicurezza per le webapp PHP
Successiva: La storia e il futuro di ELIZA
Copyright Programmazione.it™ 1999-2013. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 0.558 secondi.