Qu'est-ce qu'une classe POJO?

1. Vue d'ensemble

Dans ce court didacticiel, nous étudierons la définition de «Plain Old Java Object» ou POJO en abrégé.

Nous verrons comment un POJO se compare à un JavaBean, et comment transformer nos POJO en JavaBeans peut être utile.

2. Objets Java simples

2.1. Qu'est-ce qu'un POJO ?

Lorsque nous parlons d'un POJO, ce que nous décrivons est un type simple sans référence à des frameworks particuliers. Un POJO n'a pas de convention de dénomination pour nos propriétés et méthodes.

Créons un POJO employé de base. Il aura trois propriétés; prénom, nom et date de début:

public class EmployeePojo { public String firstName; public String lastName; private LocalDate startDate; public EmployeePojo(String firstName, String lastName, LocalDate startDate) { this.firstName = firstName; this.lastName = lastName; this.startDate = startDate; } public String name() { return this.firstName + " " + this.lastName; } public LocalDate getStart() { return this.startDate; } }

Cette classe peut être utilisée par n'importe quel programme Java car elle n'est liée à aucun framework.

Mais nous ne suivons aucune véritable convention pour construire, accéder ou modifier l'état de la classe.

Ce manque de convention pose deux problèmes:

Premièrement, cela augmente la courbe d'apprentissage des codeurs qui tentent de comprendre comment l'utiliser.

Deuxièmement, cela peut limiter la capacité d'un framework à favoriser la convention par rapport à la configuration, à comprendre comment utiliser la classe et à augmenter ses fonctionnalités.

Pour explorer ce deuxième point, travaillons avec EmployeePojo en utilisant la réflexion. Ainsi, nous commencerons à découvrir certaines de ses limites.

2.2. Réflexion avec un POJO

Ajoutons la dépendance commons-beanutils à notre projet:

 commons-beanutils commons-beanutils 1.9.4 

Et maintenant, inspectons les propriétés de notre POJO:

List propertyNames = PropertyUtils.getPropertyDescriptors(EmployeePojo.class).stream() .map(PropertyDescriptor::getDisplayName) .collect(Collectors.toList());

Si nous devions afficher les noms de propriété sur la console, nous ne verrions que:

[start] 

Ici, nous voyons que nous ne commençons que comme une propriété de la classe. PropertyUtils n'a pas réussi à trouver les deux autres.

Nous verrions le même genre de résultat si nous utilisions d'autres bibliothèques comme Jackson pour traiter EmployeePojo.

Idéalement, nous verrions toutes nos propriétés: firstName , lastName et startDate. Et la bonne nouvelle est que de nombreuses bibliothèques Java prennent en charge par défaut quelque chose appelé la convention de dénomination JavaBean.

3. JavaBeans

3.1. Qu'est-ce qu'un JavaBean ?

Un JavaBean est toujours un POJO mais introduit un ensemble de règles strictes sur la façon dont nous l'implémentons:

  • Niveaux d'accès - nos propriétés sont privées et nous exposons les getters et les setters
  • Noms de méthode - nos getters et setters suivent les conventions getX et setX (dans le cas d'un booléen, isX peut être utilisé pour un getter)
  • Constructeur par défaut - un constructeur sans argument doit être présent pour qu'une instance puisse être créée sans fournir d'arguments, par exemple lors de la désérialisation
  • Sérialisable - l'implémentation de l' interface Serializable nous permet de stocker l'état

3.2. EmployeePojo en tant que JavaBean

Alors, essayons de convertir EmployeePojo en JavaBean:

public class EmployeeBean implements Serializable { private static final long serialVersionUID = -3760445487636086034L; private String firstName; private String lastName; private LocalDate startDate; public EmployeeBean() { } public EmployeeBean(String firstName, String lastName, LocalDate startDate) { this.firstName = firstName; this.lastName = lastName; this.startDate = startDate; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } //  additional getters/setters }

3.3. Réflexion avec un JavaBean

Lorsque nous inspectons notre bean avec réflexion, nous obtenons maintenant la liste complète des propriétés:

[firstName, lastName, startDate]

4. Compromis lors de l'utilisation de JavaBeans

Nous avons donc montré une manière dont les JavaBeans sont utiles. Gardez à l'esprit que chaque choix de conception s'accompagne de compromis.

Lorsque nous utilisons JavaBeans, nous devons également être conscients de certains inconvénients potentiels:

  • Mutabilité - nos JavaBeans sont modifiables en raison de leurs méthodes de définition - cela pourrait entraîner des problèmes de concurrence ou de cohérence
  • Boilerplate - nous devons introduire des getters pour toutes les propriétés et des setters pour la plupart, une grande partie de cela pourrait être inutile
  • Constructeur à zéro argument - nous avons souvent besoin d'arguments dans nos constructeurs pour garantir que l'objet est instancié dans un état valide, mais le standard JavaBean nous oblige à fournir un constructeur à zéro argument

Compte tenu de ces compromis, les cadres se sont également adaptés à d'autres conventions de haricots au fil des ans.

5. Conclusion

Dans ce tutoriel, nous avons comparé les POJO avec les JavaBeans.

Tout d'abord, nous avons appris qu'un POJO est un objet Java qui n'est lié à aucun cadre spécifique, et qu'un JavaBean est un type spécial de POJO avec un ensemble strict de conventions.

Ensuite, nous avons vu comment certains frameworks et bibliothèques exploitent la convention de dénomination JavaBean pour découvrir les propriétés d'une classe.

Comme d'habitude, les exemples sont disponibles à l'adresse over sur GitHub.