Po co gettery i settery?

Po co gettery i settery?
0

Po co w Javie są gettery i settery skoro zawsze są publiczne (nie widziałem innych) ? Prywatne pola i brak setterów przyda się do tworzenia immutable obiektów ale nie widziałem tego zbyt często. Inną sytuacją która przychodzi mi do głowy to walidacja w setterach choć też czytałem, że nie powinno się raczej walidować w setterach pojo. Może ktoś podać konkretne przykłady lub wyjaśnić po co rzeczywiście stosuje się gettery i settery? Zaczynam naukę javy i prywatne pola i publiczne gettery/settery przewijają się wszędzie.

YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 dni
  • Postów:2370
0

Przecież gettery i settery nie są wbudowane i nieodzowne, sam dodajesz :-)

  • Jak idziesz w anemiczne modele -> gttery/settery będą naturlane
  • Jak masz inversion of control i dependency injection -> settery/gettery mogą być alternatywą dla wstrzykiwania via konstruktor (lub adnotacji - pewnie w zależności od implementacji kontenera IoC)
  • Jak idziesz w OOD -> gettery/settery wątpliwe, będziesz raczej miał metody zmieniające stan obiektu i zwracające jakiś deskryptor zmiany/publikujące zdarzenie/komunikat
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
1

Temat wielokrotnie wałkowany. Getterow i setterów nie trzeba stosować. Po prostu tak się kiedyś kodowało - i niektórym tak zostało.


jeden i pół terabajta powinno wystarczyć każdemu
KE
No i niektóre frameworki ich wymagają teraz
jarekr000000
Takim frameworkom powiedz twarde i zdecydowane: raczej nie.
hcubyc
już nawet przedpotopowe wersje Hibernate'a potrafiły korzystać z pól, więc jeżeli coś tego wymaga to niezły beton
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2
  1. Konstruktor
  2. Builder
    długo długo nic
  3. Setter

Niemniej gettery/settery są często potrzebne przy jakichś automatycznych mapowaniach w stylu DOT DTO->json i odwrotnie.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 3x, ostatnio: Shalom
Zobacz pozostały 1 komentarz
Shalom
Nie, robisz to przez jakąś biznesową metodę tego obiektu domenowego. Bo jak trzeba będzie przy zmianie oceny przeliczyć mu średnią i zmienić świadectwo na takie z paskiem, to "gdzieś" ten kod trzeba dać ;]
WeiXiao
@Shalom: jakąś biznesową metodę tego obiektu domenowego brzmi to jak setGrade? łatwiej będzie jak pokażesz kod :P
Shalom
No możesz ją tak sobie nazwać, ale nie będzie ona setterem, który to z definicji po prostu ustawia na pałe wewnętrzny stan pola jakiegoś obiektu na zadana wartość. Analogicznie nie każda metoda z get w nazwie to getter :D
WeiXiao
@Shalom: ale nie będzie ona setterem bo (pomijając single-responsibility...) setGrade również sprawdzi czy nie wychodzi Ci pasek, a później dosmth?
Shalom
Nie będzie setterem bo nie będzie głupim this.x = x tylko będzie jakąś biznesową metodą obiektu.
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
0
Shalom napisał(a):

Niemniej gettery/settery są często potrzebne przy jakichś automatycznych mapowaniach w stylu DOT->json i odwrotnie.

Pewnie miałeś na myśli niesławne DTO.
I nie, nie sa potrzebne od dawna raczej. Jackson nie potrzebuje w żadną stronę


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 2x, ostatnio: jarekr000000
Shalom
fixed ;) a co i czy potrzebuje to już zależy od różnych rzeczy, takich jak konkretna biblioteka i wersja ;) Ale faktycznie powoli biblioteki robią czary-mary i lecą po polach refleksją, niemniej nie byłbym takim optymistą że wszystkie.
jarekr000000
Lecenie po getterach i setterach to też refleksja. Lekko opakowana przez Introspector. Na JVM chyba Jedynie Scali udało się zrobiś całkiem sensowne serializacje do JSON bez refleksji. (za co zresztą lubię Scalę - kompilator Ci mówi, że klasa ma średnio serializowalne pola i nic z tego nie będzie).
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

@jarekr000000: a to bez setterów i getterów nie trzeba jakiś adnotacji (hehehehehe) do Jacksona?


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
NS
Json autodetect czy jakoś tak.
wiciu
Do Jacksona może trzeba, ale do Gsona chyba nie.
arczinosek
  • Rejestracja:prawie 7 lat
  • Ostatnio:około rok
  • Lokalizacja:Warszawa
  • Postów:86
0

