Dlaczego Lombok jest zły?

Wątek przeniesiony 2022-12-19 17:38 z Java przez Riddle.

PP
  • Rejestracja:ponad 2 lata
  • Ostatnio:ponad 2 lata
  • Postów:1
0

Hej
W tutorialu, z które aktualnie się uczę jest stosowany Lombok, pozwala on zlikwidować część powtarzalnego kodu.
Spotkałem się z wieloma opiniami, że jednak lepiej z niego nie korzystać. Chciałbym poznać Wasze doświadczenia z tym projektem i opinie nt. tego, czy powinno się tym w ogóle interesować w 2022 roku.

RequiredNickname
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 minuty
  • Postów:614
2

Wszystko jest dla ludzi.
Lombok skomplikowany nie jest a i tak często ludzie nie potrafią z niego korzystać (przepisują na pałę adnotacje które się np. pokrywają).
Ja w projekcie lomboka mam, działa, jeszcze nie sprawiał problemów.

KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:6 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
6

To nie Lombok jest zły. To Java jest zła, bo rozwlekła. Lombok próbuje zrobić z Javy zwięzły język, ale dalej wygląda to jak potwórek, czyli więcej adnotacji niż kodu. A można wziąć Kotlina lub Scalę i mieć w standardzie języka to co daje Lombok i dużo więcej


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
2

@programista60kPLN:

"Naprawia" te cechy Javy, które są zużyte przez czas. Projektując w pierwszej połowie lat 199x tak się to widziało, ale czas leci do przodu - a świat javowski założył 100% kompatybilności ze starymi wersjami.
Jak jako student/absolwent sprzedawałem swojego fiata 126p, wielką zaletą dla nabywcy był cały bagażnik części zapasowych, pompek, rurek, drutów itd To był taki lombook

Właściwie to samo daje dobre IDE - choć w inny sposób, dłuższy, choć nie klepany palcem, kod siedzi w sursach: generowanie konstruktorów, toString'a itd Kod dłuższy, ale np da się postawić breakpoint. Osobiście wolę.

jesli pytasz na zasadzie samorozwoju: zmienić język, zainteresować się Kotlinem.
jesli korporacyjnej konieczności - nie dyskutuję z tym, mus to mus.


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
edytowany 1x, ostatnio: ZrobieDobrze
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
0
KamilAdam napisał(a):

To Java jest zła, bo rozwlekła.

Nie tylko w bezwzględnej długości kodu problem, to bym wybaczył, ale w zingnorowaniu istotnych potrzeb. *)

Np nigdy nie wyspecyfikowano syntaktycznie wydzielonej property / geterea / setera, i to co mamy to jest "by convention". A to zrobiło sie bardzo ważne przez Java Beany, "bardzo ważną rzecz" mamy by convention.
Libki próbujące z klasy "zgadnąć" strukturę/nazwę property/beanów każda robi to inaczej

Młodszy brat (C#) sie tym zajął i z propertisami jest bardzo dobrze

*) choć nic nie równa się z komitetem standaryzującym C++


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
0

Czy Javę by ratowało (częściowe) zerwanie kompatybilnosci, np po 3 numerkach wersji / 10 latach odesłanie deprecated w kosmos ... może, ale tak nie jest.


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
RA
Pytanie czy warto ją ratować w ten sposób, jeśli jest Kotlin... Dla mnie java sama w sobie powinna być traktowana jako wybór przestarzały i unikana w nowych projektach. Niestety, korporacje tego nie zrozumieją.
KamilAdam
Korporacje to zrozumieją jak przestaną znajdowac chętnych do pisania w Javie. Będzie trwać to długo, bo Java jest za darmo i jest dużo juniorów i Java jest w programie nauczania na studiach
RA
Jest gorzej, bo wielu programistom jest to na rękę. Po co się uczyć, jak można klepać dalej w Javie jak to robili całe swoje zawodowe życie. Sam się z taką postawą spotkałem i było to spotkanie przykre.
ZD
Znalazłem ciekawe wypowiedzi w otoczeniu Jakarty EE - nie głównych apostołów, a jeszcze aktywnych użytkowników. Zmiana namespace była (być mozę ostatnią) okazją do utrącenia staroci, i tego żałują. Ja wróżę jak wprowadzenie unikod w Delphi (znak!=bajt) -> uschnięcie 30-50% projektów
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 15 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10053
2
programista60kPLN napisał(a):

