2009-10-10 12 views
11

Piszę funkcję equals(Object obj) dla klasy. Widzę, że można uzyskać dostęp do prywatnych pól obj od dzwoniącego. Więc zamiast używać getter:Java: Uzyskiwanie dostępu do prywatnych pól bezpośrednio z innej instancji tej samej klasy

Odp other = (Odp) obj; 
if (! other.getCollection().contains(ftw)) { 

} 

mogę po prostu wejść do pola bezpośrednio:

Odp other = (Odp) obj; 
if (! other.collection.contains(ftw)) { 

} 

Czy to zła praktyka?

+1

Może nie być dokładnym duplikatem, ale bardzo blisko: http://stackoverflow.com/questions/1540159/using-getters-or -używanie-bezpośredniego-pola-dostępu-w-a-pojo – ChssPly76

Odpowiedz

6

Nie, nie jest. Powodem, że prywatne zmienne i metody nie są dostępne z innych klas, jest umożliwienie zmiany wewnętrznych elementów twojej klasy bez konieczności zmieniania całego kodu, który używa tej klasy (aby uniemożliwić użytkownikowi twojej klasy np. Ustawienie zmiennej do wartości, której nigdy nie powinno mieć).

Jeśli używasz prywatnych zmiennych innych obiektów, które niczego nie szkodzą, ponieważ jeśli zrestrukturyzujesz elementy wewnętrzne swojej klasy, i tak musisz zmienić kod w klasie.

+1

To, że będzie działać w 99% przypadków, nie oznacza, że ​​jest to właściwe. Łamie enkapsulację i łączy klasy mocniej bez żadnego innego powodu, jak zapisywanie pięciu znaków. Proszę zobaczyć moją odpowiedź. –

+3

"łączy klasy bardziej ściśle ze sobą" - jakie klasy? Jest tutaj tylko jedna klasa i nie można "odłączyć" klasy od niej samej. – sepp2k

+1

Niekoniecznie. Parametr przekazywany do equals() niekoniecznie jest dokładnie tą samą klasą. –

9

Zawsze używam getterów, ponieważ czasami getter to nie tylko "return (foo)". Czasami inicjują one rzeczy, które mają wartość null, lub mają trochę rejestrowania debugowania, lub weryfikują bieżący stan w jakiś sposób. Jest bardziej spójny.

+0

+1 Jeśli z jakiegokolwiek powodu "kolekcja" może być ren W celu wyraźniejszego określenia celu, wolałbym zmienić go w jednym miejscu zamiast w miejscu, w którym zostałby użyty getter. –

1

To jest w porządku i zupełnie normalne. To trochę dziwne sądzić, że this może bawić się z prywatnymi polami other, ale jest to w porządku, ponieważ nie ma możliwości, aby coś złego mogło się zdarzyć, o ile trzecia strona będzie mogła pozorować obiekty z obiektu Odp. Dowolna metoda klasy Odp może modyfikować dowolne prywatne elementy dowolnego obiektu o kodzie Odp, nawet te, które nie należą do , ale jest to w porządku, ponieważ można oczywiście zaufać wszystkim takim metodom!

5

Nie sądzę, że jest to zła praktyka, ale cecha języka. Pozwala on nie tylko na testowanie w sposób jaki robisz, ale jest również użyteczny w szablonie prototypowym do tworzenia obiektów.

0

Używanie prywatnego elementu dla klasy encji może spowodować niepoprawne działanie klasy proxy. Wyobraź sobie, że hibernacja tworzy klasę według leniwych zapytań. Jeśli zaznaczysz zmienną składową, zwróci ona wartość null. Ale jeśli wywołasz get(), to pobierze dane z bazy danych i zainicjalizuje pole.

Powiązane problemy