Jak się pisze teraz POJO?

Jak napiszesz POJO?
wersja 1
53%
53% [8]
wersja 2
27%
27% [4]
wersja 3
20%
20% [3]
Odpowiedz Nowy wątek
2019-11-30 02:57
0

Jaka jest teraz moda:

1:

class MyMessage {
    private final long id;
    private final String content;

    public MyMessage(long id, String content) {
        this.id = id;
        this.content = content;
    }

    public long getId() {
        return id;
    }

    public String getContent() {
        return content;
    }
}

2:

class MyMessage {
    public final long id;
    public final String content;

    public MyMessage(long id, String content) {
        this.id = id;
        this.content = content;
    }
}

3:

class MyMessage {
    @Getter
    private final long id;
    @Getter
    private final String content;

    public MyMessage(long id, String content) {
        this.id = id;
        this.content = content;
    }
}
edytowany 1x, ostatnio: Julian_, 2019-11-30 11:12
Za brak wielkiej litery na początku klasy karny .... - Burdzi0 2019-11-30 09:50

Pozostało 580 znaków

2019-11-30 21:20
0

Chciałbym, żeby więcej się pisało w wersji 2, ale w praktyce zazwyczaj jest wersja 4


Spring? Ja tam wole mieć kontrole nad kodem ᕙ(ꔢ)ᕗ
Haste - mała biblioteka do testów z czasem.

Pozostało 580 znaków

2019-11-30 21:23
1

Ostatnio się zastanawiałem, dlaczego mimo w miarę dokładnego przerobienia podstaw i bardzo dobrej oceny z Javy na studiach spodobał mi się i rzucił na mnie urok C# poznany w późniejszym czasie i używany obowiązkowo tylko na laborkach z grafiki komputerowej. Po przeczytaniu tego wątku chyba już wiem, co mną kierowało (oprócz bardzo wygodnego IDE).

edytowany 5x, ostatnio: Burmistrz, 2019-11-30 21:34

Pozostało 580 znaków

2019-11-30 21:23
1
vpiotr napisał(a):

Wersja 4:

import lombok.Builder;
import lombok.Data;

@Data
@Builder
class MyMessage {
    private final long id;
    private final String content;
}

Użycie:

System.out.println("Message: "+MyMessage.builder().id(2L).content("Hello world!").build());

Wynik:

Message: MyMessage(id=2, content=Hello world!)

Po co tak? Jaką przewagę ma takie rozwiązanie nad wersją 2? Rozumiem że Lombok stara się zakryć ułomność języka ale w tym przypadku nie ma potrzeby używania go.

Pokaż pozostałe 35 komentarzy
Te read-only kotlinowe są nieco lepsze od read-only javowych (przynajmniej nie mają add itp. w interfejsie). Takie coś pomiędzy normalnym immutable, a readonly. - jarekr000000 2019-11-30 22:44
Akurat pożyteczny interfejs niemutowalnej kolekcji ma metody typu add ale te powinny zwracać nową kolekcję z dodanym elementem, a nie wysadzać się jak terrorysta. Edit: no i w sumie Kotlin ma coś takiego, metoda plus: https://kotlinlang.org/api/la[...]/kotlin.collections/plus.html - Wibowit 2019-11-30 22:47
A my mamy add zwracające boolean albo exception. Niesamowite, że przez tyle lat nie wydawało mi się to dziwne :-) Ale weż wyjasnij sprawę człowiekowi, który zaczyna z programowaniem. Dodajesz 5 do listy [3,4,8] i dostajesz w wyniku true. Tego się nie da wytłumaczyć. Normalnie już x=x+1 chyba łatwiej. - jarekr000000 2019-11-30 22:50
Co do vavr.io to dodam, że przez ułomność (bądź prostotę, niech sobie każdy oceni :) ) systemu typów Javy trzeba robić żmudne override'y, by nie tracić szczegółowych typów podczas wykonywania operacji na referencji o niektórych typach. Dla przykładu weźmy https://github.com/vavr-io/va[...]avr/collection/LinearSeq.java Jest tam pełno pustych override'ów typu @Override LinearSeq<T> remove(T element);. Na pierwszy rzut oka wydaje się to bez sensu, ale bez tego linearSeq.remove zwracałby typ Seq a nie LinearSeq. - Wibowit 2019-11-30 22:57
Wersja 2 nie ma toString, nie może być traktowana jako JavaBean, nie obsłuży poprawnie tablicy, nie wstawisz jej do Setu. W wersji lombokowej może i nie da się debugować jej getterów, ale nie miałem takiej potrzeby na razie. - vpiotr 2019-12-01 01:19

Pozostało 580 znaków

2019-11-30 22:08
4

dlaczego programujecie adnotacjami, a nie kodem?

