Jak nie usunę tej lombokomi to chce lobotomii.

Jak nie usunę tej lombokomi to chce lobotomii.

Wątek przeniesiony 2020-12-11 15:16 z Inżynieria oprogramowania przez cerrato.

DKN
  • Rejestracja:ponad 4 lata
  • Ostatnio:7 miesięcy
  • Postów:128
0

Mam projekt w Javie, który ma wszędzie napchane lomboka, 2 osoby, ktore go ogarnialy poszly, zostalem tam wrzucony. Chce się go pozbyć, czy da sie to zrobić jakoś z głową?
Jest jakiś plugin do którego mozna miec zaufanie i który mi to pozamienia w kod?


Z każdym dniem czuje się głupszym programista.
AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 17 godzin
  • Postów:3561
0

Idea ma delombokizację,
Lub z linii komendy (jest udokumentowane)
https://projectlombok.org/features/all
szukaj delombok


Bo C to najlepszy język, każdy uczeń ci to powie
99xmarcin
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 miesiące
  • Postów:2420
2

Tylko się zastanów czy naprawdę tego chcesz. Jeżeli działa i nie sprawia problemów to nie ma co sobie na siłę życia utrudniać. Przy odrobinie szczęścia nie będziesz musiał robić upgrade'u Javy (co zazwyczaj psuje lomboka) więc prawdziwe kłopoty Ciebie ominą...

Radzę zainstanować sobię wtyczkę Lombokową w IDE.


Holy sh*t, with every month serenityos.org gets better & better...
DKN
"Jeżeli działa i nie sprawia problemów to nie ma co sobie na siłę życia utrudniać", własnie problemem jest to, że za dużo parametryzowanych adnotacji.Przeciwnikiem uzywania tego nie jestem, ale bez przesady..
Schadoow
  • Rejestracja:około 13 lat
  • Ostatnio:około 6 godzin
  • Postów:1064
0

Pytanie czy tutaj nie ogarniasz lomboka czy innych frameworków/bibliotek które masz dodane a które korzystają z wygenerowanego kodu.

Sama delomobkizacja nic nie da bo lombok to tylko cukier syntaktyczny jak nie lubie adnotacji to w przypadku lomboka nie ma tam żadnej magii. Poza tym po delombokizacji powstanie tona kodu.

DKN
cukier syntaktyczny ma na celu posłodzić, tak 2 łyżeczki a nie poł kilo na filiżankę.
Schadoow
@DKN: Masz jakiś przykład takiego zestawu adnotacji który cie najbardziej zdenerwował ?
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4706
3

No nie wiem - faktycznie jak na javę adnotacje to te lombokowe są wyjątkowo mało popaprane (bo są aplikowane w czasie buildu/kompilacji).
Tym niemniej, taki ostro zlombokowany kod potrafi wypalać oczy. Byłem w takim projekcie kiedyś - w ciągu kilku dni stałem się wojującym alombokistą.
Kod był taki, że ciężko było dostrzeć cos poza adnotacjami (oprócz lomboka, była też cała reszta śmietanki).


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
baant
  • Rejestracja:około 11 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Wrocław
  • Postów:524
0

Delombok robi paskudnie napisane equals/hashcody, zwróć se na to uwage, jeśli użyjesz

DKN
  • Rejestracja:ponad 4 lata
  • Ostatnio:7 miesięcy
  • Postów:128
1

@jarekr000000: Wlaśnie o to chodzi, moim zdaniem z prostych rzeczy powstał over engineering z adnotacjami, Napchane jest tego tyle, że hej.
Czasem trafi sie jakaś fajna adnotacja, to można uzyć, ale generować z tego wszystko to przesada.


Z każdym dniem czuje się głupszym programista.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10053
2

Usuń niepotrzebne adnotacje lombokowe, a potrzebne zostaw.

Np RequiredArgsConstructor pewnie mógłby zostać, ale wszystkie @data, @Getter @EqualsAndHashCode @ToString, jak nie używane to wywal.

Shalom
Obawiam się że ciężko stwierdzić czy @EqualsAndHashCode albo @ToString są używane czy nie ;)
Riddle
@Shalom: Niby tak; ale autor wątku jest przekonany że 95% adnotacji jest zbędne. Więc niech zrobi i się przekona czy faktycznie są zbędne czy nie.
W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 3 godziny
  • Postów:3539
