Vad är en POJO-klass?

1. Översikt

I den här korta handledningen undersöker vi definitionen av ”Plain Old Java Object” eller kortfattat POJO.

Vi tittar på hur en POJO jämförs med en JavaBean, och hur det kan vara till hjälp att förvandla våra POJO till JavaBeans.

2. Vanliga gamla Java-objekt

2.1. Vad är en POJO ?

När vi pratar om en POJO är det vi beskriver en rak typ utan referenser till några specifika ramar. En POJO har ingen namngivningskonvention för våra egenskaper och metoder.

Låt oss skapa en grundläggande anställd POJO. Det kommer att ha tre egenskaper; förnamn, efternamn och startdatum:

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

Denna klass kan användas av vilket Java-program som helst, eftersom det inte är knutet till något ramverk.

Men vi följer inte någon riktig konvention för att konstruera, komma åt eller ändra klassens tillstånd.

Denna brist på konvention orsakar två problem:

För det första ökar det inlärningskurvan för kodare som försöker förstå hur man använder den.

För det andra kan det begränsa ramverkets förmåga att gynna konvention framför konfiguration, förstå hur man använder klassen och utöka dess funktionalitet.

För att utforska denna andra punkt, låt oss arbeta med EmployeePojo med hjälp av reflektion. Således börjar vi hitta några av dess begränsningar.

2.2. Reflektion med en POJO

Låt oss lägga till commons-beanutils beroende till vårt projekt:

 commons-beanutils commons-beanutils 1.9.4 

Och nu, låt oss inspektera egenskaperna hos vår POJO:

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

Om vi ​​skulle skriva ut propertyNames till konsolen skulle vi bara se:

[start] 

Här ser vi att vi bara börjar som en egenskap hos klassen. PropertyUtils hittade inte de andra två.

Vi skulle se samma typ av resultat om vi skulle använda andra bibliotek som Jackson för att bearbeta EmployeePojo.

Helst skulle vi se alla våra egenskaper: förnamn , efternamn och startdatum. Och den goda nyheten är att många Java-bibliotek som standard stöder något som kallas JavaBean-namngivningskonventionen.

3. JavaBeans

3.1. Vad är en JavaBean ?

En JavaBean är fortfarande en POJO men introducerar en strikt uppsättning regler kring hur vi implementerar den:

  • Åtkomstnivåer - våra fastigheter är privata och vi utsätter getters och setters
  • Metodnamn - våra getters och setter följer getX och setX- konventionen (i fallet med en boolean kan isX användas för en getter)
  • Standardkonstruktör - en konstruktör utan argument måste vara närvarande så att en instans kan skapas utan att tillhandahålla argument, till exempel under deserialisering
  • Serializable - genom att implementera Serializable- gränssnittet kan vi lagra staten

3.2. EmployeePojo som JavaBean

Så låt oss försöka konvertera EmployeePojo till 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. Reflektion med en JavaBean

När vi inspekterar vår böna med reflektion får vi nu en fullständig lista över egenskaperna:

[firstName, lastName, startDate]

4. Avvägningar vid användning av JavaBeans

Så vi har visat ett sätt på vilket JavaBeans är till hjälp. Tänk på att varje designval kommer med kompromisser.

När vi använder JavaBeans bör vi också tänka på några potentiella nackdelar:

  • Mutabilitet - våra JavaBeans är mutabla på grund av sina settermetoder - detta kan leda till problem med samtidighet eller konsistens
  • Boilerplate - vi måste introducera getters för alla fastigheter och setter för de flesta, mycket av detta kan vara onödigt
  • Nollargumentkonstruktör - vi behöver ofta argument i våra konstruktörer för att säkerställa att objektet blir instanserat i ett giltigt tillstånd, men JavaBean-standarden kräver att vi tillhandahåller en nollargumentkonstruktör

Med tanke på dessa avvägningar har ramar också anpassats till andra bönakonventioner genom åren.

5. Sammanfattning

I denna handledning jämförde vi POJO: er med JavaBeans.

Först lärde vi oss att ett POJO är ett Java-objekt som inte är bundet till något specifikt ramverk, och att en JavaBean är en speciell typ av POJO med en strikt uppsättning konventioner.

Sedan såg vi hur vissa ramar och bibliotek utnyttjar JavaBean-namngivningskonventionen för att upptäcka klassens egenskaper.

Som vanligt finns exemplen tillgängliga på GitHub.