Adnotacje. Część 1 — trochę nudno
W tej części zdecydowałem się poruszyć kwestię biblioteki Lombok, gdyż jest ona dobrze znanym przedstawicielem adnotacji w kodzie źródłowym. Adnotacjami dotyczącymi środowiska wykonawczego zajmę się w następnym artykule. Dawno, dawno temu był sobie programista Java. Na co dzień pisała zwykły kod, na przykład taki:
package lombok;
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
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;
Person person = (Person) o;
if (age != person.age) return false;
return name != null ? name.equals(person.name) : person.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Ta klasa jest zwyczajna — tylko 2 pola (w końcu czasami jest ich więcej niż 10-15). Oczywiście wszystko to można wygenerować w IDE. Ale do cholery, to zajmuje swoje miejsce. Jeśli jest 15-20 pól, każde z nich potrzebuje getterów, setterów, konstruktorów... Spośród nich wszystkich kilka innych, niewidocznych dla oka metod, może łatwo zostać utracone. Jak pomóc temu programiście pisać szybciej i mniej? Lombok. Z patelni i w ogień z tobą. Oto ta sama klasa, ale teraz używamy Lomboka:
package lombok;
@Data
public class Person {
private String name;
private int age;
}
To wszystko. Fajne hę? Do czego służy adnotacja @Data ? Podczas kompilacji ta adnotacja generuje elementy pobierające/ustawiające dla wszystkich pól i zastępuje funkcje toString(), równości() i hashCode() zgodnie ze standardowymi regułami. Możesz zainstalować wtyczkę w IDE. Zobaczy wszelkie metody, które nie zostały jeszcze utworzone. W tym miejscu mam nadzieję, że zainteresowałeś się tym, mój czytelniku, ponieważ poniżej będzie krótkie wprowadzenie z linkami do szczegółów. Lombok pozwala także dostosować generowanie kodu, np. nie zawsze są potrzebne wszystkie moduły pobierające i ustawiające lub możesz potrzebować innego algorytmu do wygenerowania kodu skrótu. Aby to osiągnąć, istnieją osobne adnotacje (myślę, że wiele z nich nie będzie wymagało opisu): @Getter/@Setter, @ToString, @EqualsAndHashCode, @NoArgsConstructor, @RequiredArgsConstructor i @AllArgsConstructor, @Log Są to najbardziej wspólny. Cały zestaw można zobaczyć tutaj
. Zwróć szczególną uwagę na var i val. Oznacza to, że możesz napisać taki kod:
package lombok;
import lombok.experimental.var;
@Data
public class Person {
private String name;
private int age;
public static void main(String[] args) {
var person = new Person();
person.setAge(22);
System.out.println(person);
}
}
Dlaczego jest to konieczne? Na przykład mamy klasę RandomAccessFileChannel. Dlaczego mielibyśmy chcieć pisać taki kod?
RandomAccessFileChannel channel = new RandomAccessFileChannel();
Jeśli możemy to zrobić?
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();
Wtedy jest mniej więcej jasne, z czym pracujemy. Jeśli wywołanie wygląda tak:
var listSetMap = evilMap();
wtedy tylko diabeł wie, co zwróci tam złaMap() i dopóki nie spojrzysz na samą metodę, nie wiesz. Po co biegać po plikach źródłowych? Ogólnie rzecz biorąc, trzeba z tym uważać. Oddział eksperymentalny: Tutaj chcę wspomnieć o adnotacji @UtilityClass . Tworzy prywatnego konstruktora, który zgłasza wyjątek (więc brudne małe rączki nie używają refleksji, aby się tam wtrącać). I jest to bardzo piękne na początku zajęć — mówi nam, że istnieją metody użytkowe. Adnotacja @Delegate implementuje wzorzec delegowania. Załóżmy, że masz klasę, która deleguje coś innej klasie i wprowadzasz zmiany tylko w niektórych metodach — ta adnotacja uchroni Cię przed duplikowaniem metod i będzie je śledzić. Jeśli usuniesz lub dodasz metodę, ta adnotacja zostanie zauważona. Oddział adnotacji eksperymentalnych
GitHub
Oficjalna strona
Aby IDE poprawnie współpracowało z lombokiem i nie wyróżniało metod jako nieistniejących, należy zainstalować wtyczkę. Oficjalna strona internetowa zawiera sekcję konfiguracji
, 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 używa lomboka w swoich klasach. Jeśli masz w swoim projekcie Springa, spójrz – mógł pobrać lombok bez Twojej wiedzy.
GO TO FULL VERSION