Może żeby poczuć dreszczyk niepewności - Charles_Ray 2019-11-30 22:22
żeby kod wyglądał jak kupa - Julian_ 2019-11-30 22:28
@Julian_: no to oczywiste, nawet wybrali symbol takiej ładnie zwiniętej kupy @. Ae tylko dlatego, że wtedy Pile of Poo emoji nie było jeszcze powszechne w użyciu :-) . Może trzeba by symbol uaktualnić. 💩Transactional, 💩POST 💩GET 💩Secure - jarekr000000 2019-11-30 22:54

Pozostało 580 znaków

2019-11-30 22:22
0
WeiXiao napisał(a):

dlaczego programujecie adnotacjami, a nie kodem?

Uważaj z takimi pytaniami.
Ja zacząłem ( od niedawna) zadawać to pytanie) i okazuje się, że jestem obrazoburcą, nie rozumiem abstrakcji i nienawidzę javy.

A tak serio - 15 lat temu ( 1500 latte temu) my javowcy pisaliśmy wszystko w XMLu, były na ten temat fajne dowcipy (tylko, że to nie było dowcipy...).
Ludzie, którzy wtedy pisali te XML dziś są architektami. Co ciekawe, po latach przyjęli do wiadomości, że to było zło i nie piszą już XMLi.
Tylko pisza je w adnotacjach :-) ważne, żeby nie pisać kodu w javie - od lat nikt tego nie próbował, nie wiadomo co by sie mogło stać,
sądząc po pytaniach z sali (do moich prezentacji) to nie wiadomo czy to nawet jest production ready.

Ale jest nadzieja, od jakiegoś czasu coraz więcej rzeczy w springu nie robi się adnotacjami.

Teraz się pisze YAMLe.


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.
edytowany 5x, ostatnio: jarekr000000, 2019-11-30 22:25
Pokaż pozostałe 3 komentarze
@WeiXiao: zajebiście. Ale po co debugować - my piszemy bez błędów. Ważne też, że się ich nie testuje. Dzięki temu testy są zawsze zielone. - jarekr000000 2019-11-30 22:25
Dokładnie, a kod się samo dokumentuje i samo waliduje. - Charles_Ray 2019-11-30 22:26
Ja jeszcze nie rozumiem wyższości JAMLa nad JSONem, ale mam nadzieję, że zrozumiem. Smutne jest to, że czasami mam wrażenie, że to późniejsze jest lepsze. Potem trend się cofa i się okazuje, że jednak to wcześniejsze było lepsze. Nikt tutaj nie wspomniał o JSONie, ale dodałem to od siebie, żeby podać przykład. - Burmistrz 2019-11-30 22:29
I jeszcze mamy pluginy do Eclipse, które same kod generują. Normalnie klikasz i masz. Piękne jest życie javowca - yamle, adnotacje, wóda, lasery. - jarekr000000 2019-11-30 22:30
Dziewczyny... a nie, dziewczyny nie. - Charles_Ray 2019-11-30 22:32

Pozostało 580 znaków

2019-11-30 22:27
0
WeiXiao napisał(a):

dlaczego programujecie adnotacjami, a nie kodem?

Trochę przesadzacie. W tym wygenerowanym przez Lomboka kodzie jest dokładnie 0 logiki biznesowej. Adnotacje są ułomne, ale czy copy paste jest zawsze lepsze?


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit, 2019-11-30 23:42
Pokaż pozostałe 12 komentarzy
No to ja nie umiem stwierdzić które jest najczęstsze, w mojej dotychczasowej karierze było mniej więcej po równo. Ja w ogóle nie wierzę w typowe rozwiązanie, bo to przecież zależy od: 1) co jest pod spodem tych transakcji, jaki ORM, czy w ogóle ORM, czy coś poza bazą, itd; 2) biznesu - bo transakcja to jest wymaganie biznesowe dla specyficznych przypadków, a nie jakaś generyczna infrastruktura do wszystkiego. - somekind 2019-12-02 01:51
@somekind: to jeszcze możesz mi napisać co sądzisz o tym wyżej (pastebin) :D - WeiXiao 2019-12-02 01:53
@WeiXiao: jak rozumiem, to @scibi92 chodzi o jakieś generyczne podejście, a nie jakąś jedną metodę. Zresztą, ja tam za bardzo nawet transakcji nie widzę. - somekind 2019-12-02 01:56
@somekind: Hmm, SaveChanges z EFa "pod spodem" tworzy transakcję, więc generalnie zostaje wstrzyknięta instancja DAO X i na niej wykonywane są akcję, jeżeli coś walnie, to nie ma save, więc zmiany są jakby discarded, a jeżeli przejdzie, to leci save. Pytanie co jeżeli gdzieś w innym requescie też zostanie wstrzyknięta ta instancja xD - WeiXiao 2019-12-02 01:59
No tu właśnie chodzi o to, żeby mieć ten sam context w 5 serwisach, a tylko jeden commit. - somekind 2019-12-02 02:01

Pozostało 580 znaków

2019-11-30 22:35
0

