Ce este o clasă POJO?

1. Prezentare generală

În acest scurt tutorial, vom investiga definiția „Plain Old Java Object” sau POJO pe scurt.

Vom analiza modul în care un POJO se compară cu un JavaBean și modul în care transformarea POJO-urilor noastre în JavaBeans poate fi utilă.

2. Obiecte Java vechi simple

2.1. Ce este un POJO ?

Când vorbim despre un POJO, ceea ce descriem este un tip simplu, fără referințe la un anumit cadru. Un POJO nu are nicio convenție de numire pentru proprietățile și metodele noastre.

Să creăm un POJO de bază pentru angajați. Va avea trei proprietăți; prenumele, prenumele și data de începere:

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

Această clasă poate fi utilizată de orice program Java, deoarece nu este legată de niciun cadru.

Dar nu urmăm nicio convenție reală pentru construirea, accesarea sau modificarea stării clasei.

Această lipsă de convenție provoacă două probleme:

În primul rând, crește curba de învățare pentru programatorii care încearcă să înțeleagă cum să o folosească.

În al doilea rând, poate limita capacitatea unui cadru de a favoriza convenția în locul configurației, de a înțelege cum să utilizeze clasa și de a spori funcționalitatea acesteia.

Pentru a explora acest al doilea punct, să lucrăm cu EmployeePojo folosind reflecția. Astfel, vom începe să găsim câteva dintre limitările sale.

2.2. Reflecție cu un POJO

Să adăugăm dependența commons-beanutils la proiectul nostru:

 commons-beanutils commons-beanutils 1.9.4 

Și acum, să inspectăm proprietățile POJO-ului nostru:

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

Dacă ar fi să imprimăm propertyNames pe consolă, am vedea doar:

[start] 

Aici, vom vedea că vom ajunge doar începe ca o proprietate a clasei. PropertyUtils nu a reușit să le găsească pe celelalte două.

Am vedea același tip de rezultat dacă am folosi alte biblioteci precum Jackson pentru a procesa EmployeePojo.

În mod ideal, am vedea toate proprietățile noastre: prenume , prenume și startDate. Și vestea bună este că multe biblioteci Java acceptă în mod implicit ceva numit convenția de numire JavaBean.

3. JavaBeans

3.1. Ce este un JavaBean ?

Un JavaBean este încă un POJO, dar introduce un set strict de reguli în legătură cu modul în care îl implementăm:

  • Nivele de acces - proprietățile noastre sunt private și expunem getters și seters
  • Nume de metode - getters și setteri noastre urmați getX și SETX convenție (în cazul unui boolean, ISX poate folosi un getter)
  • Constructor implicit - trebuie să fie prezent un constructor fără argumente, astfel încât o instanță poate fi creată fără a furniza argumente, de exemplu în timpul deserializării
  • Serializabil - implementarea interfeței Serializabile ne permite să stocăm starea

3.2. EmployeePojo ca JavaBean

Deci, să încercăm să convertim EmployeePojo într-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. Reflecție cu un JavaBean

Când ne inspectăm bobul cu reflexie, acum obținem lista completă a proprietăților:

[firstName, lastName, startDate]

4. Tradeoffs When Using JavaBeans

So, we've shown a way in which JavaBeans are helpful. Keep in mind that every design choice comes with tradeoffs.

When we use JavaBeans we should also be mindful of some potential disadvantages:

  • Mutability – our JavaBeans are mutable due to their setter methods – this could lead to concurrency or consistency issues
  • Boilerplate – we must introduce getters for all properties and setters for most, much of this might be unnecessary
  • Zero-argument Constructor – we often need arguments in our constructors to ensure the object gets instantiated in a valid state, but the JavaBean standard requires us to provide a zero-argument constructor

Given these tradeoffs, frameworks have also adapted to other bean conventions over the years.

5. Conclusion

În acest tutorial, am comparat POJO-urile cu JavaBeans.

În primul rând, am aflat că un POJO este un obiect Java care nu este legat de un cadru specific și că un JavaBean este un tip special de POJO cu un set strict de convenții.

Apoi, am văzut cum unele cadre și biblioteci valorifică convenția de denumire JavaBean pentru a descoperi proprietățile unei clase.

Ca de obicei, exemplele sunt disponibile pe GitHub.