Hej
W tutorialu, z które aktualnie się uczę jest stosowany Lombok, pozwala on zlikwidować część powtarzalnego kodu.
Spotkałem się z wieloma opiniami, że jednak lepiej z niego nie korzystać. Chciałbym poznać Wasze doświadczenia z tym projektem i opinie nt. tego, czy powinno się tym w ogóle interesować w 2022 roku.

Niektórzy programiści są zmuszeni pisać w Javie, bo np pracują nad projektem który jest napisany w Javie, a jednocześnie uważają że Java jest językiem syntax-heavy, to znaczy język w dużej mierze opiera się na składni, dla niektórych za dużej. Nie można sobie pozwolić na przepisanie aplikacji na inny język, więc takim "kompromisem" jest dodanie biblioteki (można powiedzieć "meta-programistycznej") które usuwa część składni i zastępuje je deklaratywnym podejściem.

Ja osobiście uważam, że lombok jest średnim rozwiązaniem, bo jeśli już ktoś chce odejść od składni Javy (która, no zgadzam się, jest dość verbose) to należałoby to zrobić w odpowiedni sposób, tzn wydzielić nowy moduł w projekcie, i nowe funkcjonalności pisać w innym jezyku który się kompiluje do JVM byte-code, np Clojure, Kotlin czy Groovy, które mają już przyjemniejszą składnię. I potem czasowo przechodzić z jednego języka w drugi. W mojej opinii lombok to jest taki "pół-środek", i ja wolałbym albo pisać w Javie bez lomboka, a jeśli składnia byłaby zbyt rozwkleła to przemigrowałbym powoli projekt np. na Kotlin.

stivens
Clojure to akurat nie jest alternatywa dla Javy. No bo to Lisp. A groovy to pomylka, o czym sam autor wspominal ;)
elwis
@stivens: No jak Lisp to tylko tym lepiej. xD A tak na serio, kwestia gustu, rozumiem, że większość kodujących w Javie miało by duży problem z Lispem.
Korges
  • Rejestracja:prawie 5 lat
  • Ostatnio:21 minut
  • Postów:552
5

Największym problemem lomboka dla mnie jest to że trzeba pamiętać która adnotacja co robi.
Poprawne wykorzystanie nie jest takie oczywiste.
W nowym projekcie zacząłem czasami korzystać z rekordów i póki co się sprawdzają.

edytowany 1x, ostatnio: Korges
RequiredNickname
Rekordy zastępują lombokowe @Value a możliwości jest o wiele więcej
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:6 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
2
Riddle napisał(a):

Ja osobiście uważam, że lombok jest średnim rozwiązaniem, bo jeśli już ktoś chce odejść od składni Javy (która, no zgadzam się, jest dość verbose) to należałoby to zrobić w odpowiedni sposób, tzn wydzielić nowy moduł w projekcie, i nowe funkcjonalności pisać w innym jezyku który się kompiluje do JVM byte-code, np Clojure, Kotlin czy Groovy, które mają już przyjemniejszą składnię

Ale wcale nie trzeba robić takich kombinacji. Bez problemu można zrobić konfigurację gdzie część klas jest napisana w Javie a część już po nowemu w Kotlinie/Scali


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
Riddle
No tak, jeśli się używa np Gradle to można to też zrobić w jednym module. Jak kto woli.
W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 godziny
  • Postów:3539
3

To ja pójdę w inną stronę. Lombok jest dla mnie nieproduktywny, a wynika to z arytmetyki pracy.

  1. Lombok zdejmuje z programisty pisanie boilerplate'u, to prawda. Czyli zysk jest jednorazowy.
  2. Natomiast późniejsza praca z kodem robi się problematyczna. Chcesz zapiąć się debugiem w setterze? No to musisz zmienić kod, lub wyłączyć kompilację przy uruchomieniu debugu. I jedno, i drugie jest uciążliwe. No i jest kwestia jakości pluginów do Lomboka - nie wiem, jak dzisiaj ale swego czasu nie dało się znaleźć wywołania np. lombokowego gettera w Idei.
  3. Kolejna rzecz to to, że Lombok jest jak granatnik na komendzie policji. Niby taka fajna i niegroźna zabawka, ale wystarczy nacisnąć nie tam, gdzie trzeba.

