Što je POJO klasa?

1. Pregled

U ovom kratkom vodiču, istražit ćemo definiciju "običnog starog Java objekta" ili skraćeno POJO.

Pogledat ćemo kako se POJO uspoređuje s JavaBeanom i kako pretvaranje naših POJO-ova u JavaBeans može biti korisno.

2. Obični stari Java objekti

2.1. Što je a POJO?

Kada govorimo o POJO-u, ono što opisujemo je jednostavan tip bez referenci na bilo koji određeni okvir. POJO nema konvenciju imenovanja za naša svojstva i metode.

Stvorimo osnovni POJO za zaposlenike. Imat će tri svojstva; ime, prezime i datum početka:

javna klasa EmployeePojo {public String firstName; javni String lastName; privatni LocalDate startDate; javni EmployeePojo (String firstName, String lastName, LocalDate startDate) {this.firstName = firstName; this.lastName = lastName; this.startDate = datum početka; } ime javnog niza () {return this.firstName + "" + this.lastName; } javni LocalDate getStart () {return this.startDate; }}

Ovu klasu može koristiti bilo koji Java program jer nije vezan ni za jedan okvir.

Ali, ne slijedimo nijednu stvarnu konvenciju za konstrukciju, pristup ili modificiranje stanja klase.

Ovaj nedostatak konvencije uzrokuje dva problema:

Prvo, povećava krivulju učenja koderima koji pokušavaju razumjeti kako se njime služiti.

Drugi, može ograničiti sposobnost okvira da favorizira konvencije u odnosu na konfiguraciju, razumjeti kako koristiti klasu i povećati njezinu funkcionalnost.

Da bismo istražili ovu drugu točku, poradimo s ZaposlenikPojo pomoću refleksije. Stoga ćemo početi otkrivati ​​neka njegova ograničenja.

2.2. Refleksija s POJO

Dodajmo i zajednička dobra ovisnost našem projektu:

 commons-beanutils zajednički-beanutils 1.9.4 

A sada, pregledajmo svojstva našeg POJO:

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

Kad bismo isprintali propertyNames na konzolu bismo vidjeli samo:

[početak] 

Evo, vidimo da samo dobivamo početak kao svojstvo klase. PropertyUtils nije uspio pronaći ostale dvije.

Isti bismo ishod vidjeli i kada bismo za obradu koristili druge knjižnice poput Jacksona ZaposlenikPojo.

U idealnom slučaju, vidjeli bismo sva svoja svojstva: ime, prezime, i početni datum. Dobra vijest je da mnoge Java knjižnice prema zadanim postavkama podržavaju nešto što se naziva JavaBean konvencija imenovanja.

3. JavaBeans

3.1. Što je a JavaBean?

JavaBean je još uvijek POJO, ali uvodi strog niz pravila oko toga kako ga provodimo:

  • Razine pristupa - naša su svojstva privatna i izlažemo getere i postavljače
  • Nazivi metoda - naši geteri i postavljači slijede getX i setX konvencija (u slučaju logičke vrijednosti, isX može se koristiti za geter)
  • Zadani konstruktor - mora biti prisutan konstruktor bez argumenta kako bi se instanca mogla stvoriti bez davanja argumenata, na primjer tijekom deserializacije
  • Serijalizirati - implementacija Serijalizirati sučelje nam omogućuje pohranu stanja

3.2. ZaposlenikPojo kao JavaBean

Pa, probajmo pretvoriti ZaposlenikPojo u JavaBean:

javna klasa EmployeeBean implementira Serializable {private static final long serialVersionUID = -3760445487636086034L; private String firstName; private String lastName; privatni LocalDate startDate; javni EmployeeBean () {} public EmployeeBean (String firstName, String lastName, LocalDate startDate) {this.firstName = firstName; this.lastName = lastName; this.startDate = datum početka; } javni String getFirstName () {return firstName; } javna praznina setFirstName (String firstName) {this.firstName = firstName; } // dodatni geteri / postavljači}

3.3. Refleksija s JavaBean-om

Kada reflektirano pregledamo svoj grah, sada dobivamo cjelovit popis svojstava:

[ime, prezime, datum početka]

4. Kompromisi prilikom upotrebe JavaBeans-a

Dakle, pokazali smo način na koji su JavaBeans korisni. Imajte na umu da svaki izbor dizajna dolazi s kompromisima.

Kada koristimo JavaBeans, trebali bismo imati na umu i neke potencijalne nedostatke:

  • Promjenjivost - naši JavaBeans su promjenjivi zbog svojih metoda postavljača - to bi moglo dovesti do problema s istodobnošću ili dosljednošću
  • Predložak - moramo uvesti gettere za sva svojstva i settere za većinu, većina toga možda je nepotrebna
  • Konstruktor nula argumenata - često su nam potrebni argumenti u našim konstruktorima kako bi osigurali da objekt postane instanciran u važećem stanju, ali JavaBean standard zahtijeva da pružimo konstruktor nula argumenata

S obzirom na ove kompromise, okviri su se tijekom godina također prilagođavali drugim konvencijama graha.

5. Zaključak

U ovom uputstvu usporedili smo POJO-ove s JavaBeansom.

Prvo, saznali smo da je POJO Java objekt koji nije vezan za određeni okvir i da je JavaBean posebna vrsta POJO sa strogim skupom konvencija.

Zatim smo vidjeli kako neki okviri i knjižnice koriste JavaBean konvenciju imenovanja kako bi otkrili svojstva klase.

Kao i obično, primjeri su dostupni na GitHubu.