2

Pozerzy z was. Ja nienawidziłem Lomboka zanim to było modne.

Tak już trochę na serio - Lombok to świetny przykład na to, jak działa moda w programowaniu. Kiedyś wszędzie można było znaleźć artykuły o tym, jaki Lombok nie jest wspaniały. Teraz kiedy widzę w końcu Lomboka w bankach inwestycyjnych to Lombok powoli odchodzi w odstawkę. Zobaczymy, czy teoria się potwierdzi przy okazji Kotlina.

TheLearner
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Krypton
  • Postów:298
0

Tylko czy to nie jest tak, że Loombook zawiódł grupę zawodową produkcyjnych programistów, a ludzie piszący dla siebie odnajdują w nim faktycznie ukrócenie kodu? Bo czasami mam takie wrażenie czytając takowe (jak i nie takowe) tematy o nim.


jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4706
3

Jak dla mnie Lombok to rozwiązanie dla ludzi, którzy już odkryli, że java to jednak bieda z nędzą (w danym zastosowaniu), ale boją się do tego przyznać i kombinują jak tu użyć innego języka, tak, żeby nie mówić, że to jednak inny język.

Lombok to nie jest java. To inny język: taki bieda kotlin o składni przypominającej kupę.
A co do mody zgadzam się. Sam kiedyś byłem prolombokowcem - też byłem na tym etapie, że bałem się przyznać, że już mi java nie pasuje.


jeden i pół terabajta powinno wystarczyć każdemu
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10053
5
jarekr000000 napisał(a):

Jak dla mnie Lombok to rozwiązanie dla ludzi, którzy już odkryli, że java to jednak bieda z nędzą (w danym zastosowaniu), ale boją się do tego przyznać i kombinują jak tu użyć innego języka, tak, żeby nie mówić, że to jednak inny język.

Lombok to nie jest java. To inny język: taki bieda kotlin o składni przypominającej kupę.
A co do mody zgadzam się. Sam kiedyś byłem prolombokowcem - też byłem na tym etapie, że bałem się przyznać, że już mi java nie pasuje.

"only sith deal in absolutes".

Nie wiem czemu, z jakiegoś powodu większość ludzi się uparła na "100% full lombok" albo "uninstall lombok".

Jeez, żyj i daj żyć. Użyj lomboka tam gdzie jest sens i można (@RequiredArgsConstructor, @Slf4j jak chcesz logi; @SneakyThrows czasem, może @HashCodeAndEquals TAM GDZE TRZEBA), i tyle. Nie wpychaj setterów i getterów na siłe. Nie dopisuj @ToString, żeby było; Nie rób każdego objectu @Data, bo tak.

Słowiem: użyj narzędzia tam gdzie jest sens; nie używaj tam gdzie nie ma. Simple

edytowany 1x, ostatnio: Riddle
jarekr000000
Nie wiem czemu, z jakiegoś powodu większość ludzi się uparła na "100% full lombok" albo "uninstall lombok". - bo umiarkowanie jest dla słabeuszy, którzy nie potrafią podjąć decyzji :P
Schadoow
  • Rejestracja:około 13 lat
  • Ostatnio:około 6 godzin
  • Postów:1064
1

W projektach które używały lomboka zazwyczaj używaliśmy tylko gettery/settery/builder/noargsconstructor/allargsconstructor/requiredargsconstructor i w sumie te elementy mi się podobały a przesadzić można zawsze i ze wszystkim.

99xmarcin
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 miesiące
  • Postów:2420
3

Przy okazji przypomniało mi się holenderskie (a może niemieckie?) przysłowie: Zanim zburzysz mur, upewnij się że wiesz dlaczego go wybudowano ;)


Holy sh*t, with every month serenityos.org gets better & better...
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

Może czegoś nie rozumiem, ale dla mnie Lombok to głównie @Data i jak tylko Java 14 pojawi się w mojej firmie i będzie to miała to co Pascal miał od czasów Gierka ( Pascalowe rekordy), to jestem gotów zapomnieć o Lomboku.