Może się mylę, ale wydaje mi się, że settery / gettery są po to, żeby w pewnym sensie oddzielić interfejs od implementacji? Dzięki temu kiedyś w przyszłości możesz zmienić to co się pod nimi kryje nie psując reszty programu - interfejs nadal pozostaje taki sam.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

@arczinosek nie, od tego są interfejsy. Gettery/settery właśnie w tym przeszkadzają bo eksponują na zewnątrz szczegóły implementacyjne.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
CS
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 19 godzin
  • Postów:296
0

A co z polami sprzężonymi? Ustawienie jednego pola powinno powodować zmianę drugiego, wtedy setter jest konieczny.

Julian_
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 4 lata
  • Postów:1703
0

Java notes for professionals

zobacz se rozdział 3 Getters and Setters

arczinosek
Przeczytałem i wygląda na to, że zdanie autora jest przeciwne do zdania forumowiczów... Jak żyć? :D
jarekr000000
Bo @Julian_ jest z zamiłowania archeologiem i ma tendencję do wygrzebywania takich.
Julian_
@jarekr000000 Ty wszystko public static robisz?
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 8 godzin
5

Zadziwiające, że do getterów i setterów nie stostuje się zasada YAGNI.


"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.
jarekczek
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Siemianowice Śląskie
  • Postów:500
1
Julian_ napisał(a):

Java notes for professionals

No i pisze gościu, że są przypadki, gdzie nie trzeba tworzyć setterów. Wg mojej interpretacji będą to na przykład wewnętrzne DTO (java nie ma tupli). Czyli coś, co w kotlinie deklaruje się jako data class. Tak więc nie widzę wyraźnej różnicy zdań. Ogólnie takie statyczne rzeczy, które w C++ zapisalibyśmy jako struct, a nie class. W klasach, które mają metody już bym publicznych zmiennych nie robił.


Przeważnie ignoruję niezarejestrowanych użytkowników.
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

@jarekr000000 @Wibowit dziś dzięki Twitterowi: https://spring.io/blog/2018/09/17/introducing-spring-data-jdbc

Kopiuj
 Customer customer = new Customer();
 customer.dob = LocalDate.of(1904, 5, 14);
 customer.firstName = "Albert";

Note that you don’t need getters or setters. It is perfectly okay to use them if you prefer to do so. Really, the only requirement is that the entity has a property annotated with Id

Jestem zszokowany normalnie :D :D :D


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
Wibowit
tutaj akurat przydałby się jeszcze konstruktor z tymi parametrami
S9
Masz racje, ale nie zmienia to faktu że pierwszy raz mainstream w Javie (bo jak inaczje określić Spring?) powiedział że settery/gettery nie sa potrzebne
Julian_
moje życie straciło sens.
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:15 dni
  • Lokalizacja:Stacktrace
  • Postów:6821
3

Gettery i settery mają tą przewagę nad bezpośrednim dostępem do pól (pomijając sensowność takiego dostępu), że są wywołaniami metod (LOL), co jest inaczej obsługiwane przez JVM i można np. napisać proxy albo aspekt.

Poza tym uważam, ze gettey i settery powinny zostać zniszczone.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
S9
Dobre haslo :d
orchowskia
  • Rejestracja:około 6 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Zielona Góra
  • Postów:83
0

Niedawno się zarejestrowałem i ciekawił mnie właśnie ten temat więc pozwolę sobie odkopać, żeby dodać pewien ciekawy przykład który usłyszałem kiedyś na jakimś rosyjskim spędzie developerskim.

Wyobraźmy sobie że przychodzimy do baru z zamiarem wypicia piwa. Normalnie wyciągnęlibyśmy pieniądze z kieszeni, przekazali je barmanowi oraz wypili piwo.
Natomiast w erze getterów i setterów - 'barman manager' wyciągnąłby nam pieniądze z kieszeni i piwo wlał do gardła.

Taki gwałt na obiekcie w postaci piwosza.

Julian_
gwałt to jest w proceduralnym
orchowskia
mam wrażenie że większość kodu w javie jest proceduralna
neves
  • Rejestracja:prawie 22 lata
  • Ostatnio:około 11 godzin
  • Lokalizacja:Kraków
  • Postów:1114
0
Wibowit napisał(a):

Zadziwiające, że do getterów i setterów nie stostuje się zasada YAGNI.

Najzabawniejsze jest to że o ojciec YAGNI pisał właśnie o geterach i seterach kiedy YAGNI się narodziło :)

You find that you need a getter for some instance variable. Fine, write it. Don’t write the setter because “we’re going to need it”. Don’t write getters for other instance variables because “we’re going to need them”.

The best way to implement code quickly is to implement less of it. The best way to have fewer bugs is to implement less code.

You’re not gonna need it!

You’re NOT gonna need it!, Apr 4, 1998


Wibowit
20 lat póżniej powstało YAGNI 2.0 :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.