Według mnie pkt. 2 i 3 przeważają nad pkt. 1. Jeśli chcesz pisać w fajniejszym języku to korzystaj z Kotlina.

Zobacz pozostałe 4 komentarze
ZD
Ale w immutable pewnie bym mocno trapował konstruktor ;)
KamilAdam
trapować? jakaś nowa odmiana trolowania?
ZD
trap - pułpka. W sumie mogłe powiedzieć breakpint. Nie pamietam z którego ekosystemu mam to słowo
W0
@KamilAdam: jeśli chodzi o Kotlina to Kotlin przychodzi z całym dobrodziejstwem inwentarza, tj. posiada wystarczająco dużo feature'ów, żeby można było "wybaczyć" to, że okazjonalnie trzeba dopisać customowego settera. W przypadku Lomboka zysk z jego korzystania jest bardzo nikły (bo większość feature'ów ogarnia generacja kodu w IDE), więc wystarczą dwa-trzy takie przypadki i jesteś już na minusie z czasem.
L0
@KamilAdam: w Kotlinie jak najbardziej można postawić breakpointa dla zwykłego settera/gettera
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:9 minut
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4706
12

Lombok - to taki język programowania który używasz, gdy już wiesz, że java w pisaniu typowego kodu "enterprajs*" strasznie obsysa, ale głupio Ci się do tego przyznać,
bo wszystkim mówiłeś jaka ta java super. Do tego jesteś seniorem javy z co najmniej 3 miesiącami doświadczenia, głupio zaczynać ścieżkę kariery od nowa.

Lombok to nie jest java, bo:
a) javac tego nie kompiluje,
b) wymaga plugina do gradle/maven (tak jak każdy inny język),
c) wymaga plugina do IDE (tak jak każdy inny język),
d) trzeba się go nauczyć (jak każdego innego języka)

Lombok jest co najwyżej javopodobny.

Lombok mocno różni się od innych generatorów kodu, dlatego że podmienia klasy "in place" (dla wnikliwych: warto sprawdzić(!!!) - bo dokładnie to już nie pamiętam, co dokładnie robi, ale nie robi tego normalnie (i sorry, nie chce mi się teraz tego nawet czytać)). W przypadku innych generatorów (swagger itp.) odpalamy goal w mavenie/gradle i klasy (lub nawet źródła) lądują w target/generated_classes czy tam target/generated_sources - więc nadal radzi sobie z tym normalny javac/IDE.
Ten magiczny sposób działania powoduje czasem mocne bóle głowy, ale przede wszystkim powoduje, że kod, który piszemy nie jest kodem w javie, bo nie da się zrobić tak, żeby się kod kompilował w jakimkolwiek momencie.

Kod z lombokiem jest po prostu brzydki: mamy tony adnotacji przed każdą klasą, zwykle 3/4 z nich zupełnie niepotrzebna, na zapas, śmiecą. Trudno to posprzątać, bo trzeba by regularnie sprawdzać czy nadal jakaś adnotacja jest potrzebna (dla całego kodu - powodzenia).

2 razy miałem poważne problemy ze zlomboczonym kodem przy migrowaniu na nową wersję javy (niestety nie pamiętam co to było, ale kojarzę, że bolało, i że głownym problemem był ten magiczny sposób działania).

Zamiast babrać się w lomboka lepiej jest poświęcić ten czas na opanowanie normalnego języka programowania - najbliżej Kotlin lub Scala, będzie wszystko to co w lomboku, plus wiele innych przydatnych cech, a najważniejsze, że kod nie będzie tak obrzydliwy. Pomijająć już to, że składnia nowszych języków jest prostsza i bardziej logiczna od składni Javy.

