V dnešním článku bych vám rád představil zajímavou knihovnu, která přináší do nynější verze Javy takové techniky, kterých se nejspíše dočkáme v dalším vydání tohoto programovacího jazyka. Pojďme si tedy ukázat, co nám knihovna Lombok nabízí.

Seznámení

Jak bylo v úvodu naznačeno, Lombok nám má práci především urychlit. V čem tedy toto urychlení spočívá? Především v odstranění rutinní práce, kterou musí každý programátor dělat skoro každý den. Vzpomeňte si, kolikrát jste museli generovat get a set metody, kolikrát jste museli ošetřovat výjimky a kolikrát jste museli vytvářet metody toString, hashCode a equals. U všech těchto činností vám Lombok nabízí pomoc v podobě anotací, které vám tyto činnosti usnadní.

Pojďme si nejprve ukázat možnosti Lomboku na jednoduchém příkladě:


@ToString(includeFieldNames=true, exclude={"name"})
@EqualsAndHashCode(exclude={"name"})
public class ExamplePojo3 {
    @Getter
    private String name;

    @Getter
    @Setter
    private String surname;

    @Getter(AccessLevel.PROTECTED)
    @Setter(AccessLevel.PROTECTED)
    private String middleName;
}

Na ukázce je vidět použití anotací ToString, EqualsAndHashCode, Getter a Setter. Poslední zmíněné anotace není třeba více představovat – slouží k automatickému vygenerování get a set metod. Pomocí modifikátorů lze měnit viditelnost těchto metod – viz modifikátor accessLevel u fieldu middleName.

ToString anotace pak slouží k vygenerování toString metody z fieldů třídy. Tento přístup má výhodu především tehdy, pokud často danou třídu měníme – nemusíme myslet na doplňování toString metody. Pomocí modifikátorů lze měnit chování této anotace – především vyjmutí některých fieldů z metody (exclude) a začlenění jmen fieldů do textové informace metody (includeFieldNames).

Poslední anotací, která je použita v tomto příkladu je anotace EqualsAndHashCode – ta slouží k vygenerování metod equals a hashCode z fieldů třídy. Pomocí modifikátoru exlude můžeme opět nějaké fieldy vyjmout z výběru.

Instalace

Instalaci knihovny provedete stažením ze stránek projektu, kde najdete i instruktážní video a veškerou dokumentaci. Poté si knihovnu naimportujte do projektu a můžete ji začít používat.

Pokud jako vaše vývojové prostředí používáte Eclipse, pak jednoduchým spuštěním souboru lombok.jar nainstalujete plugin, který usnadní používání knihovny. Generování veškerého kódu, který knihovna vytváří, se totiž provádí až při kompilaci, tudíž metody nejsou do té doby vidět – tento nedostatek odstraňuje právě zmiňovaný plugin.

Další anotace

Z předchozího příkladu je jasné, že by vypisování všech anotací trvalo poměrně dlouhou dobu u jednoduchých POJO. Proto Lombok myslí na tyto třídy a přináší anotaci Data. Ta v sobě schraňuje všechny zmiňované anotace z našeho prvního příkladu. Její použití je snadné:


@Data
public class ExamplePojo1 {
    private String name;
    private String surname;
}

Mezi další zajímavé funkcionality této knihovny patří usnadnění ošetření výjimek, automatické uzavírání streamů a zajímavé vyřešení synchronizace vláken. Nejprve opět ukázka:


public class Main {
    private static Object exampleLock = new Object();
    @SneakyThrows(Exception.class)
    public static void main(String[] args) {
        @Cleanup
        InputStream in = new FileInputStream("aaa.txt");
        @Cleanup
        OutputStream out = new FileOutputStream("bbb.txt");
    }
    @Synchronized
    public static void synch1() {
        System.out.println("aaa");
    }
    @Synchronized("exampleLock")
    public static void synch2() {
        System.out.println("bbb");
    }
}

Jako první zmíníme anotaci SneakyThrows. Tato anotace obalí celou metodu, nad kterou je uvedena, klasickým try catch blokem, který bude reagovat na výjimku uvedenou v anotaci. S touto anotací je třeba zacházet opatrně a vždy si ověřit, že dělá přesně to, co potřebujete.

Dále následuje Cleanup. Tato anotace slouží k automatickému ošetření streamů a jiných objektů, které potřebují být uzavřeny i při jejich neúspěšném použití. Typicky se tedy jedná o zavolání metody close() v finally bloku, která bezpečně uzavře v tomto případě stream. Zde je potřeba podotknout, že podle dokumentace nedojde k vypsání žádné chybové hlášky do logu při zachycení vyjímky. Metoda, která bude zavolána v finally bloku, lze specifikovat a samotné anotaci (viz dokumentace).

Poslední anotací je Synchronized. Ta slouží k obalení kódu metody do synchronized bloku, přičemž dojde také k vytvoření LOCK objektu, který bude k synchronizaci použit. Pokud si daný objekt chceme vytvořit sami, poté ho stačí jako parametr uvést v dané anotaci.

Jak sami vidíte, knihovna Lombok nabízí zajímavé možnosti, které usnadní vytváření především POJO tříd, které jsou rutinou na skoro každém projektu. Dejte ji proto šanci a podělte se s námi v komentářích o vaše zkušenosti.