Lombok

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!
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License