Cos'è una classe POJO?

1. Panoramica

In questo breve tutorial, esamineremo la definizione di "Plain Old Java Object" o POJO in breve.

Vedremo come un POJO si confronta con un JavaBean e come trasformare i nostri POJO in JavaBean può essere utile.

2. Plain Old Java Objects

2.1. Cos'è un POJO ?

Quando parliamo di un POJO, quello che stiamo descrivendo è un tipo semplice senza riferimenti a particolari framework. Un POJO non ha convenzioni di denominazione per le nostre proprietà e metodi.

Creiamo un POJO di base per i dipendenti. Avrà tre proprietà; nome, cognome e data di inizio:

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; } }

Questa classe può essere utilizzata da qualsiasi programma Java in quanto non è legata a nessun framework.

Tuttavia, non stiamo seguendo alcuna convenzione reale per la costruzione, l'accesso o la modifica dello stato della classe.

Questa mancanza di convenzione causa due problemi:

Innanzitutto, aumenta la curva di apprendimento per i programmatori che cercano di capire come usarlo.

In secondo luogo, può limitare la capacità di un framework di favorire le convenzioni rispetto alla configurazione, comprendere come utilizzare la classe e aumentarne le funzionalità.

Per esplorare questo secondo punto, lavoriamo con EmployeePojo usando la riflessione. Quindi, inizieremo a trovare alcuni dei suoi limiti.

2.2. Riflessione con un POJO

Aggiungiamo la dipendenza commons-beanutils al nostro progetto:

 commons-beanutils commons-beanutils 1.9.4 

E ora, esaminiamo le proprietà del nostro POJO:

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

Se dovessimo stampare propertyNames sulla console, vedremmo solo:

[start] 

Qui, vediamo che abbiamo solo iniziamo come una proprietà della classe. PropertyUtils non è riuscito a trovare gli altri due.

Vedremmo lo stesso tipo di risultato se usassimo altre librerie come Jackson per elaborare EmployeePojo.

Idealmente, vedremmo tutte le nostre proprietà: firstName , lastName e startDate. E la buona notizia è che molte librerie Java supportano per impostazione predefinita qualcosa chiamato convenzione di denominazione JavaBean.

3. JavaBeans

3.1. Cos'è un JavaBean ?

Un JavaBean è ancora un POJO ma introduce un rigido insieme di regole su come lo implementiamo:

  • Livelli di accesso: le nostre proprietà sono private ed esponiamo getter e setter
  • Nomi dei metodi: i nostri getter e setter seguono la convenzione getX e setX (nel caso di un booleano, isX può essere utilizzato per un getter)
  • Costruttore predefinito: deve essere presente un costruttore senza argomenti in modo che un'istanza possa essere creata senza fornire argomenti, ad esempio durante la deserializzazione
  • Serializable: l'implementazione dell'interfaccia Serializable ci consente di memorizzare lo stato

3.2. EmployeePojo come JavaBean

Quindi, proviamo a convertire EmployeePojo in un 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. Riflessione con un JavaBean

Quando ispezioniamo il nostro fagiolo con la riflessione, ora otteniamo l'elenco completo delle proprietà:

[firstName, lastName, startDate]

4. Compromessi durante l'utilizzo di JavaBeans

Quindi, abbiamo mostrato un modo in cui i JavaBeans sono utili. Tieni presente che ogni scelta di design comporta dei compromessi.

Quando usiamo JavaBeans dovremmo anche essere consapevoli di alcuni potenziali svantaggi:

  • Mutabilità : i nostri JavaBean sono mutabili a causa dei loro metodi setter - questo potrebbe portare a problemi di concorrenza o coerenza
  • Boilerplate : dobbiamo introdurre getter per tutte le proprietà e setter per la maggior parte, molto di questo potrebbe non essere necessario
  • Costruttore senza argomenti : spesso abbiamo bisogno di argomenti nei nostri costruttori per garantire che l'oggetto venga istanziato in uno stato valido, ma lo standard JavaBean ci richiede di fornire un costruttore senza argomenti

Dati questi compromessi, nel corso degli anni i framework si sono adattati anche ad altre convenzioni sui fagioli.

5. conclusione

In questo tutorial, abbiamo confrontato i POJO con JavaBeans.

In primo luogo, abbiamo appreso che un POJO è un oggetto Java che non è associato a un framework specifico e che un JavaBean è un tipo speciale di POJO con un insieme rigoroso di convenzioni.

Quindi, abbiamo visto come alcuni framework e librerie sfruttano la convenzione di denominazione JavaBean per scoprire le proprietà di una classe.

Come al solito, gli esempi sono disponibili su GitHub.