Convention Java Bean
Introduction
Très rependu en Jakarta EE, Java Bean est un concept à maitriser ! Un Java Bean est une classe dont son écriture doit respecter quelques règles. Les technologies de Jakarta EE s'appuient dessus pour fonctionner correctement.
Principe de construction
Voici les propriétés d'une classe Java Bean :
- La classe doit être publique
- La classe doit être dérivable (que l'on puisse faire de l’héritage)
- Implémenter l'interface:
java.io.Serializable
- Cela implique de posséder la constante
serialVersionUID
- Tous les attributs en doivent être sérialisable.
- Cela implique de posséder la constante
- Le constructeur doit être public et sans paramètre.
- Les attributs sont à privées.
- Les attributs possèdent des accesseurs et des mutateurs publics.
Note Si la classe représente des données métiers, implémenter les méthodes
equals
ethashCode
. Et mêmetoString
pour plus de lisibilité.
Exemple :
package fr.zelmoacademy.model.entity;
import java.io.Serializable;
import java.util.Objects;
// Classe publique.
// Classe dérivable.
// Implémente 'java.io.Serializable'.
public class Customer implements Serializable {
// Numéro de série.
private static final long serialVersionUID = 1L;
// Attributs privés.
// La classe 'java.lang.String' implémente aussi 'java.io.Serializable'.
// Tous les attributs sont sérialisables.
private String givenName;
private String familyName;
// Constructeur par défaut.
// Visibilité publique.
// Pas de paramètre.
public Customer() {
}
// Facultatif:
// Deuxième constructeur avec paramètres pour plus de confort.
public Customer(final String givenName, final String familyName){
this.givenName = givenName;
this.familyName = familyName;
}
// Redéfinition de la méthode car cette classe représente des données métiers.
// Le calcul de l'égalité est basé sur les attributs 'givenName' et 'familyName'.
@Override
public boolean equals(Object o) {
final boolean eq;
if (this == o) {
eq = true;
} else if (!(o instanceof Customer)) {
eq = false;
} else {
var other = (Customer) o;
eq = Objects.equals(givenName, other.givenName)
&& Objects.equals(familyName, other.familyName);
}
return eq;
}
// Redéfinition de la méthode.
// Lorsque l'on redéfinit l'égalité d'un objet, il faut obligatoirement redéfinir 'equals' et 'hashCode'.
// Le calcul de l'égalité est basé sur les mêmes attributs que la méthode 'equals'.
@Override
public int hashCode() {
return Objects.hash(givenName, familyName);
}
// Redéfinition de la méthode.
// Plus de confort pour les développeurs.
@Override
public String toString() {
return String.format(
"%s{givenName=%s, familyName=%s}",
getClass().getName(),
this.givenName,
this.familyName
);
}
// Accesseurs & Mutateurs.
// Principe d'encapsulation.
public String getGivenName() {
return givenName;
}
public void setGivenName(String givenName) {
this.givenName = givenName;
}
public String getFamilyName() {
return familyName;
}
public void setFamilyName(String familyName) {
this.familyName = familyName;
}
}
Note La plupart des technologies Jakarta EE s'appuie sur Java Bean pour fonctionner correctement, on peut citer par exemple : JPA, EJB, CDI ...
Mécanisme de sérialisation
La sérialisation est un mécanisme apparu en Java 1.1 avec l'interface java.io.Serializable
.
Ce mécanisme est donc très vieux.
Il permet à la JVM de transformer une instance de classe en flux de données binaire dont l'état peut être sauvegardé dans un fichier (sérialisé) puis être relu (dé-sérialisé) pour restituer l'état d'un programme.
Afin de garantir que le mécanisme de sérialisation et dé-sérialisation fonctionne correctement, la JVM s'appuie sur la constante serialVersionUID
. Une sorte de numéro de série de la classe.
Si cette constante n'existe pas, c'est la JVM qui l'ajoute. La bonne pratique étant bien sûre de générer soi-même cet attribut afin d'alléger le traitement de la JVM et de garder le contrôle du numéro de version.