Ostatnio na pewnej konferencji brałem udział w konkursie z Javy. Zaznaczyłem odpowiedzi w taki sposób, jakby to był .NET, bo przecież kompilator powinien zwrócić błąd nie czekając na oczywisty exception, który wystąpi na 100% po uruchomieniu programu, ale koledzy powiedzieli, że Java jest dziwna i nie mogę tego tak porównywać. Dla mnie to jest lekko niezrozumiałe.

Pokaż pozostałe 38 komentarzy
Tłumaczenie overriding na nadpisywanie jest np w https://pl.wikipedia.org/wiki/Nadpisywanie_metod i https://pl.wikibooks.org/wiki/C%2B%2B/Funkcje_wirtualne . W przesłanianiu ( https://pl.wikipedia.org/wiki/Przes%C5%82anianie ) przesłonięte i przesłaniające byty mogą być zupełnie różnych typów. Przesłonięte rzeczy można również odsłonić bez uciekania się do refleksji, np w Javie jest idiom this.cośtam = cośtam. Za pomocą this. odsłoniłem identyfikator cośtam odnoszący się do pola w klasie, a który został przesłonięty przez argument konstruktora. - Wibowit 2019-12-02 12:16
No więc tutoriale i artykuły są niekompatybilne z Wikipedią. Stosując terminologię z Wiki, w C# zawsze napisuje się przy użyciu override, i zawsze przesłania się używając new, więc Twoje pierwotne twierdzenie wciąż jest nieprawidłowe. - somekind 2019-12-02 12:24
Niektóre tutoriale mają prawdopodobnie nazewnictwo z czapy. Co jest nieprawidłowe w moim twierdzeniu? Jeśli jest użyty któryś z modyfikatorów newczy override i kod się kompiluje to wiadomo co się dzieje. Natomiast jeśli nie takiego modyfikatora to dużo zależy od tego co jest w klasach bazowych (można chyba przesłonić metodę z klasy bazowej bez słówka new) czy interfejsach (tutaj można zaimplementować definicję abstrakcyjnej czyli wirtualnej metody bez override). - Wibowit 2019-12-02 12:28
Czasem implementację wirtualnej metody definiuje się używając słówka override a czasem nie. - nie czasem, tylko zawsze. Inaczej: bez override nie ma nadpisania. Przesłanianie metody czasem robi się słówkiem new a czasami tego słówka nie trzeba do przesłaniania. - ok, jeśli celem jest skompilowanie kodu, to nie trzeba. Ale brak new skutkuje ostrzeżeniem kompilatora, bo nie wiadomo czy autor celowo chce przesłonić (a zazwyczaj nie chce), czy chciał nadpisać (co zazwyczaj jest celem), tylko źle się za to zabrał. - somekind 2019-12-02 13:15
brak new skutkuje ostrzeżeniem kompilatora - cóż, niektórzy ignorują ostrzeżenia o unchecked w Javie, a potem biadolą, że genericsy się popsuły. Zapomniałem o co mi chodziło z tym opcjonalnym override, jak sobie przypomnę to poeksperymentuję z powrotem. - Wibowit 2019-12-02 16:02

Pozostało 580 znaków

2019-12-01 14:08
11
jarekr000000 napisał(a):

Uważaj z takimi pytaniami.
Ja zacząłem ( od niedawna) zadawać to pytanie) i okazuje się, że jestem obrazoburcą, nie rozumiem abstrakcji i nienawidzę javy.

TTZWJ1B.jpg
edytowany 5x, ostatnio: WeiXiao, 2019-12-01 14:11
:D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D - kzkzg 2019-12-01 14:22

Pozostało 580 znaków

2019-12-03 02:38
0

@Data robi settery więc raczej odpada.
Ja robię w Javie tak:

@FieldDefaults(makeFinal = true, access = PRIVATE)
@RequiredArgsConstructor
@Getter
class MyMessage {
    long id;
    String content;
}

Można zdefiniować plik lomok.config i ustawić globalnie dla wszystkich klas FieldDefaults, dodatkowo od Springa 4.3 w którym to już nie trzeba używać adnotacji @Autowired jeśli wstrzykujemy przez konstruktor to możemy klepać tak (zakładając, że mamy lombok.config) :


@RequiredArgsConstructor
class MyMessage {
    MyService1 myService;
    MyService2 myService;
    MyService3 myService;
}

Ktoś powie że pisanie w adnotacjach ale szczerze wolę to niż 3/4 klasy składającej się z boilerplate'u

@Data robi settery - nie przy polach final. - vpiotr 2019-12-03 07:00

Pozostało 580 znaków

2019-12-03 03:08
2

nie wiem czy tak sie robi „teraz” ale nie uzywam setterow w ogole, getterow praktycznie tez nie a pojo uwazam za zbedne. btw adnotacje to zlo

edytowany 1x, ostatnio: katelx, 2019-12-03 03:08

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0