A tak konkretnie co było w Pascalu? to kopiowanie całych struktur bez pisania kodu (lombok @With AFAIK).

Pascal

Kopiuj
    program ideone;
    type
        TRec = record
           num  : Integer;
           st   : String;
        end;
    var
      rec1, rec2: TRec;
    begin
    	rec1.num := 1;
    	rec1.st := 'aaa';
    	rec2 := rec1;
     
    	writeln(rec2.st);
    end.

https://ideone.com/tGV034

Java

Kopiuj
class Rec {
	public int num;
	public String st;
}
 
 
class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		Rec rec1 = new Rec();
		rec1.num = 1;
		rec1.st = "aaa";
 
		//rec2 = ...
 
		System.out.println(rec2.st); // NPE, więcej kodu trzeba!
	}
}

Zresztą porównywanie struktur i toString też jest przydatne.

edytowany 2x, ostatnio: vpiotr
ĆK
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 4 lata
  • Postów:59
0

Nie rozumiem ani hejtu ani jarania się Lombokiem. Generator kodu, jakiś preprocesor. Nic wielkiego. Pracowałem z nim 1.5 roku i nie problemów.
To był ryzykowny bajer w tym temacie https://www.eclipse.org/Xtext/ ale wyszło.

IV
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 miesiące
  • Postów:30
2

Jak nie mam nic do preprocessorów i sam chętnie je używam to z kolei jestem hejterem Lomboka za to w jaki sposób on działa.
Normalny preprocessor (na przykładzie projektu mavenowego) działa tak, że bierze źródła klasy z katalogu src/main/java i wypluwa źródła definicji nowej klasy do target/generated-sources/annotations, zaznaczam, nowej klasy, czyli z nową nazwą klasy.
A Lombok? Bierze źródła klasy z src/main/java i podczas kompilacji dorzuca jakiś bytecode, ponieważ jakby wygenerował kod źródłowy to projekt by się nie skompilował, bo miałby dwie definicje tej samej klasy, jednej w src, a drugiej w target.
Inne preprocessory, np. immutables.org to bierze źródła klasy ValueObject i generuje nowe źródła nowej klasy ImmutableValueObject i jest spoko.
Lombok bierze źródła klasy XYZ i wypluwa bytecode XYZ z dodatkowymi metodami ponieważ w javie nie ma czegoś takiego jak partial class.

jarekr000000
To jest główny powód dlaczego uważam, że lombok to nowy język. Niezgodny z javą. Chociaż, ku mojemu ogromnemu zdziwieniu, akurat magia lomboka rzadko zawodzi.
DKN
@jarekr000000: tak całkiem odsuwając się od tematu. To jakie konsekwencje rodzi używanie 2 stylów programowania? Przecież to same plusy, patrzę, widzę problem, wybieram z 2 możliwych stylów, programowanie funkcyjne od j8 bardzo często nadaje się do praca z listami 10/10. Taki programista javy, musi to umieć robić, ba to poniekąd obowiązek, lombok to dodatek. Tu znowu zasada, by nie przesadzać, jak kogoś poniesie to pol aplikacji może zrobić na funkcyjnym..
jarekr000000
@DKN nie wiem o co chodzi z tymi dwoma stylami. Jakimi stylami?
DKN
@jarekr000000: paradygmat obiektowy vs funkcyjny, Napisałeś, ze lombok nie jest zgodny z Java. Odpowiedzialem, ze to jeszcze ma swoje plusy. Porównałem to do sytuacji z dodaniem programowania funkcyjnego do Javy 8, oraz określiłem to mianem stylu. Tak wiec, możliwość wyboru spośród dwóch styli może być w tym przypadku tylko na plus.
vpiotr
W jednym projekcie mozna stosowac bez problemu kilka styli, zreszta tak sie akurat teraz robi w Javie: 1) Java Spring Autowired Bean 2) OOP (var1 = new MyTool) 3) poor-man-Fp (streams)
jarekr000000
Można jeszcze stosować:4) full fp bez java.util.streamów
S9
Java Optional + Streamy to takie ubogie coś, Vavr jest dużo lepszy, co nie zmienia faktu że bez lambd byłby dużo bardziej upierdliwy
vpiotr
Jarek, co masz na mysli? Vavr? Czy Scala?
jarekr000000
@vpiotr vavr + java + monady
PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:3 miesiące
  • Postów:2787
