Kategória: Java külső könyvtárak.
Problémafelvetés
A Java-ban ha adatok tárolására hozunk létre osztályt, akkor a mérete elég gyorsan nagyra nő:
- A mezőkhöz általában létrehozunk lekérdezőket (getter) és beállítókat (setter).
- Többnyire létrehozunk legalább két konstruktort: egyrészt az üreset, másrészt azt, amelyik mindegyik adatmezőt tartalmazza.
- Általában megvalósítjuk a hashCode() és equals() függvényeket is.
- Valamint a kiíráshoz a toString() metódust.
Mindez eléggé mechanikus, és a legtöbb modern IDE eszközt is biztosít ezek legenerálására. Az eredmény hátránya, hogy hosszú: pl. ha a legegyszerűbb esetet vesszük, és mindössze csak két egyszerű adatmezőt tartalmaz (egy adat esetén nem hozunk létre külön osztályt), akkor IntelliJ IDEA-val generálva 56 sor hosszú az eredmény:
package hu.faragocsaba.lombok; public class MyClassNormal { private int myNumber; private String myText; public MyClassNormal() { } public MyClassNormal(int myNumber, String myText) { this.myNumber = myNumber; this.myText = myText; } public int getMyNumber() { return myNumber; } public void setMyNumber(int myNumber) { this.myNumber = myNumber; } public String getMyText() { return myText; } public void setMyText(String myText) { this.myText = myText; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; MyClassNormal that = (MyClassNormal) o; if (myNumber != that.myNumber) return false; return myText != null ? myText.equals(that.myText) : that.myText == null; } @Override public int hashCode() { int result = myNumber; result = 31 * result + (myText != null ? myText.hashCode() : 0); return result; } @Override public String toString() { return "MyClassNormal{" + "myNumber=" + myNumber + ", myText='" + myText + '\'' + '}'; } }
Lombok
A Lombok a fenti problémát hivatott kezelni. Az alábbi függőséget kell hozzáadni a pom.xml fájlhoz:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> <scope>provided</scope> </dependency>
Ezt követően néhány annotációval el tudjuk érni a fenti eredményt:
package hu.faragocsaba.lombok; import lombok.*; @Getter @Setter @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode @ToString public class MyClassLombok { private int myNumber; private String myText; }
A kódban pont úgy használhatjuk, mintha tényleg ott lennének a kérdéses függvények:
MyClassLombok myObject = new MyClassLombok(42, "apple"); System.out.println(myObject.getMyText());
Egyes régebbi IDE-k fordítási hibát jelezhetnek a függvények hiánya miatt, noha a kód rendesen lefut. Az újabba már általában rendesen kezelik, de ha mégse, akkor egy megfelelő beépülő (plugin) segítségével tudjuk orvosolni a problémát.
Vélemény
Személyes véleményem erről az alábbi:
- Nagyon egyszerű alkalmazásoknál, ahol eleve nincs külső függőség, nem érdemes használni; csak emiatt nem érdemes bonyolítani.
- Összetett projektek esetén szerintem szintén nem feltétlenül érdemes használni. Ott a problémákon való gondolkodás hosszú órái mellett eltörpül az a pár másodperc, amennyi idő alatt legeneráljuk a kedvenc IDE-nkben a megfelelő függvényeket, vagy akár percek alatt megírjuk kézzel.
- Ha a projekt egyébként is tartalmazza a függőséget, akkor megérheti használni. Ez esetben érdemes konzekvensnek lenni: vagy mindenhol, vagy sehol.
- Érdemes óvatosan bánni az ilyen automatikus eszközökkel. Az alapra általában elég, de ha picit is mást szeretnénk, akkor kínkeserves lehet megtalálni a megoldást, és százszor elveszíthetjük azt a pár másodperces időt, amit megnyertünk azzal, hogy a Lombokot használjuk generálás helyett.
- Tudni viszont mindenképpen érdemes erről a lehetőségről; emiatt is készült ez az oldal!