|
La surdéfinition des méthodes de la classe Object est parfois nécessaire afin de faciliter l'utilisation de vos classes dans d'autres API. Ainsi, l'API des collections requiert au développeur souhaitant tirer pleinement parti de celles-ci de devoir surdéfinir les méthodes equals(Object), hashCode() afin de garantir le bon fonctionnement des collections.
La libraire Apache Jakarta Commons Lang comprend des classes permettant de faciliter leur surdéfinition : les classes EqualsBuilder, HashCodeBuilder et ToStringBuilder. Celles-ci permettent respectivement de faciliter la comparaison, le calcul du hashCode et l'affichage "humain" d'un objet.
package com.labosun.foobar.model;
import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder;
/** * Représente une pièce jointe * * @author Frédéric Chuong */ public class Attachment implements Serializable { private Integer id;
/** Le type MIME associé à la pièce jointe */ private String contentType;
/** Le nom de la pièce jointe */ private String fileName;
/** Le Message associé à la pièce jointe */ private Message message;
/** Le contenu de la pièce jointe */ private byte[] content;
public Attachment() { super(); }
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
public byte[] getContent() { return content; }
public void setContent(byte[] content) { this.content = content; }
public String getContentType() { return contentType; }
public void setContentType(String contentType) { this.contentType = contentType; }
public String getFileName() { return fileName; }
public void setFileName(String fileName) { this.fileName = fileName; }
public Message getMessage() { return message; }
public void setMessage(Message message) { this.message = message; }
@Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof Attachment)) { return false; } Attachment rhs = (Attachment) obj;
// On spécifie ici les propriétés qui caractériseront l'identité de // l'objet courant avec celui donné en argument
return new EqualsBuilder() .append(id, rhs.id) .append(contentType, rhs.contentType) .append(fileName, rhs.fileName) .append(content, rhs.content) .isEquals(); }
@Override public int hashCode() {
// On précise ici les éléments à prendre en compte lors du calcul du // hashCode // // On décide ici de ne pas prendre en compte le Message lors du calcul // du hashCode (typiquement, on choisit les mêmes propriétés choisies // que pour la méthode equals(Object))
return new HashCodeBuilder() .append(id) .append(contentType) .append(fileName) .append(content) .toHashCode(); }
@Override public String toString() {
// On spécifie ici tous les éléments à retourner sous forme textuelle // Chaque information est associée à un élément texte qui sera utilisé // pour l'affichage // // Ici, on décide de ne pas retourner le tableau d'octets
return new ToStringBuilder(this) .append("id", id) .append("contentType", contentType) .append("fileName", fileName) .append("message", message) .toString(); } }
Pour les plus pressés, il est possible d'utiliser la réflection qui va prendre en compte toutes les propriétés :
@Override public boolean equals(Object obj) { return EqualsBuilder.reflectionEquals(this, obj); }
@Override public int hashCode() { return HashCodeBuilder.reflectionHashCode(this); }
@Override public String toString() { return ToStringBuilder.reflectionToString(this); }
Ceci est un exemple des fonctionnalités offertes par Commons Lang. Bien d'autres fonctionnalités sont offertes par cette librairie.
|