1

Jak dla mnie to najlepsze połączenie dają dwie zwykłe adnotacje @Value i @Builder. @Value w sobie zawiera trochę innych, ale jeśli mówimy o jakimś VO albo "normalnej" klasie, a nie żadnej encji JPA, to przyjemnie się z tym pracuje.

aaa bb
  • Rejestracja:prawie 6 lat
  • Ostatnio:ponad 2 lata
  • Postów:9
0

Jedni popierają lomboka inni nie...kto jest za lombokiem a kto przeciw ? jakie adnotacje najczęściej używacie?

KamilAdam
@wartek01: to niezłe legacy macie. Nie szukacie szambonurka?
szarotka
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 2 miesiące
  • Postów:533
3

Ja używam Lomboka i póki co nie widzę powodu by porzucać. Jestem zadowolona z efektu. Dobrze mi się z nim żyje.
Najczęściej jest to zestaw adnotacji:

Kopiuj
@Value
@Builder

stosuję standardowo dla DTO oraz konstruktory:

Kopiuj
@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor

Innych rzeczy praktycznie nie używam.

Dlaczego używam? - No cóż jest to wygodne. Jedna adnotacja @Value i mam niemutowalny obiekt z podstawowymi metodami (toString, hash, equals, getter). Podobnie oszczędza mi to czasu i potencjalnych błędów, dostarczając buildera.

Niby preprocesowanie kodu to magia, ale ta magia jest prosta i stabilna - nie miałam nigdy większych problemów. No miałam jeden problem kiedyś jak dodałam drugi preprocesor :D Jakbyście mieli np. mapstruct processora i lomboka, to wtedy (na pewno w gradle'u, nie jestem pewna czy maven sobie radzi) jest problem, jeżeli kolejność zależności w dependencies jest nieodpowiednia, co jest smutne (taki hak, że mapstruct processor musi być zdefiniowany w dependencies przed lombok processorem). No i to pokazuje, że Lombok jest fajny, ale potencjalnie jak się zacznie dołączać kolejne preprocesory, to może się zacząć problem, który wołać pierwszy itp.

S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
1

Ja nie lubię adnotacji do konstruktorów w klasach które nie są DTOsami, utrudnia to debugowanie i ogarnięcie kodu. Wolę podejście takie jakie jest w keczupie przy konstruktorach


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
IV
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 miesiące
  • Postów:30
0

Lombok dodaje lukier składniowy do javy.

Nie przepadam za lombokiem ale tutaj wypunktuję dlaczego:

  1. Lombok nie będąc składnią języka java powodował, że do IDE musiałem instalować dodatkowe pluginy, bywało tak, że po aktualizacji IDE wysypywał się zainstalowany plugin, a aktualizacji pluginu nie było.
  2. Gdy systemem budującym jest maven i lombok generowałby dodatkowe klasy zamiast edytowałby bytecode już obecnych to wystarczyłoby, że każde IDE zgodne z systemem budowania maven nie potrzebowałoby pluginów, a to w dzisiejszych czasach jest pewniejsze niż obsługa lomboka poprzez dodatkowy plugin.
  3. Tutaj mogę się mylić, ponieważ nie jestem pewien, ale adnotacja @Data generuje m.in. settery, equals i hashCode, czyli zakładam, że zawołanie jakiegoś settera z innym parametrem niż jest obecnie ustawiony w obiekcie spowoduje, że zawołanie kolejny raz hashCode zwróci inny wynik, a w dokumentacji javy jest napisane, że equals i hashcode powinno być konsekwentne, czyli w przypadku hashCode zawsze zwracać ten sam wynik w czasie życia obiektu, a equals wielokrotnie z zadanym parametrem zawsze powinien zwracać ten sam wynik.
  4. Zwykle to adnotacja @Data jest używana do generowania setterów i getterów zamiast użycie tych dwóch: @Setter i @Getter, żeby nie było annotation hell, ale użycie @Data ciągnie za sobą generowanie hashCode i equals (patrz punkt wyżej), już nie mówię o tym, że IDE zwykle mają skróty na generowanie setterów i getterów.
  5. Uważam, że pracując z osobami, które nie wiedzą czym jest Value Object nie powinno dołączać się lomboka do projektu, ponieważ dzięki temu nie ma wtedy możliwości użycia adnotacji lombokowych tj. @Data, @EqualsAndHashCode które prowadzą do autoimplementowania hashCode i equals.
  6. Jedyne "sensowne" adnotacje z lomboka to @Value oraz @Builder, ale wolałbym już wtedy użyć biblioteki immutables, ale to już kwestia gustu.

Wydaje mi się, że traktowanie lomboka jako standard w obecnych javowych projektach oznacza, że sama gramatyka języka java nie spełnia oczekiwań programistów.

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4706
4

@ivo:
Jeśli chodzi o:

że zawołanie jakiegoś settera z innym parametrem niż jest obecnie ustawiony w obiekcie spowoduje, że zawołanie kolejny raz hashCode zwróci inny wynik, a w dokumentacji javy jest napisane, że equals i hashcode powinno być konsekwentne,

To akurat nie jest wina Lomboka. To sam hashCode w javie jest porypany po całości, a to powyżej to jeden z problemów. Najgorszy problem to taki, że hashCode jest zrobiony jako metoda do pokrywania w Object (dobrze, że nie wrzucili tam compareTo - bo byłoby jeszcze śmieszniej).

Sama koncepcja robienia jakiś klas w buildzie nie jest taka straszna (lepiej niż w runtime). Fakt, że Lombok, w odróżnieniu od innych podobnych narzędzi, robi to w pojarany sposób. (Widocznie autorzy wciągali te same kadzidełka co twórcy javy i metody hashCode).


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
Zobacz pozostałe 6 komentarzy
AK
@jarekr000000: ciekawa myśl, z tych prostych a nawet genialnych w prostocie, o ile się na to wpadnie
99xmarcin
Mi się to nie klei, potrzeba żeby obiekt miał 2 różne impl hashCode'u to raczej ezoteryka (np. te stringi) która w praktyce prawie nigdy się nie pojawia. Jedyne co przemawia za tym rozwiązaniem to to ze jest Funkcyjne przez duże F i może być użyte w językach bez dziedziczenia. Tutaj ciekawa uwaga od Googlersów: https://github.com/google/guava/issues/188#issuecomment-61303226
jarekr000000
potrzeba żeby obiekt miał 2 różne impl hashCode'u to raczej ezoteryka tak, to nieczęsto. Ale w praktyce za to prawie zawsze masz taki problem: piszesz nową klasę i nie wiesz czy ten hashCode będzie potrzebny, często masz prosty przypadek gdzie hashCode oparty o jeden integer/char by wystarczył idealnie, ale mimo to piszesz/generujesz hashCodowe paskudztwo ... bo: kto wie gdzie ten hashCode będzie kiedyś użyty.
IV
Java 8 w swoich Stream'ach wprowadziła metodę distinct. Czasami jednak chciałem unikalność obiektów po jakimś konkretnym polu a nie po equals, który już był nadpisany w obiekcie i połowa aplikacji na nim polegała, więc modyfikacja metody odpadała. Wtedy zrozumiałem, że równość obiektów zależy od kontekstu, a sam obiekt nie powinien nieść takiej informacji. Na szczęście jest taki Vavr z metodą distinctBy.
99xmarcin
Tyle że z distinctBy trzeba bardzo uważać, skoro obiekty A, B i C są równe według klucza ale różne w rzeczywistości to który z nich dostaniesz w wyniku? Vavr przyjmuje strategię first match wins. Czasami np. na Set'ach które nie mają ustalonej kolejności elementów może to prowadzić to dziwnego zachowania. Podobnie gdy ktoś zmieni typ kolejkcji List -> Set.
wiciu
  • Rejestracja:ponad 11 lat
  • Ostatnio:dzień
  • Postów:1205
0

Bez sensu. Po co chcesz usuwać tego Lomboka? W przypadku wielu javowych projektów, może on pomóc jedynie zredukować boilerplate. Problemy mogą być chyba jedynie wtedy jak masz kilka bibliotek, które generują kod i wchodzą ze sobą w konflikt. Lombok jest tylko do zwykłych encji i nie widzę w nim wielkiego problemu, choć słyszałem, że podobno ktoś kiedyś miał z tym jakieś problemy. Za delombokizacją idzie kupa niepotrzebnej roboty i pełno dodatkowego kodu. Gdybyś pisał projekt od nowa, to mógłbyś sobie zrobić założenia, że nie masz Lomboka, ale jak projekt istnieje, to IMO jest to strata czasu, jeśli jedynym powodem do zmiany jest osobista fanaberia, a nie jakieś konkretne argumenty.

Odpowiadając na Twoje pytanie, jak chcesz się pozbyć Lomboka, to musisz po prostu usunąć wszystkie adnotacje Lomboka, usunąć wszystkie zależności do Lomboka z pom.xml / build.gradle, a potem przekleić/przepisać ręcznie kod wygenerowany przez Lomboka do Twoich encji. W katalogu build/classes (w przypadku gradle) po przebudowaniu projektu znajdziesz kod wygenerowany przez Lomboka i możesz go nawet zdekompilować z poziomu IntelliJa i przekleić na chama do swoich klas, jak bardzo chcesz.

PS. w najnowszej javie ma dojść data class, która, mam nadzieję, rozwiąże ten spór raz na zawsze :) (choć builderów z automatu tam pewnie nie będzie :()

edytowany 10x, ostatnio: wiciu
AK
"a potem przekleić/przepisać ręcznie kod wygenerowany przez Lomboka" zapomniałeś o delombokizacji
wiciu
Jeśli projekt korzysta z setterów, getterów, konstruktorów i builderów wygenerowanych przez Lomboka, to żeby się go pozbyć i żeby projekt działał, trzeba wygenerowany kod zastąpić "ręcznie" napisanym kodem. Jak to można inaczej zrobić? Można też przeprojektować całą aplikację i wprowadzić inną konwencję - np. brak setterów i getterów, a wszystkie zmienne klasy będą public final (immutable). No ale wtedy też trzeba dodać konstruktory i pewnie cały projekt polegający na dotychczasowej konwencji będzie do aktualizacji. Masa niepotrzebnej pracy.
wiciu
Nie znałem z tego toola, ale jak jest na to automat, to chyba rozwiązuje on problem OPa.
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

@ivo:

Uważam, że pracując z osobami, które nie wiedzą czym jest Value Object nie powinno dołączać się lomboka do projektu, ponieważ dzięki temu nie ma wtedy możliwości użycia adnotacji lombokowych tj. @data, @EqualsAndHashCode które prowadzą do autoimplementowania hashCode i equals.

Przecież @Value dostarcza hashcode/equals i to String. Tutaj jest napisane:

In practice, @Value is shorthand for: final @ToString @EqualsAndHashCode @AllArgsConstructor @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) @Getter, except that explicitly including an implementation of any of the relevant methods simply means that part won't be generated and no warning will be emitted.