* Enterprajs = (prosta logika biznesowa, bazy danych, integracja systemów, resty)


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 3x, ostatnio: jarekr000000
IH
Scala to agonalny projekt. Kotlin jeszcze jakoś oddycha wynurzając się nosem nad taflę wody - Android. IMO ani tego, ani tego nie opłaca się już ogarniać - nie znam projektów młodszych niż 2lata, które powstały na tych językach. A czego warto się uczyć? Nie mam pojęcia. Wiem, że firmy nie chcą chętnie odchodzić od Javy.
jarekr000000
@IHaveHandedInMyResignation: znawcy to zawsze miło posłuchać
IH
Dziękuję. Jeszcze wyprostuję wypowiedź: na horyzoncie nie widać alternatyw dla javy, które mogą podbić serca zarówno programistów jak i inwestorów.
KE
  • Rejestracja:około 6 lat
  • Ostatnio:około 4 godziny
  • Postów:661
0

Możliwe że to zależy od projektu albo domeny biznesowej. Pracowałem w projekcie, który był gigantycznym CRUD-em (kilkadziesiąt kontrolerów, totalne spaghetti) i tam Lombok, JPA, adnotacje na encjach, domyślna serializacja DTO -> JSON, wyciekanie modelu danych na front i wszystkie tego typu hejtowane "antypatterny" znakomicie usprawniały pracę, trzeba było tylko mieć trochę oleju w głowie i wiedzieć jak to działa pod spodem, jak i liczyć się z ewentualnymi konsekwencjami, które były minimalne - głównie coupling frontend-backend.

jarekr000000
trzeba było tylko mieć trochę oleju w głowie i wiedzieć jak to działa pod spodem, praktycznie definicja frameworka typu pole minowe, unikać w miarę możliwości
IV
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 miesiące
  • Postów:30
1

Miałem pewną programistyczną podróż podczas której inaczej spojrzałem na lomboka.
Wcześniej pracowałem w projektach w technologii Java EE, czyli często i gęsto używanie EJB i JPA. EJB wymagają domyślnego bezparametrowego konstruktora, beany są "stateless", więc te klasy miały tylko pola wstrzykiwane, brak "setterów" i "getterów". JPA też wymagają bezparametrowego konstruktora, "gettery" i "settery" każde IDE jest w stanie wygenerować, a nadpisywanie "equals" oraz "hashCode" w encjach JPA uważam za zło. Lombok w takim projekcie nie dawałby wielu korzyści, wręcz zacząłby przeszkadzać. Wtedy uważałem, że należy go unikać.
Następnie przerzuciłem się na projekty w technologii Spring. Jeśli encje bazodanowe pisało się w technologii innej niż JPA/Hibernate to można było pisać klasy niemutowalne, pola finalne, builder pattern łatwo wpasowywał się tutaj, a beany czy jak kto tam woli komponenty pozwalały na wstrzykiwanie poprzez konstruktor. Próbowałem bronić się przed tym ale lombok tutaj zaczął ułatwiać.
Nadal nie podoba mi się w jaki sposób działa lombok, że to nie jest generator kodu tylko manipulator bytecode'u, że jest tak powszechnie używany przez osoby, które nie rozróżniają tożsamości od równości obiektów. Użycie jednej adnotacji @Data zamiast dwóch @Setter i @Getter bardzo dużo zmienia.
Wydaje mi się, że odpowiedź na pytanie zadane w temacie wątku jest taka: to zależy co umiesz i z kim pracujesz. Ja już mam postanowienie na nowy rok i planuję zacząć pracować w języku, który nie wymaga protez typu lombok.

