A válasz: Lombok

2019. január 13.

Fura egy cím, ugye? Nem a fák lombjaira gondoltam…. És nem is egy indonéz szigetre, ami amúgy nagyon szép… 🙂

Amire én gondoltam az egy olyan eszköz, amely a Java alkalmazások fejlesztését könnyíti meg azzal, hogy a boilerplate kódoktól segít megszabadulni, mint például a setter és getter vagy a toString metódusok írásától, de ettől sokkal többre is képes.

A hivatalos weboldal itt található: Project Lombok

Használat

Jelenleg az 1.18.4-es változat az aktuális, így az alábbiak ennek a verziónak megfelelőek.

Én legtöbbször a Mavent build rendszert használok, így azt adom meg, hogy a pom.xml fájlba mit kell felvenni:

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

Ha pedig valamilyen fejlesztői környezeten is szeretnéd használni, akkor a lombok.jar fájl letöltését követően indítsd el, és a megjelenő ablakban válaszd ki az IDE helyét. Ez azért jó, mert így az IDE nem fog panaszkodni a “hiányzó” metódusokra, változóra.

Stabil funkciók

A Lombok tehát alapvetően annotációkat biztosít, melyek használatával automatikusan kódokat generálhatunk.

Getterek és setterek

Az osztályok privát változóinak elérését getterek és setterek biztosítják, és ahelyett, hogy ezeket mindet külön kiírnánk, használhatjuk a @Getter és @Setter annotációkat a változókon.

@Getter private int age = 10; 

ahelyett, hogy:

private int age = 10;

public int getAge() {
    return age;
}

ugyanígy:

@Setter private int age = 10; 

ToString

Nem kell kézzel megírni vagy fejlesztői környezettel generáltatni, ha a @ToString annotációt kiírjuk az osztályra, ami létrehozza a toString metódust.

@ToString
public class Rectangle {
    private int width, height;
}

ahelyett, hogy:

public class Rectangle {
    private int width, height;

    @Override
    public String toString() {
        return "Rectangle(width=" + this.width + ", height=" + this.height + ")";
    }
 }

Equals és hashCode

Hasonlóan a @ToString használatához, az @EqualsAndHashCode az equals és hashCode metósokat generálja az osztály mezőiből. Természetesen lehet módosítani az @EqualsAndHashCode.Include, illetve @EqualsAndHashCode.Exclude mező szintű annotációkkal, ha esetleg pontosan specifikálni szeretnénk, hogy mely mezők legyenek felhasználva a generálás során.

@EqualsAndHashCode
public class Book {
    private String title;
    @EqualsAndHashCode.Exclude private int id;
}

Konstruktorok

ORM használata esetén biztos, hogy a modell osztályaihoz mindig szükség van argumentum nélküli konstrukorra, ezt pedig megoldja a
@NoArgsConstructor, de persze nem csak erre használhatjuk.

Az @AllArgsConstructor olyan konstruktort generál, melyben minden mezőt felhasznál, és a @NonNull annotációval rendelkező mezőkre még egy plusz null ellenőrzést is generál.

Van még a @RequiredArgsConstructor, mely azokat a mezőket felhasználó konstruktort használ, melyek valamiért speciális “bánásmódot” igényelnek. Ilyen, ha például egy mező nincs inicializálva, és final vagy @NotNull annotációval is el van látva. Ez például kifejezetten hasznos ha osztályaink egy másik osztálytól függnek (dependency injection).

@NoArgsConstructor
@AllArgsConstructor
public class Book {
    private Long id;
    private String title;
    private String author;
}

@RequiredArgsConstructor
public class BookService {
    private final BookRepository books;
}

Rövidítés

A @Data annotáció összefogja azokat a funkciókat, melyek legtöbbször előfordulnak, ezáltal is könnyítve az életünkön. Ezt felhasználva olyan, mintha egyszerre használnánk a @ToString, @EqualsAndHashCode, @Getter (minden mezőn), @Setter (minden nem final mezőn), és a @RequiredArgsConstructor annotációkat.

@Data
public class Book {
    private Long id;
    private String title;
    private String author;
}

Builder

Kiefejezetten szeretem ezt a funkciót. Ha gyorsan össze kell állítani egy objektumot, akkor először létrehozunk egy üres objektumot, majd soronként egyesével beállítgatjuk a szükséges mezők értékeit. Na ezek helyett, egyszerűen ellátjuk @Builder annotációval az osztályunkat, hogy ezt sokkal egyszerűbben csinálhassuk:

@Builder
public class Book {
    private Long id;
    private String title;
    private String author;
    private Integer pages;
    private String isbn;
}

Book.builder()
    .title("Micimackó")
    .author("A. A. Milne")
    .pages(123)
    .build();

Logolás

Nagyobb hangvételű fejlesztéseknél már erőteljesen szokás figyelni a megfelelő alkalmazás szintű logolásra. Ilyenkor szinte minden osztály elején van egy sor, amiben egy logolást biztosító objektumot létrehozunk. Ilyen sorok helyett egy @Log osztályszintű annotáció használatával ezt a Lombok legenerálja helyettünk, és alapból egy log nevű változót fogunk tudni elérni az osztályon belül mindehol.

Különféle log könyvtárak léteznek, ezért annotációból is ennek megfelelően különféle létezik, így például a java.util.logging.Logger, org.slf4j.Logger,
org.apache.commons.logging.Log, stb.

@Slf4j
public class Main {
  
  public static void main(String... args) {
    log.error("Something's wrong here");
  }
}

Kísérleti funkciók

Minden verzióban próbálnak újabb és újabb könnyítéssel előállni a Lombok fejlesztői, és miután valamit létrehoztak, pár verzión keresztül még nem stabil funkcióként, nagyobb tesztelés alá vetik ezeket.

Ilyen például jelenleg a @UtilityClass annotáció, melyet olyan osztályokon használhatunk, amik csak úgymond metódusok gyűjteményei, azaz nem szeretnénk őket példányosítani, stb. (Ilyen a Math, vagy a Collections is)

Továbbiak

Természetesen nem csak ezek a funkciók léteznek, csak ebbe a cikkbe mindössze ennyi fért… További funkciók, és a paramétereik megtalálhatók a Lombok könyvtár honlapján.

Én ma már nem kezdek Java-s projektet e nélkül, és remélem, hogy ti is így tesztek! 🙂

Ha eddig ismerted, melyiket használod leggyakrabban? Ha nem ismerted, melyik funkció tetszik a legjobban?

1 hozzászólás

  • Szuper cikk és könyvtár! 🙂 Ez a setter, getter és builder most nagyon megtetszett!

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük