Java. Gettery i Settery.

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ą.

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.

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)

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

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 ;)

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