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:
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;
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.
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.
GO TO FULL VERSION