JavaRush /Blog Java /Random-PL /Adnotacje. Część druga. Lombok

Adnotacje. Część druga. Lombok

Opublikowano w grupie Random-PL
Adnotacje. Część pierwsza, trochę nudna W tej części postanowiłem poruszyć temat biblioteki Lombok jako znanego przedstawiciela adnotacji Źródłowych. Z adnotacjami dotyczącymi środowiska wykonawczego w następnym artykule. Dawno, dawno temu był sobie programista Java, na co dzień pisał zwykły kod, na przykład ten:
package lombok;

public class Chelovek {
    private String name;
    private int age;

    public Chelovek(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Chelovek() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Chelovek chelovek = (Chelovek) o;

        if (age != chelovek.age) return false;
        return name != null ? name.equals(chelovek.name) : chelovek.name == null;
    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }

    @Override
    public String toString() {
        return "Chelovek{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
Jest to typowa klasa posiadająca tylko 2 pola (ale czasami jest ich więcej niż 10-15). Tak, oczywiście, wszystko to można wygenerować w IDE, ale cholera, zajmuje to miejsce. Jeśli jest 15-20 pól, wszystkie wymagają metod pobierających, ustawiających, konstruktorów... Wśród tego wszystkiego można łatwo zgubić kilka innych, niewidocznych dla oka metod. Jak pomóc takiemu programiście pisać szybciej i mniej? Lombok. Prosto w upał, ta sama klasa, ale z użyciem Lomboka:
package lombok;

@Data
public class Chelovek {
    private String name;
    private int age;
}
Tak, to wszystko. Fajny? Co zrobi adnotacja @Data ? Na etapie kompilacji wygeneruje gettery/settery dla wszystkich pól, toString i przedefiniuje równania i hashCode zgodnie ze standardami. Możesz zainstalować wtyczkę w IDE i zobaczysz wszystkie metody, które nie zostały jeszcze utworzone.
Adnotacje.  Część druga.  Lombok - 1
Mam nadzieję, że zaciekawiło Cię, czytelniku, bo dalej będzie krótkie wprowadzenie i linki do szczegółów. Lombok zapewnia również możliwość dostosowania generowania; nie wszystkie programy pobierające, ustawiające lub kody mieszające muszą być generowane inaczej. Dlatego też istnieją osobne adnotacje (myślę, że wiele z nich nie wymaga opisu) @Getter/@Setter @ToString @EqualsAndHashCode @NoArgsConstructor, @RequiredArgsConstructor i @AllArgsConstructor @Log Są to najbardziej typowe, cały zestaw można obejrzeć tutaj var i val zasługują na szczególną uwagę. Można napisać tak:
package lombok;

import lombok.experimental.var;

@Data
public class Chelovek {
    private String name;
    private int age;

    public static void main(String[] args) {
        var chelovek = new Chelovek();
        chelovek.setAge(22);
        System.out.println(chelovek);
    }
}
Dlaczego jest to konieczne? Na przykład mamy klasę RandomAccessFileChannel.No cóż, dlaczego musimy to napisać w ten sposób:
RandomAccessFileChannel channel = new RandomAccessFileChannel();
Jeśli to możliwe w ten sposób:
var channel2 = new RandomAccessFileChannel();
Moim zdaniem nie zawsze jest to akceptowalne. Na przykład mamy złą metodę, która zwraca złą mapę:
public static Map<List<Set<Integer>>, Set<List<String>>> evilMap(){
    return new HashMap<>();
}
jeśli nazwiesz to tak:
Map<List<Set<Integer>>, Set<List<String>>> listSetMap = evilMap();
Mniej więcej jest jasne, z czym pracujemy. Jeśli wywołanie wygląda tak:
var listSetMap = evilMap();
w takim razie kto do cholery wie, co zwraca evilMap() i dopóki nie przyjrzysz się samej metodzie, nie będziesz tego wiedział. Po co zawracać sobie głowę sięganiem do źródeł? Ogólnie rzecz biorąc, musisz być z tym bardziej ostrożny. Wątek eksperymentalny: W tym miejscu chciałbym zwrócić uwagę na adnotacje: @UtilityClass Tworzy prywatnego konstruktora i zgłasza tam wyjątek (aby ręce brudne od odbicia nie dostały się tutaj). I bardzo ładnie na początku zajęć mówi nam, że istnieją metody użytkowe. @Delegate Implementuje wzorzec delegowania. Jeśli masz klasę, która deleguje coś innej klasie, wprowadzając zmiany tylko w niektórych metodach, ta adnotacja uratuje Cię przed powielaniem metod i będzie je śledzić. Jeśli metoda zostanie usunięta lub dodana, ona to zauważy. Wątek z adnotacjami eksperymentalnymi GITHUB Oficjalna strona Aby IDE działało normalnie z lombokiem i nie wyróżniało metod jako nieistniejących, należy zainstalować wtyczkę. Na oficjalnej stronie znajduje się sekcja konfiguracyjna , w której można zobaczyć, jak podłączyć wtyczkę dla każdego IDE.Jak widać Lombok jest popularny. > 5000 gwiazdek i > 1000 widelców. Spring na swoich zajęciach używa lomboka. Jeśli masz w swoim projekcie sprężynę to poszukaj jej, może podciągnęła lombok, po prostu nie wiesz.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION