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:14 minut
  • Postów:2368
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 3 godziny
  • 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 3 godziny
  • 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:5 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:11 dni
  • 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 18 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:5 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:około miesiąc
  • 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:ponad 21 lat
  • Ostatnio:2 dni
  • 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 :)
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)