Java. Gettery i Settery.

Odpowiedz Nowy wątek
2018-12-01 20:12
0

Kto może powiedzieć, w języku ludzkim ,po co są te gettery i settry?

Przez długi czas nie mogę zrozumieć po co one są.

edytowany 1x, ostatnio: Władyslaw Parchomenko, 2018-12-01 20:13

Pozostało 580 znaków

2018-12-01 21:34
2

W skrócie - gettery zwracają wartości danych pól klasy, a settery, ustawiają te wartości.

Jak za pewne wiesz / niedługo się dowiesz, zmienne klasy mają modyfikatory dostępu, w 99% przypadkach używa się modyfikatora private, czyli żadna zewnętrzna klasa nie ma dostępu do modyfikacji jak i odczytu tej zmiennej. (Hermetyzacja / enkapsulacja). Przykładowo, masz klasę Person, która ma prywatną zmienną imię.

public class Person {
    private String firstName;

    public Person(String firstName) {
        this.firstName = firstName;
    }
}

No dobra, ale po co Ci klasa Person, z której nie możesz wyciągnąć nawet informacji o imieniu? Co innego jakby to były jakieś poufne informację, ale imię? Ja wiem, RODO i w ogóle, ale imię to wypadałoby zwrócić

    public String getFirstName() {
        return firstName;
    }

Teraz możesz stworzyć klasę Person i pobrać jej imię, super. A co jeżeli chcesz zmienić to imię?

 public String setFirstName(String newFirstName) {
        firstName = newFirstName;
    }

Teraz jest już pięknie, możemy pobrać i zmienić imię danej osoby. Tylko po cholerę użyliśmy modyfikatora private skoro i tak dajemy wolny dostęp do tej zmiennej? A no tutaj zaczynają się schody... Gettery / Settery mają tę przewagę nad zrobieniem publicznej zmiennej, że musisz faktycznie wywołać metodę która ma za zadanie coś zmienić. W gruncie rzeczy jest to jednak łudzenie się że stosuje się do zasad hermetyzacji danych. Wiele kursów (zarówno online jak i na niektórych uczelniach) jednak uczy, że każda klasa ma mieć prywatne zmienne i obowiązkowo gettery i settery do nich. Mało tego, (tutaj pewnie o wiele za wcześnie dla Ciebie) starsze frameworki wymuszają tworzenie getterów / setterów przy korzystaniu z DI, czy mapowania między XML a POJO itp. Generalnie stały się one tak powszechnie używane że często nie myśli się tylko robi prywatne zmienne w klasie i z automatu pisze / generuje gettery / settery.

A jak to powinno wyglądać?

Gettery piszesz tylko dla zmiennych których wartość musisz przekazać na zewnątrz klasy.
Setterów staraj się w ogóle unikać, staraj się projektować tak klasy by ich stan nie był zmieniany przez nadpisywanie jakiejś wartości poprzez settery. A jeżeli już, niech ta zmiana poparta będzie jakąś walidacją i uzasadniona, a nie dlatego, że tak jest wygodnie.

Pokaż pozostałe 3 komentarze
To nie jest tak że nie wolno czegoś używać, po prostu są pewne zasady do których się powinno stosować żeby pisać dobre oprogramowanie. Na początku po prostu nie rób bezmyślnie getterów i setterów (głównie setterów) w każdej klasie, o to głównie chodzi. Jeżeli jesteś na etapie poznawania składni języka to jedyne co Ci wystarczy - getter zwraca wartość zmiennej klasy, setter ją ustawia. Za 6-12 miesięcy przypomnij sobie o tym temacie i przemyśl go jeszcze raz. - Emdzej93 2018-12-02 15:48
MOgę ostatnie coś prosic? Możesz pomóc z jednym zadaniem z Uniwersytetu, częściowo go zrobiłem https://4programmers.net/Forum/Ogłoszenia_drobne/318938-java_zadanie_z_konstruktorem?p=1545219#id1545219 - Władyslaw Parchomenko 2018-12-02 15:58
"poza robieniem pól publicznych!" a co jest złego w zrobieniu publicznym pola finalnego zawierającego niemutowalny obiekt? - DisQ 2018-12-02 16:00
nic, ale uznałem że nie ma sensu bardziej mieszać w głowie OP :) - Emdzej93 2018-12-02 16:01
ma sens :P - DisQ 2018-12-02 16:02

Pozostało 580 znaków

2018-12-01 22:08
0

Gettery i settery to są zwykłe metody obiektu. Zwyczajowo setX ustawia wartość pola X a getX zwraca daną wartość.

Czy powinieneś ich używać? Zazwyczaj nie, tylko wtedy gdy wynikają one z 'interface' klasy, czyli tego co obiekt powinien robić. Tak więc dla przykładu getCount w klasie Counter nie jest tam dlatego ze jest getterem na pole, tylko dlatego że wynika z interface klasy (zazwyczaj chcesz pobrać wartość pola)

Dlaczego unikać setterów? Żeby unikać obiektów które mają nieprawidłowy stan.
Dlaczego unikać getterów? Ponieważ użytkowników twojego obiektu nie powinno interesować jak obiekt jest zbudowany wewnątrz (ułatwia to jego modyfikacje)


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

Pozostało 580 znaków

2018-12-01 22:16
0

Gettery i settery nie mają żadnego sensu na ogół. A poza tym settery to w 99% przypadków to zuo bo mutowalnośc jest bee. Ta hermetyzacja danych to iluzja, bo tak naprawde DTOsy to żadne obiekty tylko pojemniki na dane. Settety moga sie przydać w jakimś Swingu albo JaveFX jak ustawiasz wielkośc okienka bo to bardziej złożone prawdopodobnie :)

EDIT:
w sumie fajnie ten problem został rozwiązany w Groovim i Kotlinie


Nie pomagam przez PM. Pytania zadaje się na forum.
edytowany 2x, ostatnio: scibi92, 2018-12-01 22:17
czemu mutowalność jest bee? - ewazdomu 2018-12-02 20:12
bo side effecty - scibi92 2018-12-02 20:15
Nie do końca się zgodzę ze stwierdzeniem "bo side effecty". Możesz mieć czyste funkcje, które wewnętrznie korzystają z lokalnych zmiennych. Mutowalność nie jest równa side effectom. Ja bym się bardziej skłaniał ku stwierdzeniu, że mutowalność przeokrutnie utrudnia myślenie o działaniu programu i tego co w którym miejscu może się zadziać - dlatego jest be. - DisQ 2018-12-02 20:35
Lokalne zmienne (takie jak wewnątrz metod) nie stosoją w sprzeczności z niemutowalnością. - scibi92 2018-12-02 20:37
Jakiś przykład side effektów? - ewazdomu 2018-12-02 21:26

Pozostało 580 znaków

2018-12-02 09:58
0

Generalnie kiedyś popularnym standardem był JavaBean, czyli takie POJOsy z konstruktorem bez argumentów i setterem/getterem dla każdego pola, było to wykorzystywane przez starożytne frameworki, więc generalnie nie było się nawet co zastanawiać czy dać get i set czy publiczne pole, bo standard wymagał tego pierwszego. Teraz nikt nie wymaga getterów/setterów (ludzie ogarniają refleksję po polach), ale u wielu przyzwyczajenie zostało ;)


Limitations are limitless

> ##### Ola Nordmann napisał(a)
> Moim językiem ojczystym jest C++ i proszę uszanować to, że piszę po polsku.

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