Zobacz pozostałe 3 komentarze
IV
@RequiredNickname: Jeśli nigdy nie uaktualniasz pól na encji, nigdy nie robisz update do bazy danych to spoko, ID rozróżnia encję jednoznacznie, ale jak zaczynasz uaktualniać jakieś pole to jak rozróżnić encję sprzed od tej po aktualizacji? Po innym polu? Ale przecież encjaPrzed.equals(encjaPo) == true. Dla mnie to niespójna logika. Osobiście nadpisuję equals i hashCode wtedy i tylko wtedy, kiedy wszystkie pola w klasie są final.
RequiredNickname
@ivo: być może mam skrzywienie bo przygodę z javą zacząłem od jpa i hibernate'a ale w kontekście encji zarządzanej przez jpa właśnie chciałbym uniknąć sytuacji gdy ta sama encja (przed i po zmianie jakiegoś pola, zakładając że nie działa dirty checking i zmiany nie są od razu propagowane w db) w dwóch stanach jest rozpoznawana jednak jako dwie różne rzeczy. Kuba Kubryński kiedyś o tym mówił: https://youtu.be/UPWkpl5PL_w?t=1923
RequiredNickname
Z tym, że final na polach w encji w rozumieniu jpa/hibernate to raczej nie jest coś co dobrze ze sobą smakuje ;)
IV
@RequiredNickname: Tak jak napisałem, nadpisuję equals i hashCode wtedy i tylko wtedy, kiedy mam wszystkie pola typu final, a skoro w jpa tego nie da się zrobić to w jpa tego nie robię. Nadal spełniam swoją zasadę. Poza tym w tym filmiku co podesłałeś to jest opisywany problem jak nadpisać equals i hashCode w encji jpa, a nie to czy jest w ogóle sens robienia tego. Ja uważam, że nie ma sensu, bo hibernate w tej samej transakcji dla podanego identyfikatora zwraca dokładnie tę samą instancję obiektu. Więc po co robić jakiś wewnętrzny identyfikator uuid?
RequiredNickname
@ivo: Przecież Kuba wyjaśnił tam po co: hibernate i jego zarządzanie encjami to jedno ale operowanie np. na kolekcjach bazujących na tych metodach to drugie ;)
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Postów:3277
1

Dla mnie, największe wady to:

  • Nie wiadomo jak działa, nie wiadomo dlaczego działa, nie wiadomo kiedy przestanie działać. Może już poprawili implementację, ale właśnie z działaniem były problemy w przeszłości.
  • Nieczytelność. Jakaś adnotacja w nagłówku klasy decyduje o tym, czy zmienna prywatna będzie widoczna, lub niewidoczna na zewnątrz.
  • Jakaś inna adnotacja powoduje, że będzie wygenerowany equals i hashcode...
  • Mocno randomowa funkcjonalność i mnogość adnotacji. Dlaczego akurat te, a nie inne? Nikt nie wie.
  • Wynalazki w stylu @SneakyThrows...
  • Ogólnie, to narzędzie jest jak typowy Scrum Master - tworzy więcej problemów niż rozwiązuje. A te, które rozwiązuje są nie tyle tymi problemami, które naprawdę przeszkadzają, ale tymi, które dało się rozwiązać.
FA
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:13
2

Dla mnie największe wady to używanie tego w klasach które są encjami bazodanowymi.

G8
  • Rejestracja:około 3 lata
  • Ostatnio:około rok
  • Postów:2000
0

Google chyba też nie lubi Lomboka, bo pomimo tego że jest dostarczany z InteliJ, to z Android Studio wyleciał już dawno. .

piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Postów:3277
2

@gajusz800: Nie wiem, czy Google nie lubi, czy lubi Lombok'a. W Androidzie, od lat podstawowym językiem jest Kotlin, w którym stosowanie protez w rodzaju Lomboka nie ma żadnego sensu. Jedyną zaletą tego narzędzia, jest mniej znaków w kodzie źródłowym. Samo-generujący się konstruktor, czy metody dostępowe oczywiście są jakimś tam ułatwieniem, ale to nie te dodatkowe metody na poziomie POJO są prawdziwym problemem podczas pisania oprogramowania. Zresztą, nawet jeżeli, nie wiem co tu porównywać..
Kotlin:

Kopiuj
class Person(val name:String, val lastName:String, val yearOfBirth:Int? = null)

Lombokowana Java:

Kopiuj
import lombok...
import lombok...
import lombok...
import lombok...

@Getter
@RequiredArgsConstructor
@AllArgsConstructor
public class Person{
  @NonNull
  private final String name;
  @NonNull
  private final String lastName;
  private final int yearOfBirth;
 
}

I "pure"Java

Kopiuj
public class Person{
  private final String name;
  private final String lastName;
  private final int yearOfBirth;

  public Person(String name, String lastName, int yearOfBirth){
    if(name == null || lastName == null){
      throw new NullPointerException("name and lastName cannot be null")
    }
  //to niżej i tak wygeneruje IDE...
    this.name = name;
    this.lastName = lastName;
    this.yearOfBirth = yearOfBirth;
  }

  public Person(String name, String lastName){
    this(name, lastName, null);
  }
  
  public String getName(){
    return name;
  }

