efektywne programowanie w języku java ebook.pdf

(6021 KB) Pobierz
887649281.001.png
6
Efektywne programowanie w jzyku Java
Rozdział 6. Programowanie..............................................................................125
Temat 29. Ograniczanie zasi5gu zmiennych lokalnych..................................................125
Temat 30. Poznanie i wykorzystywanie bibliotek ..........................................................128
Temat 31. Unikanie typów float i double, gdy potrzebne s dokładne wyniki...............131
Temat 32. Unikanie typu String, gdy istniej bardziej odpowiednie typy......................133
Temat 33. Problemy z wydajnoci przy ł czeniu ci gów znaków................................135
Temat 34. Odwoływanie si5 do obiektów poprzez interfejsy.........................................136
Temat 35. Stosowanie interfejsów zamiast refleksyjnoci..............................................137
Temat 36. Rozwa#ne wykorzystywanie metod natywnych ............................................140
Temat 37. Unikanie optymalizacji ..................................................................................141
Temat 38. Wykorzystanie ogólnie przyj5tych konwencji nazewnictwa.........................144
Rozdział 7. Wyj0tki .........................................................................................147
Temat 39. Wykorzystanie wyj tków w sytuacjach nadzwyczajnych .............................147
Temat 40. Stosowanie wyj tków przechwytywalnych i wyj tków czasu wykonania.......149
Temat 41. Unikanie niepotrzebnych wyj tków przechwytywalnych .............................151
Temat 42. Wykorzystanie wyj tków standardowych .....................................................153
Temat 43. Zgłaszanie wyj tków właciwych dla abstrakcji ...........................................155
Temat 44. Dokumentowanie wyj tków zgłaszanych przez metod5 ...............................157
Temat 45. Udost5pnianie danych o bł5dzie ....................................................................158
Temat 46. Zachowanie atomowoci w przypadku bł5du ................................................159
Temat 47. Nie ignoruj wyj tków.....................................................................................161
Rozdział 8. W0tki............................................................................................163
Temat 48. Synchronizacja dost5pu do wspólnych modyfikowalnych danych................163
Temat 49. Unikanie nadmiarowej synchronizacji...........................................................168
Temat 50. Nigdy nie wywołuj wait poza p5tl ................................................................172
Temat 51. Unikanie korzystania z systemowego szeregowania w tków........................174
Temat 52. Dokumentowanie bezpiecze,stwa dla w tków..............................................177
Temat 53. Unikanie grup w tków...................................................................................180
Rozdział 9. Serializacja....................................................................................181
Temat 54. Implementowanie interfejsu Serializable.......................................................181
Temat 55. Wykorzystanie własnej postaci serializowanej..............................................185
Temat 56. Defensywne tworzenie metody readObject ...................................................191
Temat 57. Tworzenie metody readResolve.....................................................................196
Dodatek A Zasoby..........................................................................................199
Skorowidz......................................................................................203
Rozdział 4.
Odpowiedniki konstrukcji
jzyka C
Jzyk programowania Java posiada wiele podobiestw do jzyka C, ale kilka jego kon-
strukcji zostało pominitych. W wikszo"ci przypadków oczywiste jest, dlaczego dana
konstrukcja została pominita i w jaki sposób mo$na sobie bez niej radzi%. W rozdziale
tym zaproponujemy zamienniki dla kilku pominitych konstrukcji jzyka C, których
zast&pienie nie jest tak oczywiste.
Najczstszym w&tkiem, który przewija si przez cały ten rozdział, jest twierdzenie, $e
wszystkie pominite konstrukcje były zorientowane na dane, a nie zorientowane obiek-
towo. Jzyk programowania Java zawiera bardzo wydajny system typów i propono-
wane zamienniki w pełni korzystaj& z tego systemu w celu zapewnienia wy$szego
stopnia abstrakcji ni$ konstrukcje jzyka C, które s& przez nie zastpowane.
Nawet je$eli zdecydujesz si na pominicie tego rozdziału, warto zapozna% si z tema-
tem 21., po"wiconym typowi wyliczeniowemu , który zastpuje konstrukcj , dostp-
n& w jzyku C. Wzorzec ten nie był powszechnie znany w czasie pisania tej ksi&$ki,
a posiada znaczn& przewag nad obecnie stosowanymi rozwi&zaniami tego problemu.
Temat 19. Zastpowanie struktur klasami
Konstrukcja jzyka C została usunita z jzyka Java, poniewa$ za pomoc& klasy
mo$na zrealizowa% wszystko to, co potrafi struktura, a nawet wicej. Struktura jedy-
nie grupuje kilka pól danych w jeden obiekt — klasa zawiera operacje wykonywane na
wynikowym obiekcie i pozwala na ukrycie pól danych przed u$ytkownikiem obiektu.
Inaczej mówi&c, klasa hermetyzuje dane w obiekcie i umo$liwia dostp do nich jedy-
nie za pomoc& metod, co pozwala twórcy klasy na swobodn& zmian reprezentacji
danych w pó/niejszym czasie (temat 12.).
W czasie pierwszych pokazów jzyka Java niektórzy programi"ci korzystaj&cy z jzyka
C uwa$ali, $e klasy s& zbyt obszerne, aby w pewnych sytuacjach zast&pi% struktury.
90
Efektywne programowanie w jzyku Java
Nie bdziemy si zajmowali tym problemem. Zdegenerowane klasy składaj&ce si jedynie
z pól danych s& pewnym przybli$eniem struktur z jzyka C:
Poniewa$ takie klasy pozwalaj& na dostp do swoich pól, nie pozwalaj& na skorzysta-
nie z zalet hermetyzacji. Nie mo$na zmieni% reprezentacji danych w takiej klasie bez
zmiany API, nie mo$na wymusza% $adnych ogranicze oraz nie mo$na podejmowa%
dodatkowych zada podczas modyfikacji pola. Ortodoksyjni programi"ci obiektowi
uwa$aj&, $e takie klasy s& zakazane i powinny zawsze by% zastpowane klasami z polami
prywatnymi oraz publicznymi metodami je udostpniaj&cymi:
Oczywi"cie twierdzenie to jest prawdziwe w odniesieniu do klas publicznych — je$eli
klasa jest dostpna spoza swojego pakietu, rozwa$ny programista powinien zabezpie-
czy% sobie mo$liwo"% zmiany wewntrznej reprezentacji danych. Je$eli klasa publiczna
udostpnia swoje pola, nie ma mo$liwo"ci zmiany reprezentacji danych, poniewa$ kod
klientów, korzystaj&cy z klasy publicznej, mo$e by% ju$ rozesłany po całym "wiecie.
Je$eli jednak klasa jest prywatna w ramach pakietu lub jest to prywatna klasa zagnie$-
d$ona, nie ma nic złego w bezpo"rednim udostpnieniu pól danych — zakładaj&c, $e
naprawd opisuj& abstrakcj definiowan& przez klas. Podej"cie to generuje mniej kodu
ni$ wykorzystanie metod dostpowych, zarówno w definicji klasy, jak i w kodzie klientów
j& wykorzystuj&cych. Poniewa$ kod klientów jest "ci"le zwi&zany z wewntrzn& repre-
zentacj& klasy, jest on ograniczony do pakietu, w którym klasa ta jest zdefiniowana.
W przypadku, gdy konieczna jest zmiana reprezentacji danych, mo$liwe jest wpro-
wadzenie zmian bez konieczno"ci zmiany kodu poza pakietem. W przypadku prywat-
nej klasy zagnie$d$onej zasig zmian jest ograniczony do klasy nadrzdnej.
Kilka klas w bibliotekach jzyka Java nie dotrzymuje zalecenia, aby klasy publiczne nie
udostpniały bezpo"rednio swoich pól. Przykładami takich klas s& klasy i
z pakietu . Przykłady te nie powinny by% na"ladowane — nale$ałoby raczej
Rozdział 4. Odpowiedniki konstrukcji jzyka C
91
wskazywa% je jako przykład negatywny. W temacie 37. opisany został przykład poka-
zuj&cy, jak udostpnienie pól w klasie spowodowało problemy z wydajno-
"ci&. Problemy te nie mog& zosta% usunite bez wpływania na kod klientów.
Temat 20. Zamiana unii na hierarchi klas
Konstrukcja jzyka C — — jest najcz"ciej wykorzystywana do definiowania
struktur, umo$liwiaj&cych przechowywanie wicej ni$ jednego typu danych. Struktura
taka zwykle posiada co najmniej dwa pola — uni i znacznik . Pole znacznika jest
zwykłym polem, wykorzystywanym do wskazywania aktualnego typu danych, prze-
chowywanego przez uni. Znacznik jest najcz"ciej typu wyliczeniowego ( ).
Struktura zawieraj&ca uni i znacznik jest czasami nazywan& uni z dyskryminatorem .
Poni$ej przedstawiamy przykład definicji typu , zapisany w jzyku C. Jest to
unia z dyskryminatorem, reprezentuj&ca prostok&t lub koło. Funkcja na podstawie
wska/nika do struktury zwraca pole figury lub , je$eli struktura zawiera
nieprawidłowe dane.
!"#"
!#$%&'()*+%&,$&+%'-
!
!
!.!
/#-
!
!!
/#-
!
'-
/#-
/#-
!#
-
!-0
.12
$%&'()*+%3
!12!#
!.!12!#.!
0.!
&,$&+%3
!12!#!
4-,00
!315670).!8.99:07
Zgłoś jeśli naruszono regulamin