czyli w przypadku hashCode zawsze zwracać ten sam wynik w czasie życia obiektu, a equals wielokrotnie z zadanym parametrem zawsze powinien zwracać ten sam wynik.

Szczerze mówiąc o tym nie wiedziałem ale dokumentacja (https://docs.oracle.com/javase/10/docs/api/java/lang/Object.html#hashCode() mówi jasno:

Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified.


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
edytowany 3x, ostatnio: scibi92
IV
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 miesiące
  • Postów:30
2

@scibi92:
Wiem o tym, że @Value dostarcza hashCode i equals, ale nie zastosuje się tej adnotacji np. na encjach JPA, ponieważ one muszą mieć publiczny bezargumentowy konstruktor oraz pola muszą być mutowalne, więc często widziałem takie kwiatki, że zamiast użyć dwóch adnotacji @Getter i @Setter na encjach, jest użyta jedna @Data, bo mniej linii kodu to niby lepiej. Ale @Data niesie za sobą autogenerowanie hashCode i equals, które opierają się na mutowalnych polach, a mutowalność pól jest wymagana w encji JPA. A to, że specyfikacja mówi coś jasno to jedna sprawa, a to, że to skompiluje się i zostanie wrzucone na produkcję to druga sprawa ;)
W większości przypadków zwykła domyślna implementacja czy to wygenerowana przez lombokowe @Data lub @EqualsAndHashCode czy tam przez skrót klawiszowy w IDE generuje kod niezgodny właśnie z dokumentacją javy. Chodzi mi o to, że to właśnie nicnierobienie jest częściej zgodne z dokumentacją javy niż nadpisywanie hashCode i equals przez programistę, czy to za pomocą przypadkowego użycia lomboka czy przez wygenerowanie kodu z poziomu IDE.