  public String getLastName(){
    return lastName;
  }

  public String getYearOfBirth(){
    return lastName;
  }
}
Zobacz pozostałe 8 komentarzy
piotrpo
Nawet więcej, bo żeby mieć dokładnie to co napisałeś, to trzeba napisać data class Person(val name:String, val lastName:String, val yearOfBirth:Int? = null)
KamilAdam
Co racja to racja. W Scali można pominąć val dla case class case class Person(name:String, lastName:String, yearOfBirth:Option[Int] = None) . A w Kotlinie niestety trzeba pisać dla data class. Bez sensu :D
somekind
No i w Scali też więcej klepania. No cóż, od razu wiedziałem, że wybieram najlepszy język.
jarekr000000
W scali jak się uprzesz to możesz napisać aż tyle w definicji "rekordu": (String, String, Option[Int]) i też jest spoko.
G8
  • Rejestracja:około 3 lata
  • Ostatnio:około rok
  • Postów:2000
0

Wiem, że podstawowym językiem jest Kotlin, ale Lombok został usunięty chyba jeszcze zanim to się zmieniło. Poza tym, nie zapominajmy że Java dalej jest obsługiwana i nigdzie się nie wybiera.

piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Postów:3277
2

Ale przecież to tylko plugin w IDE. Jak ktoś bardzo potrzebuje, to może sobie go dociągnąć. Wciąż pozostaje pytanie, dlaczego miałbym decydować się na Lomboka w Androidzie, skoro, nawet w projekcie z Javą mogę sobie zamiast adnotacyjnego łamańca wstawić klasę w Kotlinie?

G8
  • Rejestracja:około 3 lata
  • Ostatnio:około rok
  • Postów:2000
1

Ja z tobą nie polemizuję, tylko stwierdzam fakt, że ten plugin wyleciał z Android Studio, a InteliJ ma go w standardzie, jako wbudowany.

S9
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
1
piotrpo napisał(a):

@gajusz800: Nie wiem, czy Google nie lubi, czy lubi Lombok'a. W Androidzie, od lat podstawowym językiem jest Kotlin, w którym stosowanie protez w rodzaju Lomboka nie ma żadnego sensu. Jedyną zaletą tego narzędzia, jest mniej znaków w kodzie źródłowym. Samo-generujący się konstruktor, czy metody dostępowe oczywiście są jakimś tam ułatwieniem, ale to nie te dodatkowe metody na poziomie POJO są prawdziwym problemem podczas pisania oprogramowania. Zresztą, nawet jeżeli, nie wiem co tu porównywać..
Kotlin:

Kopiuj
class Person(val name:String, val lastName:String, val yearOfBirth:Int? = null)

Lombokowana Java:

Kopiuj
import lombok...
import lombok...
import lombok...
import lombok...

@Getter
@RequiredArgsConstructor
@AllArgsConstructor
public class Person{
  @NonNull
  private final String name;
  @NonNull
  private final String lastName;
  private final int yearOfBirth;
 
}

I "pure"Java

Kopiuj
public class Person{
  private final String name;
  private final String lastName;
  private final int yearOfBirth;

  public Person(String name, String lastName, int yearOfBirth){
    if(name == null || lastName == null){
      throw new NullPointerException("name and lastName cannot be null")
    }
  //to niżej i tak wygeneruje IDE...
    this.name = name;
    this.lastName = lastName;
    this.yearOfBirth = yearOfBirth;
  }

  public Person(String name, String lastName){
    this(name, lastName, null);
  }
  
  public String getName(){
    return name;
  }

  public String getLastName(){
    return lastName;
  }

  public String getYearOfBirth(){
    return lastName;
  }
}

Nie mam co porównywać:

Kopiuj
public record Person(String name, String lastName, OptionalInt yearOfBirth) {
  Person(String name, String lastName, OptonalInt.empty());
}

A Java 14 wyszła w marcu 2020 roku.


Zobacz pozostałe 6 komentarzy
somekind
No właśnie jeszcze nie.
S9
Int to typ prymitywny stąd OptionalInt. Dla zmiennych referencyjnych są po prostu Optionale. Głupie, ale są prowadzone prace nad tym w projekcie Valhalla
KamilAdam
Tak @somekind, to kolejny nierozwiązany problem Javy
somekind
Dzięki @scibi_92, @KamilAdam. Na Was zawsze można liczyć w kwestii zrozumienia Javy. Jesteście lepsi nawet niż alkohol, bo on jednak w tym nie pomaga.
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Postów:3277
2
scibi_92 napisał(a):

