2012-08-09 11 views
9

Możliwe Duplikat:
Why use getters and setters?Konieczność getter

Jest to kwestia początkujących. Czy jest bardzo ważne, aby użyć getmethods w celu uzyskania dostępu do wartości nieruchomości? Po przypisaniu wartości można uzyskać katalog wartości. Na przykład w poniższym kodzie displayName() może wyświetlić wartość firstName bez pomocy żadnej metody pobierającej. Czy jest to standardowe standardy kodowania, które muszą mieć metodę getter i setter lub jakąkolwiek inną metodę, która daje taką wartość?

class Test{ 

    private String firstName; 

    public void setName(String fname){ 
     firstName = fname; 
    } 

    public void displayName() { 
     System.out.println("Your name is " + firstName); 
    } 
}   

Odpowiedz

12

Tell, Don't Ask to ważna zasada w projektowaniu obiektowym. Generalnie powinieneś powiedzieć obiektom, żeby robiły różne rzeczy, zamiast zadawać im pytania. zbieracze/setery wszędzie tam, gdzie zniechęcają tę praktykę, ponieważ zachęcani są do sięgnięcia wewnątrz obiektu i dotarcia do pól (lub jeszcze gorszego zasięgu i szturchania rzeczy w przypadku seterów). Łamie to hermetyzację i utrudnia zrozumienie twojego kodu.

W twoim konkretnym przypadku utworzyłbym obiekt o nazwie Name, który ma konstruktora przyjmującego nazwę i pojedynczą metodę wyświetlania.

2

Do korzystania z nieruchomości zawsze używaj Gettera i Settera!

Należy przyjrzeć this article...

+3

nawet w przypadku prywatnych klas pakowania i klas zagnieżdżonych? – Eugene

+3

Czy ma to również zastosowanie, jeśli chcesz uzyskać dostęp do pola z poziomu klasy (tak jak w tym przykładzie)? Nie sądzę ... Artykuł mówi tylko o dostępie z zewnątrz i alternatywnym wykorzystaniu pól publicznych (co, jak się zgadzam, powinno być ograniczone do minimum). – brimborium

4

w twoim przypadku (aby wyświetlić nazwę wyświetlaną) nie jest konieczne, aby zapewnić Getter.

Ale jeśli chcesz korzystać z pola w innej klasie, musimy podać metodę Gettera.

3

Getter i setery są częścią standardowego interfejsu dla Java Beans, a wiele frameworków takich jak Hibernate oczekuje ich na miejscu. W związku z tym to zależy od ciebie, czy zdecydujesz, czy i kiedy ich potrzebujesz iw jakim celu. Zapewniają dostęp do twoich prywatnych zmiennych członkowskich, a nawet dają ci szansę zrobienia czegoś więcej niż zwykłego zdobywania i ustawiania.

Punkt oprogramowania OO to ponowne użycie. Oznacza to, że inni programiści, lub ty od lat, mogą używać tego kodu do innych systemów.

Gdy masz prywatne zmienne składowe i używasz funkcji get/set, możesz zmienić wewnętrzną implementację funkcji bez zrywania całego innego kodu, który jej używa.

2

Posiadanie prywatnego państwa, hermetyzacja jest dobra, aw WIELU przypadkach jest to słuszne. Załóżmy, że twoja klasa ma być Bezpieczna dla wątków, mając pola publiczne, których nie możesz tego zapewnić.

Z drugiej strony są przypadki, kiedy jest to bezużyteczne! Załóżmy, że masz dostęp do obiektu tylko w jednej paczce, jesteś pewien, że nigdy go nie wyeksportujesz, po co zawracasz sobie głowę?

+1

Jestem pewien, że możesz za pomocą słowa kluczowego 'volatile'. – Woot4Moo

+2

@ Woot4Moo jedyną rzeczą, którą masz zamiar zapewnić przy zmienności jest widoczność, która nie jest wystarczająca dla bezpieczeństwa Thread – Eugene

+1

to wydaje się nie zgadzać: http://stackoverflow.com/questions/7805192/is-a-volatile-int-in -java-thread-safe – Woot4Moo

2

Nie mam żadnych linków do obsługi tego, ale to właśnie robię.

Staram się unikać pól publicznych, jeśli nie są statyczne. Używam tylko pól chronionych i prywatnych. Z poziomu klasy możesz uzyskać do nich dostęp bez pobierania/ustawiania, co jest całkowicie w porządku. Spoza klasy zawsze staraj się używać get/set.

Twój kod przykładowy jest całkowicie niezły dla mnie. :)

EDIT: Jedynym wyjątkiem jest dla mnie jeśli tworzę struct -Jak klasy kontenera jak ten

class Point4D { 
    public int x1, x2, x3, x4; 
} 

Wtedy myślę, że pola publiczne są w porządku. Lepiej byłoby jednak uczynić je prywatnymi i nazywać je pobierającymi. Gdy tylko niektóre metody zostaną wprowadzone do tego kontenera, które zmienią stan instancji (np. Zmieniając wartości x1/x2/x3/x4), robię je prywatne i dodajemy get/set.

Powiązane problemy