pedegie
  • Rejestracja:około 11 lat
  • Ostatnio:ponad rok
  • Postów:204
2

Ja używam bo nie lubie boilerplate'u. Wolę 2 adnotację (@Builder i @Value) niz czesto 200 linijek jakiegos zlomu wygenerowanego z IDE. Pozniej nie wiadomo, czy gdzies tam moze w 150 linijce ktos cos nie dopisal do gettera, to samo dotyczy setterow, konstruktorow i builderow. Wszystko trzeba recznie przejrzec w razie W.

Najbardziej brakowaloby mi builderow bo te wygenerowane z IDE i tak trzeba jeszcze poprawic.

Do apek CRUDow brak lomboka to jakis dramat bo tam 90% kodu to boilerplate ktory mozna by ogarnac 2 adnotacjami

AF
  • Rejestracja:prawie 18 lat
  • Ostatnio:11 dni
2
ivo napisał(a):

w dokumentacji javy jest napisane, że equals i hashcode powinno być konsekwentne, czyli w przypadku hashCode zawsze zwracać ten sam wynik w czasie życia obiektu, a equals wielokrotnie z zadanym parametrem zawsze powinien zwracać ten sam wynik.

No właśnie jest napisane dokładnie coś przeciwnego, jeżeli zmienią się elementy używane w equals, to i hash code może się zmienić. Chyba, że mówisz o wymaganiach gdzieś indziej, że hashCode ma być stały, ale wtedy nie jest to wina Lomboka, tylko jego niepoprawnego użycia. Ja wiem, że jest prawo Hyruma, ale to nie zwalania z czytania dokumentacji i rozumienia LSP.

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

@Afish ma rację.

Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified.

Jeśli więc jakieś pole jest zmienione i jest używane w equals to hashcode powinien być zmieniony.


edytowany 1x, ostatnio: scibi_92
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4706
4

Ta ostatnia wymiana zdań na temat hashCode pokazuje jak bardzo jest to zrypane w javie.

Sam hashCode i equals faktycznie może się swobodnie zmieniać... no chyba, że z niego korzystamy, bo trzymamy obiekty w jakimś HashMap, HashSet czy w jakiejś innej strukturze korzystającej z mieszania.
Jeśli w obiekcie tak refereowanym zmieni się hashCode to mogą dziać się ciekawe rzeczy - od wycieków pamieci aż do całkiem dziwnych wywałek.
Czyli, zmieniać można - jeśli wiadomo, że akurat nigdzie nie jest wykorzystany, a to nie jest zawsze wiadomo, jest wiele niejawnych miejsc, gdzie taki hashCode może być użyty - sesje jpa na przykład.

Dawno, dawno temu (jak byłem architekte) preferowałem idealny hashCode:
public int hashCode () {return 1;}, bo
taki jest zgodny ze specyfikacją zawsze, pięknie działa w aplikacjach biznesowych, gdzie rzadko mamy hashMapy większe od 10 elementów, no i w razie czego będzie wiadomo kiedy trzeba zmienić, bo system zacznie klękać.

Przestałem tak robić, bo ludzie jednak nie potrafią zrozumieć, komentować mi się nie chce, a osoby przejmujące system przeważnie nawet nie umieją obsłużyć ani monitoringu ani profilera.

Obecnie skłaniam się ku o wiele lepszemu rozwiązaniu:
public int hashCode () {throw new UnsupportedOperationException();}

(ale jeszcze nigdzie nie stosowałem - boję się, że znowu nikt nie zrozumie).


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 4x, ostatnio: jarekr000000
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)