A Java 14 wyszła w marcu 2020 roku.

No dobra, to skoro Java taka zajefajna, zwięzła i już ponad 2 lata ma 14'ka, to dlaczego dorzuca się do niej Lomboka? Może dlatego, że pierwsza wersja LTS która zawiera records pokazała się ledwo kilka miesięcy temu, a spora część javowego świata wciąż siedzi w 8.

KE
I długo długo posiedzi.
G8
  • Rejestracja:około 3 lata
  • Ostatnio:około rok
  • Postów:2000
2

Może pewnego dnia Java dorobi się named perameters, wymaganych lub nie? I nie będzie tych builderów paskudnych? Lub adnotacji @Builder w Lombok. Do OptionalInt zamiast Optional<int> w Javie można się czepiać, ale tak samo można się czepiać że w C# nie ma string? i string (chyba że już jest, nie jestem na czasie). I czemu w C# przypisanie nulla do zmiennej non nullable to warning dopiero przy kompilacji? To powinno IDE podkreślić od razu na czerwono i nie powinno się to skompilować nawet.

edytowany 1x, ostatnio: gajusz800
S9
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
0

No dobra, to skoro Java taka zajefajna, zwięzła

Literalnie nigdy nie napisałem że Java jest zwięzła. :) Po prostu odniosłem się do tego co napisałeś. Jak już Jave krytykujemy (a co jest chyba najczęstszym hobby użytkowników tego forum) to piszmy zgodnie z rzeczywistością :)
Znaczna część problemów której zarzucano Javie odeszła niedawno lub w niedalakiej przyszłosci zostanie odłożona do lamusa.

to dlaczego dorzuca się do niej Lomboka?

Mnie o to nie pytaj. Ja bym nie dorzucał ;]

a spora część javowego świata wciąż siedzi w 8.

Zapewne tak. Ja obecnie pisze nowy serwis i nie jest to Java 8. Myślę że mimo wszystko łatwiej znaleźć prace na backendzie w Javie 17+ niż z Kotlinem.


edytowany 1x, ostatnio: scibi_92
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:6 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
0

Myślę że mimo wszystko łatwiej znaleźć prace na backendzie w Javie 17+ niż z Kotlinem

Twoje myśli to nie dowód :P a ja zna kogoś kto na backendzie pisał projekt w Kotlinie. I znam kogoś kto na backendzie pisał projekt w Scali. Jak znajdziesz kogoś kto pisał na backendzie projekt w Javie 17+ to daj znać :D

UPDATE a teraz będę wrednym człowiekiem i powiem

Kopiuj
class Person(var name:String, var lastName:String, var yearOfBirth:Option[Int] = None)

XD
Jak z jakiegoś chorego powodu chcesz mutowalne obiekty to rekordy w Javie nie pomogą, co nie? XD


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 2x, ostatnio: KamilAdam
AS
Cześć. Ja piszę nowiutki serwis w Javie 17. Jakbym o tym decydował, to wybrałbym Kotlina, ale jest jak jest.
S9
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
0

Jak znajdziesz kogoś kto pisał na backendzie projekt w Javie 17+ to daj znać :

Daję

Twoje myśli to nie dowód :P

Moje myślenie jest oparte o znajomośc rynku i ofert. Sam kiedyś chcialem przejsc na Kotlina, teraz za bardzo już nie odczuwam takiej potrzeby

Jak z jakiegoś chorego powodu chcesz mutowalne obiekty to rekordy w Javie nie pomogą, co nie? XD

Nie.


piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Postów:3277
1

Ale ten temat to roast Lomboka, a nie Javy.

Porównanie ze "starą" Javą i Kotlinem zrobiłem bo:

  • W nowej Javie Lombok ma jeszcze mniej sensu
  • Wprowadzenie w Javie 8 Lomboka/Kotlina jest znacznie prostsze niż przejście na Javę 19...
  • Wybranie Kotlina jako dodatkowego języka w projekcie J8 nie jest trudniejsze niż wprowadzenie lomboka.
