Simplifier l’écriture de vos classes avec Lombok
Aujourd’hui je vais vous présenter une librairie qui va vous faire gagner pas mal de temps dans vos projets. Vous savez le moment où vous définissez vos classes métiers (beans) avec les getters/setters, la définition des méthodes hashCode(), equals() et toString(), le moment où vous multipliez par 10 le code source de vos beans. Ce moment long, fastidieux et répétitif est terminé. Soulagez vos sources et votre IDE et adoptez Lombok !
Le projet Lombok est une librairie qui va vous permettre d’annoter vos classes afin de faire tout cela à la compilation très simplement et sans superflus dans vos sources (et même bien plus encore).
Créer une classe métier simple
Actuellement lorsque vous créez votre bean métier, vous utilisez surement votre IDE préféré afin de générer les getters/setters, ainsi que la redéfinition des méthodes de la classe Object .
Voici un exemple de ce que vous faites actuellement :
public class Person { protected Long id; protected String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person2 other = (Person2) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + "]"; } }
Contrairement à ce qu’on peut voir dans d’autres langages tel que C# avec ses proprietés. L’accès aux membres d’une classes Java requiert pas mal de code verbeux qui prend une place inutile dans vos sources. Pourtant tout ceci est nécessaire pour garder le principe d’encapsulation.
Le créateur du projet Lombok s’est dit “enlevons tout ce que nous générons automatiquement et à chaque fois avec notre IDE par une manière plus simple de l’écrire”. Il s’est donc tourné vers les annotations.
Avec Lombok , pour le même résultat, il suffit d’écrire :
import lombok.Data; @Data public class Person { protected Long id; protected String name; }
Comme vous avez pu le voir, l’annotation @Data fait tout pour vous. Elle regroupe d’ailleurs le fonctionnement de plusieurs annotions utilisables indépendamment : @ToString , @EqualsAndHashCode , @Getter , @Setter et @RequiredArgsConstructor .
Les autres cas utiles
Lombok est vraiment une librairie pour simplifier nos taches répétitives, même pour nos classes de services, voici quelques exemples d’utilisation.
Le logger (exemple avec SLF4J) :
Actuellement vous déclarez toujours la même ligne :
public class DummyService { private static final Logger log = LoggerFactory.getLogger(DummyService.class); public void process() { log.info("Something do to here"); } }
Maintenant avez juste une annotation :
import lombok.extern.slf4j.Slf4j; @Slf4j public class DummyService { public void process() { log.info("Something do to here"); } }
Il existe plein d’autres annotations plus ou moins utiles pour vos besoins.
Je vous laisse regarder l’ensemble de ces fonctionnalités sur le site du projet : http://projectlombok.org/features/index.html
Utiliser Lombok dans votre projet
Si votre projet est sous Maven , vous pouvez utiliser la dépendance suivante pour compiler :
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>0.12.0</version>
<scope>provided</scope>
</dependency>
Ensuite pour que votre IDE prenne en compte l’auto-complétion des méthodes générées par Lombok, il faut :
Pour Eclipse, vous devez copier le jar de lombok à la racine du dossier et le spécifier dans le bootclasspath en ajoutant les lignes suivantes dans l’ eclipse.ini (après le -vmargs ) :
-vmargs ... -javaagent:lombok.jar -Xbootclasspath/a:lombok.jar
Pour IntelliJ, il existe un plugin disponible ici : http://plugins.jetbrains.com/plugin/?id=6317
Conclusion
Lombok est une librairie vraiment utiles dans le cycle de vie de nos projets pour éviter les taches répétitives et rébarbatives. De plus, il existe des fork de ce projet intéressant, comme lombok-pg ajoutant de nombreuses annotations utiles.
Qui plus est, lombok n’est pas une librairie très intrusive car elle n’est présente qu’à la compilation. Aucun jar n’est inclus dans votre projet et le Bytecode généré est du java standard.
A tout moment vous pouvez vous débarrasser de lombok pour revenir à des classes java sans annotation. Cette fonctionnalité est disponible dans le jar : delombok.
J’espère que vous allez faire de beaux projets maintenant, simples et performants.
Nombre de vue : 5972
Adepte convaincu de lombok, je tenais à souligner 2 points :
– En cas de modification du nom d’un attribut “toto” en “titi” annoté (par exemple avec @Getter), le refactoring n’est pas automatique (en tout cas sous Eclipse) sur les appelants. Il faut alors changer les getToto() en getTiti().
– L’option delombok est très utile avant de lancer une analyse de code (PMD, ..). Ca évite de se retrouver avec de fausses violations.
Lombok est non seulement une île magnifique d’indonésie, mais aussi une marque déposée.
Surprenant de prendre ce nom pour une utilisation professionnelle dansle domaine de l’informatique…….
Une marque déposée… d’ameublement ? Donc quel rapport avec l’informatique ?
D’autant que le code est sous licence open source (MIT).
Bonjour,
Comment se comporte Lombok dans un environnement de compilation continue utilisant maven ou ant ?
Avez vous des préconisations particulières ?
Bonjour,
Intéressant mais j’imagine que le débogueur de Eclipse ne doit pas être particulièrement ravi…
Apparemment Oracle préfère proposer sa propre implémentation plutôt que d’accepter Lombok comme JSR: https://groups.google.com/forum/#!topic/javaposse/1WkhNysq9VE
Encore un exemple de contournement de l’absence de préprocesseur dans la chaîne de compilation pour étendre le language Java. C’était “commons-attributes” avant les Annotations, et maintenant c’est de la génération de code à partir d’Annotations (pas conçu pour ça au départ)
La création ainsi que l’écriture de nos classes devient actuellement facile depuis l’existence du projet Lombok. Cette procédure permet de gagner encore plus de temps et d’éviter les parties compliquées et ennuyeuse lors de la création du Bean métier car il va le faire tout seul. C’est fou que la technologie puisse nous aider et nous rendre la vie un peu facile.
Quelques compléments dans cet article : http://thierry-leriche-dessirier.developpez.com/tutoriels/java/simplifier-code-guava-lombok/