KE
"nie jest trudniejsze niż wprowadzenie lomboka" jeśli mówimy o samym technicznym aspekcie, to jak najbardziej prawda, ale obawiam się że w korpo silnie zabetonowanym na Javę byłoby to problematyczne, zwłaszcza jeśli chodzi o kompetencje zespołów i cały tooling naokoło. W przypadku Lomboka to jest jedna zależność do Mavena i darmowy plugin do IDE.
piotrpo
@kelog: Trochę to trwało, ale się da. Oczywiście cała analiza statyczna kodu i inne narzędzia do generowania wykresów są pewnym problemem, jeszcze się z nim pewnie zmierzę. Na razie mam przygotowaną odpowiedź "o jej, sorki".
AS
  • Rejestracja:prawie 4 lata
  • Ostatnio:około 23 godziny
  • Postów:344
0

Kotlin/Scala > Java 17 + Lombok > Java 17 > Java 8 + Lombok > Java 8 > Groovy > Java 7

Czyli cała dyskusji rozchodzi się o learning curve i zdolność organizacji do zaakceptowania nowinek.

Learning curve dla Lomboka jest bardzo mały - dużo mniejszy niż np dla takiego MapStruct. Annotacje wyglądają paskudnie, ale zawsze to lepiej niż pisać ręcznie equals dla klas.

Ja jeszcze dodam, że @Slf4j rozwiązuje bikeshedding o to, jak nazywać to coś LOG, LOGGER, log, czy logger, i czy powinna to być pierwsza deklaracja static.

S9
xDDDDDDDDDDD
RA
  • Rejestracja:ponad 7 lat
  • Ostatnio:30 minut
  • Postów:8
1

Generalnie to mocno nie szanuję firm które w 22 piszą nowe projekty w Javie a nie Kotlinie. Świadczy to o jakimś strachu przed technologią i niechęci ich pracowników do nauki.

Zobacz pozostałe 16 komentarzy
RequiredNickname
@jarekr000000: tylko czy to aby na pewno takie "kilka dni"? Może moje możliwości percepcji są słabe ale nie pokusiłbym się o stwierdzenie że w ciągu kilku dni nauczę się tak samo dogłębnie kotlina i jego tooli co javy i spółki. Do tego jak popełnię błąd na ktory nikt w zespole nie zwróci uwagi (bo nikt nie zna tego stosu) to potencjalnie stracę czas na poprawki itp.
RequiredNickname
Inna sprawa jaki masz zespol: młodych zapaleńców klepiących własne projekty na boku by te toole poznać czy gości posiadających rodziny którzy na "rozwoj" mogą poświęcić zdecydowanie mniej czasu itp ;) nie jest to czarnobiałe;)
jarekr000000
Ja już przeszedłem migracje na kotlin w swoich zespołach, i widziałem jak to się odbywało w innych firmach. Praktycznie bezbolesna przesiadka dla programistów. Z dnia na dzień. Jedyne co zajmuje czas to konfiguracja Ci/sonar itp. Przy czym kilka dni to było kilka lat temu.
jarekr000000
Oczywiscie nikt nie zostaje masterem kotlina z godziny na godzinr. Przez kilka tygodni pisze sie po prostu w better java.
jarekr000000
Jedyni niezadowoleni to architekci, ale trudno się im dziwić ledwo co nauczyli się optionala, nie zdązyli jeszcze skończyć psioczyć na streamy, połowe czasu pošwięcają na pisanie dyrdymałów dlaczego var i nowe wersje javy to pomyłka, więc miejsca na nauke kotlina ni ma.
AS
  • Rejestracja:prawie 4 lata
  • Ostatnio:około 23 godziny
  • Postów:344
2
Rakieta napisał(a):

Generalnie to mocno nie szanuję firm które w 22 piszą nowe projekty w Javie a nie Kotlinie. Świadczy to o jakimś strachu przed technologią i niechęci ich pracowników do nauki.

W sumie to ja też nie szanuję zasiedzianych seniorów u mojego obecnego pracodawcy :) Nie podnosiłem tematu Kotlina, bo już całą moją reputację zużyłem na takie pierdoły jak Lombok.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)