O’REILLY® Java8Leksykon kieszonkowy POZNAJ NOWOŚCI W JĘZYKU JAVA 8! HELION Robert Liguori Patricia Liguori Spis treści Wprowadzenie...
30 downloads
52 Views
19MB Size
O ’REILLY®
Java 8
Leksykon kieszonkowy POZNAJ NOWOŚCI W JĘZYKU JAVA 8!
HELION
Robert Liguori Patricia Liguori
Spis treści
Wprowadzenie...................................................................................... 11
C zęści J ę z y k ................................................................... 15 Rozdział! Konwencje n a zw .................................................................17 Nazwy klas N azw y interfejsów
17 17
Nazwy metod Nazwy egzemplarzy i zmiennych statycznych
18 18
Nazwy parametrów i zmiennych lokalnych Nazwy parametrów typów ogólnych
18 18
N azw y stałych N azw y typów7 wyliczeniowych
19 19
Nazwy pakietów Nazwy adnotacji
19 20
Nazwy akronimów
20
Rozdział 2. Elementy leksykalne...........................................................21 Unicode i ASCII Komentarze
21 23
Słowa kluczowe Identyfikatory
24 24
Separatory Operatory
25 26
Literały Sekwencje sterujące
26 30
Symbole walut w Unicode
31
Rozdział 3. Typy proste.........................................................................33 Typy podstawowe
33
Literały dla typów podstawowych Encje zmiennoprzecinkowe
33 35
Promocja liczbowa dla typów podstawowych
37
Klasy opakowujące
39
Automatyczne pakowanie i rozpakowywanie
39
Rozdział 4. Typy odnośnikowe............................................................. 43 Porównanie typów odnośnikowych i podstawkowych
44
Wartości domyślne Konwersja typów odnośnikowych
44 46
Konwersja między typami podstawowymi i odnośnikowymi Przekazanie typu odnośnikowego metodzie
47 47
Porównywanie typów odnośnikowych Kopiom\7anie typów odnośnikowych
48 51
Alokacja pamięci i usuw7anie nieużytków7 w7 przypadku typów odnośnikowych
52
Rozdział 5. Programowanie zorientowane obiektowo........................53
6
|
Klasy i obiekty
53
Zmiennej długości lista argumentów7
59
Klasy i metody abstrakcyjne
60
Statyczne dane składow7e, metody, stałe i inicjalizatory
61
Interfejsy
63
Wyliczenia Typy adnotacji
63 64
Interfejsy funkcjonalne
66
Sp s treść
Rozdział 6. Polecenia i bloki ................................................................. 67 Polecenie w postaci wyrażenia
67
Polecenie puste Blok
68 68
Polecenia warunkowe Polecenia iteracji
68 70
Transfer kontroli Polecenie synchronized
72 73
Polecenie assert Polecenia obsługi wyjątków
73 74
Rozdział 7. Obsługa wyjątków............................................................. 75 Hierarchia wyjątku
75
Sprawdzane i niesprawdzane wyjątki oraz błędy Najczęstsze sprawdzane i niesprawdzane wyjątki oraz błędy
76 77
Słowa kluczowe związane z obsługą wyjątków
79
Proces obsługi wyjątków Zdefiniowanie własnej klasy wyjątku
84 84
Wyświetlanie informacji o wyjątku
85
Rozdział 8. Modyfikatory w Ja vie .........................................................87 Modyfikatory dostępu Inne modyfikatory (niedotyczące dostępu)
88 88
Część II Platform a............................................................ 91 Rozdział 9. Java S E ............................................................................... 93 Najczęściej używane biblioteki API Javy SE
93
Rozdział 10. Podstawy programowania.............................................. 105 JRE JDK
105 105
Struktura programu w Javie Narzędzia wiersza poleceń
106 108
Classpath
114
Sp s treść
|
7
Rozdziału. Zarządzanie pamięcią...................................................... 115 Rodzaje mechanizmów usuwania nieużytków
115
Narzędzia przeznaczone do zarządzania pamięcią Opcje w wierszu poleceń
117 118
Zmiana wielkości stosu wirtualnej maszyny Javy Przestrzeń Metaspace
121 121
Współpraca z mechanizmem GC
121
Rozdział 12. Podstawowe wejście i wyjście.........................................123 Standardowe strumienie in, out i err Hierarchia klas dla podstawowego wejścia i wyjścia
123 124
Odczyt i zapis pliku Odczyt i zapis gniazda
124 127
Seiializacja Tworzenie archiwum ZIP i rozpakowywanie plików
128 129
Rozdział 13. Nowe API wejścia-wyjścia (NI0.2).................................. 131 Interfejs Path
131
Klasa Files Funkcje dodatkowe
132 133
Rozdział 14. Współbieżność............................................................... 135 Tworzenie wątków
135
Stany wątku Priorytety wątku
136 136
Najczęściej używane metody dotyczące wątków
137
Synchronizacja
138
Narzędzia współbieżności
139
Rozdział 15. Framework Collections....................................................143
8
|
Interfejs Collection Implementacje
143 144
Metody frameworka Collection Algorytmy klasy Collections
144 145
Efektywność algorytmu Interfejs funkcjonalny Comparator
145 146
Sp s treść
Rozdział 16. Framework Generics........................................................149 Klasy i interfejsy frameworka Generics
149
Konstruktory wykorzystujące framework Generics Zasada zastępow7ania
150 151
Parametry typu, znaki wieloznaczne i granice Zasada get i put
151 152
Specjalizacja typów generycznych Metody frameworka Generics w niezmodyfikowanych typach
153 154
Rozdział 17. API skryptowe Javy..........................................................155 Języki skiyptowe
155
Implementacje silnika skryptów Konfiguracja języków skryptowych i silników7
155 157
Rozdział 18. API daty i godziny............................................................ 161 Wsteczna zgodność
162
Kalendarze regionalne Kalendarz ISO
162 162
Rozdział 19. Wyrażenia lambda..........................................................169 Podstawy wyrażeń lambda
169
Interfejsy funkcjonalne specjalnego przeznaczenia Interfejsy funkcjonalne ogólnego przeznaczenia
171 172
Zasoby dotyczące wyrażeń lambda
174
Dodatki ............................................................................175 A API Fluent....................................................................................... 177 B Narzędzia firm trzecich ..................................................................179 C Podstawy UM L...............................................................................189 Skorowidz........................................................................................... 199
Sp s treść
|
9
10
I
Sps treśc
Wprowadzenie
L e k sy k o n k ie s z o n k o w y , k tó ry trz y m a s z w rę k a ch , z o sta ł o p ra c o w a n y w tak i s p o só b , a b y stać się T w o im p ra w d z iw y m k o m p a n e m . Z a w ie ra k ró tk ie o m ó w ie n ie s ta n d a r d o w y c h fu n k c ji ję z y k a p ro g ra m o w a n ia Ja v a i je g o p la tfo rm y . Z n a jd z ie s z tu ta j in fo rm a c je n ie z b ę d n e p o d c z a s tw o rz e n ia lu b d e b u g o w a n ia p r o g r a m ó w Ja v y , a ta k ż e u ż y t e c z n e p r z y k ła d y p r o g r a m is t y c z n e , ta b e le , r y s u n k i i lis ty . W le k sy k o n ie p o ru sz o n o ró ż n e te m a ty , m ię d z y in n y m i A P I s k ry p to w e Jav y , n a r z ę d z ia o p ra c o w a n e p rz e z firm y trz e c ie o ra z p o d s ta w y z u n ifik o w a n e g o ję z y k a m o d e lo w a n ia (a n g . U n ified M o d e lin g L a n g u a g e , U M L ). M a te ria ł z a p re z e n to w a n y w k s ią ż ce p o m a g a w p rz y g o to w a n ia c h d o e g z a m in u O racle C ertified Associate Java, S E 7 P ro gra m m er I. Jeżeli ro zw ażasz p rz y stą p ie n ie d o e g z a m in u i z d o b y c ie w y m ie n io n e g o c e r ty fik a tu , w a rto z a k u p ić ta k ż e k s ią ż k ę O C A Java S E 7 P ro g ra m m e r I S t u d y G u id e (E x a m 1 Z 0 - 8 0 3 ) n a p is a n ą p rz e z E d w a rd a F in e g a n a i R o b e rta L ig u o ri (M cG ra w -H ill O sb o rn e M e d ia , 2 0 1 2 ). In fo r m a c je p r z e d s ta w io n e w n in ie js z e j k s ią ż c e d o ty c z ą w y d a ń Ja v y a ż d o Ja v a S E 8. P o d s ta w o w e ró ż n ic e m ię d z y ty m i w c z e ś n ie js z y m w y d a n ie m le k s y k o n u (p o ś w ię c o n y m Ja v ie 7) w y n ik a ją z d o d a n ia ro z d z ia łó w d o ty c z ą c y c h A P I d a ty i g o d z in y (A P I „ D a te a n d T im e " ) o ra z w y r a ż e ń la m b d a .
Struktura książki K sią ż k a z o sta ła p o d z ie lo n a n a trz y cz ę śc i. P ie rw s z a s k ła d a s ię z ro z d z ia łó w od 1. d o 8., w k tó ry c h z n a jd z ie s z s z c z e g ó ło w e in fo rm a c je o ję z y k u p ro g ra m o w a n ia Ja v a z g o d n y m z e s p e cy fik a cją JL S (an g . Java L a n g u a g e Specification).
11
C z ę ść d ru g a to ro z d z ia ły o d 9. d o 19., w k tó ry ch d o ść sz cz e g ó ło w o o m ó w io n o k o m p o n e n ty p la tfo r m y Ja v y i p o r u s z o n o z w ią z a n e z ty m te m a ty . Z k o le i c z ę ś ć tr z e c ia to d o d a tk i, w k tó r y c h p r z e d s ta w io n o n a r z ę d z ia o p ra c o w a n e p rz e z firm y tr z e c ie o ra z k r ó tk ie w p r o w a d z e n ie d o ję z y k a U M L .
Konw encje zastosow ane w książce W tej k s ią ż c e z a s to s o w a n o n a s tę p u ją c e k o n w e n c je ty p o g ra fic z n e : K u rs y w a
W s k a z u je n a n o w e p o ję cia , a d re sy U R L i e-m ail, n a z w y p lik ó w , ro z sz e rz e n ia p lik ó w itd . Czcionka o s t a ł e j szerokości U ż y ta w p r z y k ła d o w y c h fra g m e n ta c h k o d u , a ta k ż e w s a m y m te k ś c ie , a b y o d w o ła ć s ię d o p e w n y c h p o le c e ń b ą d ź in n y ch e le m e n tó w p ro g ra m isty cz n y ch , ta k ich ja k n a z w y z m ie n n y c h lu b fu n kcji, b a z d an y ch , ty p ó w d a n y c h , z m ie n n y c h ś r o d o w is k o w y c h , p o le c e ń i s łó w k lu c z o w y c h . Pogrubiona czcionka o stałej szerokości
U ż y ta w celu w y e k sp o n o w a n ia p o le ce ń b ą d ź in n e g o tekstu , k tó ry p o w i n ie n b y ć w p r o w a d z o n y p rz e z c z y te ln ik a . Pochylona cz cio n k a o s t a ł e j s z e r o k o ś c i
W s k a z u je te k s t, k tó ry p o w in ie n b y ć z a s tą p io n y w a r to ś c ia m i p o d a n y m i p rz e z u ż y tk o w n ik a b ą d ź w y n ik a ją c y m i z k o n te k stu .
Taka ikona oznacza w skazów kę, sugestię lub ogólną uw agę.
Taka ikona oznacza ostrzeżenie.
-o A utorzy
R o b e rt Ja m e s L ig u o ri je s t d y re k to rem G lie sia n L L C (http://gliesians.com /), certy fik o w a n y m e k s p e rte m O ra c le i z a jm u je się o b s łu g ą w ie lu o p a r ty c h n a Ja v ie ap lik acji p rz e z n a cz o n y ch d o zarz ą d z a n ia ru ch em lo tn iczy m o raz z w ią z a n y ch z b e z p ie c z e ń stw e m . Z ko lei P atricia L ig u o ri je s t w s z e ch s tro n n y m in ż y n ie re m
12
|
Wprowadzen e
w ie lu s y s te m ó w in fo r m a ty c z n y c h w T h e M IT R E C o r p o r a tio n (h ttp ://w w w . m itre .o r g /). O d ro k u 1994 z a jm u je się o p ra c o w y w a n ie m d z ia ła ją cy ch w czasie
rzeczy w isty m sy stem ó w zarząd zan ia ru ch em lo tn iczy m o raz sy stem ó w info r m a ty cz n y ch p o w ią z a n y c h z lo tn ic tw e m .
Podziękow ania S p e cja ln e p o d z ię k o w a n ia sk ła d a m y n aszej re d a k to r M e g h a n B la n ch e tte , której n a d z ó r i w s p ó łp ra c a o k a z a ły się n ie o c e n io n e p o d c z a s p ra c n a d le k sy k o n e m . P o d z ię k o w a n ia s k ła d a m y M ic h a e lo w i L o u k id e s o w i (k o r e k to r te c h n ic z n y p o c z ą tk o w e j w e rsji le k sy k o n u k ie s z o n k o w e g o ), re c e n z e n to w i te ch n icz n e m u R y a n o w i C u p r a k o w i, a ta k ż e w ie lu r ó ż n y m p r a c o w n ik o m w y d a w n ic tw a O 'R e illy , n a s z e j ro d z in ie i p rz y ja c io ło m . P o n o w n ie ch ce m y p o d z ię k o w a ć w sz y stk im o so b o m z a a n g a ż o w a n y m w p rz y g o to w a n ie p ie rw s z e g o w y d a n ia le k sy k o n u o raz p ra c u ją cy m n a d w y d a n ie m d o ty c z ą c y m Ja v y 7. C o n a jw a ż n ie jsz e , d z ię k u je m y c z y te ln ik o m za k o rz y sta n ie z n in ie jsz e g o lek sy k o n u i w y b ó r ję z y k a Jav a. Z a c h ę c a m y d o u m ie s z c z a n ia w se rw isie T u m b lr (h ttp://javapocketguide.tum blr.com /) w ła sn y c h z d ję ć z k sią ż k ą . B ęd z ie n a m b a r
d z o m iło p r z e k o n a ć się , k to o ra z w ja k ic h o k o lic z n o ś c ia c h (n a p rz y k ła d n a w a k a c ja c h ) c z y ta tę k s ią ż k ę .
Podz ękowan a
|
13
14
I
Wprowadzeń e
CZĘŚĆ I
Język
ROZDZIAŁ 1.
Konwencje nazw
K o n w e n c je n a z w s ą u ż y w a n e w c e lu z a p e w n ie n ia p r o g r a m o m Ja v y w ię k sz ej c z y te ln o ś c i. B a rd z o w a ż n e je s t s to s o w a n ie z r o z u m ia ły c h i je d n o z n a c z n y c h n a z w s k ła d a ją c y c h s ię z ta k z w a n y c h lite r Ja v y .
N azw y klas N a z w a k la s y p o w in n a b y ć rz e c z o w n ik ie m , p o n ie w a ż p rz e d sta w ia „ rz e c z " lu b „ o b ie k t" . N a le ż y s to s o w a ć ta k z w a n ą n o ta c ję c a m e lC a s e , w k tó re j ty lk o p ie rw s z a lite ra k a ż d e g o s ło w a je s t d u ż a , n a p rz y k ła d : public class Fish
N azw y interfejsów Je ż e li in te r fe js o fe r u je p e w n e m o ż liw o ś c i, w te d y je g o n a z w a p o w in n a b y ć p r z y m io tn ik ie m k o ń c z ą c y m s ię n a „ a b le " lu b „ ib le " . W p rz e c iw n y m ra z ie n a z w a p o w in n a b y ć rz e c z o w n ik ie m . W n a z w a c h in te rfe js u n a le ż y s to s o w a ć tę s a m ą k o n w e n c ję w ie lk o ś c i lite r, ja k w n a z w a c h k la s: public interface Serializable { . . . } public interface SystemPanel { . . . }
17
N azw y metod N a z w y m e to d p o w in n y z a w ie ra ć cz a so w n ik , p o n ie w a ż w s k a z u ją n a p o d ję cie akcji p rze z o biek t. N a le ż y zasto so w ać m a łe i d u ż e litery — n a p o czątk u n a z w y m a ła lit e r a , a p ie r w s z a lite r a k a ż d e g o k o le jn e g o s ło w a m u s i b y ć d u ż a . W n a z w a c h m o ż n a s to s o w a ć r z e c z o w n ik i i p rz y m io tn ik i. public void locate() { . . . } // Rzeczownik. public String getWayPoint() { . . . } // Przymiotnik i rzeczownik.
N azw y egzem plarzy i zm iennych statycznych N a z w y e g z e m p la rz y i z m ie n n y c h sta ty cz n y c h p o w in n y b y ć rze c z o w n ik a m i. W ty c h n a z w a c h n a le ż y s to s o w a ć ta k ą s a m ą k o n w e n c ję n a z w , ja k w p r z y p a d k u m e to d : private String wayPoint;
N azw y param etrów i zm iennych lokalnych N a z w a p a ra m e tru i z m ie n n e j lo k a ln e j p o w in n a b y ć o p is o w y m , z a p is a n y m m a ły m i lite ra m i sło w e m , a k ro n im e m lu b sk ró te m . Je ż e li k o n ie c z n e je s t u ż y c ie w n a z w ie k ilk u s łó w , w te d y n a le ż y z a s to s o w a ć ta k ą s a m ą k o n w e n c ję n a z w , ja k w p rz y p a d k u m e to d : public void printHotSpots(ArrayList spotList) { int counter = 0; fo r (String hotSpot : spotList) { System.out.println("Hot Spot #" + ++counter + " : " + hotSpot); } } N a z w y z m ie n n y c h ty m cz a so w y c h m o g ą b y ć p o je d y n cz y m i literam i, n a p rz y k ła d i , j , k, m i n d la lic z b c a łk o w ity c h o ra z c , d i e d la z n a k ó w .
N azw y param etrów typów ogólnych N a z w y p a ra m e tró w ty p ó w o g ó ln y c h p o w in n y b y ć z a p is a n e d u ż y m i, p o je d y n c z y m i lite ra m i. N a p rz y k ła d , d la ty p u z a le c a s ię u ż y c ie lite r y T.
18
|
R o zd zał 1. Konwencje nazw
F ra m e w o rk C o llectio n s in te n sy w n ie k o rzy sta z ty p ó w o g ó ln y ch . N a p rzy k ład , lite ra E je s t u ż y w a n a d la e le m e n tó w k o le k c ji, S d la k o m p o n e n tó w w c z y tu ją c y c h u s łu g i, a K i V d o m a p o w a n ia k lu c z y i w a rto ś c i: public interface Map { V put(K key, V value); }
N azw y stałych N a z w y s t a ły c h p o w in n y b y ć z a p is a n e d u ż y m i l it e r a m i. J e ż e li z a c h o d z i p o tr z e b a u ż y c ia w n a z w ie w ie lu s łó w , w te d y n a le ż y je r o z d z ie lić z n a k a m i p o d k re ś le n ia : public s ta tic final int MAX_DEPTH = 200;
N azw y typów w yliczeniow ych N a z w y ty p ó w w y lic z e n io w y c h p o w in n y s t o s o w a ć t a k ą s a m ą k o n w e n c ję n a z w , ja k w p rz y p a d k u klas. N a z w y p o sz cz e g ó ln y ch o b iek tó w ty p u w y licz e n io w e g o n a le ż y z a p is y w a ć d u ż y m i lite ra m i: enum Battery {CRITICAL, LOW, CHARGED, FULL}
N azw y pakietów N a z w a p a k ie tu p o w in n a b y ć u n ik a ln a i s k ła d a ć s ię z je d y n ie m a ły c h lite r. Je ś li z a c h o d z i p o tr z e b a , w te d y m o ż n a u ż y ć z n a k ó w p o d k re ś le n ia : package com .oreilly.fish_finder; P u b lic z n ie d o s tę p n e p a k ie ty p o w in n y m ie ć n a z w ę w p o s ta c i o d w ró c o n e g o a d re su d o m e n y in te rn e to w e j o rg a n iz a cji. W ta k im p rz y p a d k u n a z w a ro z p o c z y n a s ię o d p o je d y n c z e g o s ło w a w p o s ta c i n a z w y d o m e n y n a jw y ż s z e g o p o z io m u (n a p rz y k ła d com , n et, o rg lu b e d u ), a n a s tę p n ie m a m y n a z w ę o rg a n iz a c ji i p r o je k t u b ą d ź te ż o d d z ia łu . (P a k ie ty w e w n ę t r z n e z r e g u ły m a ją n a z w ę z g o d n ą z k o n w e n c ją s to s o w a n ą w p ro je k c ie ). N a z w y p a k ie tó w ro z p o c z y n a ją c e się o d s ło w a ja v a lu b jav ax są z a s trz e ż o n e i m o g ą b y ć u ż y w a n e je d y n ie w c e lu d o s ta r c z e n ia im p le m e n ta c ji b ib lio te k k la s Ja v y .
Nazwy pak etów
|
19
N azw y adnotacji N a z w y ad n o tacji m o g ą b y ć p rz e d sta w ia n e n a w ie le ró ż n y ch sp o so b ó w w A P I Ja v y S E d la p r e d e fin io w a n y c h ty p ó w a d n o ta c ji [p rz y m io tn ik I c z a so w n ik ] [rz e c z o w n ik ]: @Documented @Retention(RetentionPoli cy.RUNTIME) @Target(ElementType.TYPE) public ^interface FunctionalInterface {}
N azw y akronim ów P o d c z a s s to s o w a n ia w n a z w ie a k r o n im u ty lk o p ie r w s z a lite r a a k r o n im u p o w in n a b y ć d u ż a i ty lk o w te d y , g d y u ż y c ie d u ż e j lite ry je s t o d p o w ie d n ie : public String getGpsVersion() { . . . }
20
|
Rozdz ał 1. Konwencje nazw
ROZDZIAŁ 2.
Elementy leksykalne
K o d ź r ó d ło w y w ję z y k u Ja v a s k ła d a s ię z e s łó w i s y m b o li, n a z y w a n y c h e le m e n ta m i le k s y k a ln y m i lu b p o p r o s t u to k e n a m i. E le m e n t y le k s y k a ln e w Ja v ie o b e jm u ją z n a k i k o ń c a w ie r s z a , z n a k i o d s tę p u , k o m e n ta r z e , s ło w a k lu c z o w e , id e n ty fik a to ry , s e p a ra to ry , o p e ra to ry i lite ra ły . S ło w a i s y m b o le w ję z y k u p r o g r a m o w a n ia Ja v a s k ła d a ją s ię z e z n a k ó w z a k o d o w a n y c h ja k o U n ic o d e .
Unicode i ASCII O p ra c o w a n y i o b słu g iw a n y p rz e z U n ic o d e C o n so rtiu m s ta n d a rd U n ic o d e to u n iw e r s a ln y z e sta w z n a k ó w , w k tó ry m p ie rw s z e 12 8 z n a k ó w je s t d o k ła d n ie ta k ic h s a m y c h , ja k w s ta n d a r d z ie A S C II (a n g . A m e ric a n S ta n d a rd C o d e f o r Inform ation In terch a n ge). U n ico d e z a p e w n ia u n ik a ln ą liczb ę k o d o w ą d la z n a k u
s to s o w a n ą n a w s z y s tk ic h p la tfo rm a c h , w p ro g ra m a c h i ję z y k a c h p ro g ra m o w a n ia . Ja v a S E 8 u ż y w a U n ic o d e w w e rs ji 6 .2 .0 ; w ię c e j in fo rm a c ji n a te m a t p o d a n e j w e rsji stan d ard u z n ajd zie sz n a stro n ie http ://w w w .u nico d e.o rg/uersio ns/ U n ico d e6 .2 .0 /. W Ja v ie S E 7 z a sto so w a n o U n ico d e 6.0.0, w Ja v ie S E 6 i J2 S E 5.0
u ż y to U n ic o d e 4 .0 .
W szystkie pozostałe elem enty danych wejściow ych w Javie są dostarczane jako znaki standardu ASCII.
21
K o n k re tn a w e rs ja sta n d a rd u U n ico d e u ż y w a n a p rz e z o k re ślo n ą w e rsję p la t fo rm y Ja v a je s t p o d a n a w k la s ie C h aracter A P I Ja v y . In fo r m a c je d o ty c z ą c e k o d ó w z n a k ó w U n ic o d e d la s k ry p tó w , s y m b o li i z n a k ó w p rz e s ta n k o w y c h z n a jd z ie s z n a s tro n ie h ttp ://u n ic o d e .o rg /c h a rts /.
Drukowane znaki ASCII W sta n d a rd z ie A S C II lic z b a k o d o w a 3 2 (sp acja) i o d 3 3 d o 126 (lite ry , cy fry , z n a k i p rz e sta n k o w e i k ilk a in n y ch ) są p rz e z n a cz o n e d la ta k z w a n y ch z n a k ó w d ru k o w a n y c h . W ta b e li 2.1 w y m ie n io n o w a rto ści d z ie się tn e i o d p o w ia d a ją c e im z n a k i s ta n d a r d u A S C II. Tabela 2 .1 . D rukow ane znaki A S C II
3z SP
4s o
64 @
so P
ga l
iiz p
aa i
4g i
as A
si Q
gl a
Ha q
a4 "
so z
aa B
sz R
gs b
ii4 r
as t
si a
ai C
s3 S
gg c
i is s
aa s
sz 4
as D
s4 T
ioo d
iia t
ai %
sa s
ag E
ss U
ioi e
iii u
3s &
s4 a
io F
sa v
ioz f
iis v
ag l
ss i
ii G
si W
io3 g
iig w
4o (
sa s
iz H
ss X
io4 h
izo x
4i )
si g
i3 I
sg Y
ios i
iz i y
4z *
ss :
i4 J
go z
ioa j
izz z
4a +
sg ;
is K
g! [
ioi k
iz3 {
44 ,
ao <
16 L
gz \
ios l
iz4 I
4s -
ai =
ii M
g3 ]
iog m
izs }
4a .
az >
is N
g4 ~
iio n
1z6 -
4i /
63 ?
lg O
gs _
iii o
Niedrukowane znaki ASCII L ic z b y k o d o w e o d 0 d o 31 o ra z 1 2 7 są w s ta n d a rd z ie A S C II z a re z e rw o w a n e d la ta k z w a n y ch znaków steru ją cy ch . W ta b e li 2 .2 w y m ie n io n o w a rto ści d z ie s ię tn e i o d p o w ia d a ją c e im z n a k i s te r u ją c e s ta n d a r d u A S C II.
22
I
Rozdz ał 2. Elementy leksykalne
Tabela 2.2. Niedrukowane znaki A SCII OO NUL
O7 BEL
l4 SO
Zl NAK
Z8 FS
Ol SOH
O8 BS
lB SI
ZZ SYN
Z9 GS
OZ STX
O9 HT
l6 DLE
ZS ETB
SO RS
OS ETX
lO NL
l7 DCl
Z4 CAN
Sl US
O4 EOT
l l VT
l8 DCZ
ZB EM
lZ7 DEL
OB ENQ
lZ NP
l9 DCS
Z6 SUB
O6 ACK
lS CR
ZO DC4
Z7 ESC
Liczba kodow a 10 w standardzie A SC II oznacza znak now ego wiersza (wysuw wiersza). Z kolei liczba kodowa 13 w ASCII ozna cza znak pow rotu do początku wiersza.
Kom entarze K o m e n ta r z m ie s z c z ą c y s ię w je d n y m w ie r s z u r o z p o c z y n a s ię o d d w ó c h u k o ś n ik ó w i k o ń c z y n a ty c h m ia s t p o z n a k u k o ń c a w ie rsz a : / / Komentarz wpojedynczym wierszu.
Z k o le i k o m e n ta r z o b e jm u ją c y w ie le w ie r s z y r o z p o c z y n a s ię o d u k o ś n ik a i g w ia z d k i, a k o ń c z y z n a k a m i g w ia z d k i i u k o ś n ik a . P o je d y n c z e g w ia z d k i m ię d z y z n a c z n ik a m i p o c z ą t k u i k o ń c a k o m e n t a r z a s ą u ż y w a n e w c e lu z a p e w n ie n ia e le g a n c k ie g o fo r m a to w a n ia — z w y k le są s to s o w a n e , a le n ie z a lic z a ją s ię d o w y m a g a n y c h : /* * Komentarz może obejmować wiele wierszy, * jak wpokazanym przykładzie. */
K o m e n ta rz Ja v a d o c je s t p rz e tw a r z a n y p rz e z n a r z ę d z ie javadoc w celu w y g e n e ro w a n ia d o k u m e n ta c ji A P I w fo rm a c ie H T M L . K o m e n ta r z Ja v a d o c m u si z a c z y n a ć s ię o d u k o ś n ik a i d w ó c h g w ia z d e k i k o ń c z y ć g w ia z d k ą w r a z z u k o śn ik ie m . N a stro n ie d o k u m e n ta cji p rz y g o to w a n e j i u d o s tę p n io n e j p rz e z O ra c le (h ttp ://w w w .o ra cle.co m /tech n etw o rk /ja v a /ja v a se/d o cu m en ta tio n /in d ex-jsp 1 3 5 4 4 4 .h t m l) z n a jd z ie s z w ię c e j in fo rm a c ji d o ty c z ą c y c h n a r z ę d z ia i k o m e n
ta rz y Ja v a d o c . /** To jest komentarz Javadoc. */
W Ja v ie k o m e n ta r z e n ie m o g ą b y ć z a g n ie ż d ż o n e : /* Taki komentarz /* jest niedozwolony */ w Javie. */
Komentarze
|
23
Słow a kluczow e W ta b e li 2 .3 w y m ie n io n o s ło w a k lu c z o w e Ja v y . D w a z n ic h (c o n st i goto) s ą z a r e z e r w o w a n e , a le n ie s ą u ż y w a n e w ję z y k u p r o g r a m o w a n ia Ja v a . W Ja v ie 5 .0 w p r o w a d z o n o s ło w o k lu c z o w e enum. Tabela 2 .3 . Słowa kluczow e w Javie
abstract
double
int
super
assert
else
interface
switch
boolean
enum
long
synchronized this
break
extends
native
byte
final
new
throw
case
fin ally
package
throws
catch
float
private
transient
char
for
protected
try
class
if
public
void
const
goto
return
v o latile
continue
implements
short
while
default
import
s ta tic
do
instanceof
s tri ctfp
W programach Javy słowa kluczowe nie mogą być używane jako identyfikatory.
Czasam i literały true, false i null są błędnie uznaw ane za słowa kluczowe. To nie są słowa kluczowe, ale zarezerwowane literały.
Identyfikatory Id e n ty fik a to r w Ja v ie to n a z w a , k tó r ą p ro g r a m is ta n a d a je k la s ie , m e to d z ie , z m ie n n e j itd . Id e n ty fik a to r y n ie m o g ą m ie ć ta k ie j s a m e j s e k w e n c ji z n a k ó w U n ic o d e , ja k w p rz y p a d k u ja k ie g o k o lw ie k s ło w a k lu c z o w e g o , boolean lu b lite ra łu n u ll.
24
|
Rozdz ał 2. Elementy leksykalne
W Ja v ie id e n ty f ik a t o r y s ą tw o r z o n e z a p o m o c ą t a k z w a n y c h lite r Ja v y . W s p o m n ia n a lite ra Ja v y to z n a k , d la k tó re g o w a rto ś c ią z w ro tn ą w y w o ła n ia C h a r a c te r .is Ja v a ld e n tifie r S ta r t(in t) je s t tru e. W p rz y p a d k u sta n d a rd u A S C II lite ry Ja v y s ą o g r a n ic z o n e d o z n a k u d o la ra ($), z n a k u p o d k re ś le n ia (_) o ra z m a ły c h i d u ż y c h lite r. C y fry ró w n ie ż m o g ą b y ć u ż y w a n e w id en ty fik ato rach , ale d o p ie ro po p ie rw szy m z n a k u : / / Przykłady prawidłowych identyfikatorów.
cl ass TestDriver { . . . } String testV ariable; int _testV ariable; Long $testVariable; startT est(testV ariab lel); In fo r m a c je d o ty c z ą c e k o n w e n c ji n a z w p rz e d s ta w io n o w ro z d z ia le 1.
Separatory K ilk a z n a k ó w A S C II je s t p rz e z n a c z o n y c h d o o g r a n icz a n ia c z ę śc i p ro g ra m u , czy li są sto s o w a n e w c h a ra k te rz e se p a ra to ró w . Z n a k i ( ) , {} i [] są u ż y w a n e p a r a m i: () {} [] <> :: : ; , . -> W tab eli 2.4 p rz e d sta w io n o n a z e w n ictw o , ja k ie m o ż e b y ć sto so w a n e w o d n ie sien iu d o sep arato ró w w p o sta ci ró ż n e g o ro d z a ju n a w ia só w . P ierw sza z n a z w w y m ie n io n y c h d la p o s z c z e g ó ln y c h n a w ia s ó w to z w y k le ta, k tó ra je s t u ż y w a n a w s p e c y fik a c ji ję z y k a Ja v a . Tabela 2 .4 . Stosowane w Javie separatory w postaci nawiasów
Naw as
Nazewn ctwo
Użyc e
()
Nawiasy nawiasy zaok ąglone nawiasy owalne nawiasy ok ągłe
Ok eślają pie wszeństwo w wy ażeniach a ytmetycznych wskazują zutowane typy o az zawie ają a gumenty metody
{}
Nawiasy klam owe nawiasy k ęcone nawiasy fantazyjne nawiasy falowane i nawiasy zwa iowane
Zawie ają blok kodu i obsługują tablice
[]
Nawiasy kwad atowe nawiasy zamknięte i nawiasy pudełkowe
Obsługują i inicjalizują tablice
<>
Nawiasy ost e nawiasy diamentowe i nawiasy jodełkowe
Zawie ają typy ogólne
Separatory
|
25
Z n a k i g u illem et1 (« i ») są u ż y w a n e d o o k reślan ia stereo ty p ó w w ję z y k u U M L .
O peratory O p e r a to r y p r z e p r o w a d z a ją o p e r a c ję n a m a k s y m a ln ie tr z e c h o p e r a n d a c h i z w r a c a ją w y n ik . D o s tę p n e w Ja v ie o p e ra to ry to m ię d z y in n y m i o p e ra to r p r z y p is a n ia , a r y tm e ty c z n y , p o r ó w n a n ia , b ito w y , in k r e m e n ta c ji i d e k r e m e n t a c ji o r a z k la s y i o b ie k t u . W t a b e li 2 .5 w y m ie n io n o o p e r a to r y Ja v y z u w z g lę d n ie n ie m ich p ie rw s z e ń stw a (o p e ra to ry o n a jw ię k s z y m p ie rw s z e ń stw ie z n a jd u ją s ię n a p o c z ą tk u ta b e li). K a ż d y o p e r a to r z o s ta ł p o k r ó tc e o p i s a n y i w s k a z a n o je g o k ie r u n e k d z ia ła n ia : o d le w e j d o p ra w e j (L ^
P ) lu b
o d p ra w e j d o le w e j (P ^ L ).
Literały L ite ra ły w k o d z ie ź ró d ło w y m p rz e d sta w ia ją w arto ści. P o c z ą w sz y o d w y d an ia Ja v a S E 7, w lite ra ła ch lic z b o w y c h d o z w o lo n e je s t sto so w a n ie z n a k ó w p o d k reślen ia, co z w ię k sz a c z y te ln o ść k o d u . Z n a k i p o d k re śle n ia m o g ą b y ć u m iesz cz a n e m ię d z y p o sz cz e g ó ln y m i fra g m e n ta m i licz b y i są ig n o ro w a n e w tra k cie u r u c h a m ia n ia p ro g ra m u . W ię c e j in fo rm a c ji d o ty c z ą c y c h p o d s ta w o w y c h ty p ó w lite r a łó w z n a jd z ie s z w ro z d z ia le 3.
Literały boolowskie L ite r a ły b o o lo w s k ie s ą w y r a ż o n e w p o s ta c i tru e lu b fa ls e : boolean isReady = true; boolean isSet = new Boolean(false); // Rozpakowana. boolean isGoing = fa lse ;
Literały znakowe L ite ra ł z n a k o w y je s t p o je d y n c z y m z n a k ie m lu b s e k w e n c ją s te r u ją c ą u ję tą w a p o s tro fy . N ie d o z w o lo n e je s t u ż y w a n ie z n a k ó w k o ń c a w ie rs z a :
1 To jest para znaków przestankowych używanych w charakterze znaków cytowania w języku francuskim oraz innych językach europejskich — przyp. tłum.
26
|
Rozdz ał 2. Elementy leksykalne
Tabela 2.5. Operatory w Javie
1
++ --
postink ementacja postdek ementacja
P— L
2
++ --
p eink ementacja p edek ementacja
P— L
+ -
jednoa gumentowy plus i minus
P— L
-
bitowe uzupełnienie
P— L
!
bitowe NOT
P ——L
3
new
utwo zenie obiektu
P ——L
(typ)
zutowanie typu
P— L
4
* /%
mnożenie dzielenie i eszta z dzielenia
L— P
5
+ -
dodawanie odejmowanie
L— P
+
łączenie ciągów tekstowych
L— P
<< >> >>>
p zesunięcie w lewo p zesunięcie w p awo p zesunięcie w p awo bez znaku
L— P
V
mniejszy niż mniejszy niż lub ówny większy niż większy niż lub ówny
L— P
6 7
II A
K erunek dz ałan a
A
Ops
II V
Operator
P erwszeństwo
instanceof 8
== ! =
9
typ po ównania ówność i nie ówność wa tości
L— P L— P
== ! =
odniesienie do ówności i nie ówności
L— P
&
boolowskie AND
L— P
&
bitowe AND
L— P
10
boolowskie XOR
L— P
bitowe XOR
L— P
11
I
boolowskie OR
L— P
I
bitowe OR
L— P
12
&&
logiczne AND
L— P
13
II
14 15
logiczne OR
L— P
t ója gumentowy ope ato wa unkowy
L— P
ope ato y p zypisania
L— P
*= /= %= &= char charValue1 = 'a // Apostrof.
Character charValue2 = new Character ( '\ '') ;
L terały
|
27
Literały w postaci liczb całkowitych T y p y lic z b c a łk o w ity c h (b y te, sh o rt, in t i long) m o ż n a w y r a ż a ć w p o s ta c i licz b d z ie s ię tn y ch , sz e s n a s tk o w y c h , ó s e m k o w y c h i d w ó jk o w y c h . D o m y śln ie lite ra ły w p o s ta c i lic z b c a łk o w ity c h s ą ty p u in t: int intValue1 = 34567, intValue2 = 1_000_000; D z ie s ię tn e lic z b y c a łk o w ite z a w ie r a ją d o w o ln ą lic z b ę c y fr A S C II o d 0 d o 9 i p r z e d s ta w ia ją lic z b y d o d a tn ie : Integer integerValue1 = new Integer(100); U m ie s z c z e n ie n a p o c z ą tk u lic z b y o p e ra to ra n e g a c ji p o w o d u je u tw o r z e n ie u je m n e j d z ie s ię tn e j lic z b y c a łk o w ite j: public s ta tic final int INT_VALUE = -200; L icz b y sz esn a stk o w e ro z p o cz y n a ją się o d z n a k ó w 0x lu b 0X, p o k tó ry ch m a m y c y fry A S C II o d 0 d o 9 o ra z lite ry o d a d o f (lu b o d A d o F). W p rz y p a d k u lite ra łó w w p o sta ci sz e s n a s tk o w y ch licz b c a łk o w ity ch w ie lk o ść lite r w Ja v ie n ie m a z n a c z e n ia .
L ic z b y sz e s n a s tk o w e m o g ą p rz e d sta w ia ć d o d a tn ie i u je m n e licz b y całk o w ite o ra z z e ro : int intValue3 = 0X64; //Dziesiętna liczba 100 utworzona na podstawie liczby szesnastkowej. L ite ra ły ó se m k o w e ro z p o c z y n a ją się o d 0, p o k tó ry m m a m y je d n ą lu b w ię ce j c y fr A S C II z z a k r e s u o d 1 d o 7: int intValue4 = 0144; //Dziesiętna liczba 100 utworzona na podstawie liczby ósemkowej. L ite r a ły d w ó jk o w e s ą w y r a ż a n e z a p o m o c ą p r e fik s u 0b lu b 0B, p o k tó ry m z n a jd u ją s ię z e ra i je d y n k i: char msgValue1 = 0b01001111; // O char msgValue2 = 0B01001011; //K char msgValue3 = 0B0010_0001; //! A b y z d e fin io w a ć lic z b ę c a łk o w itą ty p u long, k o n ie c z n e je s t u m ie s z c z e n ie n a je j k o ń c u d u ż e j lite r y L z e s ta n d a r d u A S C II (to r o z w ią z a n ie p r e fe r o w a n e , z a p e w n ia ją c e n a jle p s z ą c z y te ln o ś ć ) lu b m a łe j lite ry l : long longValue = 100L;
Literały w postaci liczb zmiennoprzecinkowych P ra w id ło w y literał w p o staci liczb y zm ien n op rzecin k o w ej w y m a g a całej liczb y i/ lu b c z ę ś c i u ła m k o w e j, p r z e c in k a d z ie s ię tn e g o i p r z y ro s tk a w s k a z u ją c e g o typ . W y k ła d n ik je s t w s k a z y w a n y p rz e z lite rę e lu b E i je s t o p cjo n a ln y . C z ę ść
28
|
R o zd zał 2. Elementy leksykalne
u ła m k o w a i p r z e c in e k d z ie s ię tn y n ie s ą w y m a g a n e w p r z y p a d k u z a s to s o w a n ia w y k ła d n ik a lu b p r z y ro s tk a ty p u . L ite ra ł w p o s ta ci lic z b y z m ie n n o p rz e c in k o w e j o p o d w ó jn e j p re c y z ji (double) to lic z b a z m ie n n o p r z e c in k o w a z a b ie r a ją c a o s ie m b a jt ó w . Z w y k ła lic z b a z m ie n n o p r z e c in k o w a ty p u f l o a t z a b ie r a c z te r y b a jty . P r z y r o s te k ty p u d la lic z b y o p o d w ó jn e j p re c y z ji to d lu b D, d la s ta n d a r d o w e j to f lu b F: [całaOli czba].[część_ułamkowa][e|E wykładni k][f|F|d|D] float floatValue1 = 9.1 5 f, floatValue2 = 1_168f; Float floatValue3 = new Float(20F); double doubleValue1 = 3.12; Double doubleValue2 = new Double(1e058); float expValue1 = 10.0e2f, expValue2=10.0E3f;
Literały w postaci ciągów tekstowych L ite r a ły w p o s ta c i c ią g ó w te k s to w y c h z a w ie r a ją z e ro lu b w ię c e j z n a k ó w , m ię d z y in n y m i z n a k i steru ją c e u ję te w cu d z y słó w . L ite ra ły w p o sta ci cią g ó w te k s to w y c h n ie m o g ą z a w ie r a ć z n a k ó w U n ic o d e o k o d a c h \u000a i \u000d w s k a z u ją c y c h n a k o n ie c w ie rs z a , z a m ia s t n ic h n a le ż y u ż y w a ć \r i \n. C ią g i te k s to w e są n ie m o d y fik o w a ln e : String String String String
stringValue1 stringValue2 stringValue3 stringValue4
= = = =
new String("Prawidłowy l i t e r a ł ." ) ; "Prawidłowy.\nW nowym wierszu."; "Łączenie cią" + "gów tekstowych"; "\"Sekwencje sterujące\"\r";
Is tn ie je p u la c ią g ó w t e k s to w y c h p o w ią z a n y c h z k la s ą S tr in g . P o c z ą tk o w o w s p o m n ia n a p u la je s t p u sta . L ite ra ły w p o s ta c i c ią g ó w te k s to w y c h i w y ra ż e n ia s ta ły c h o w a r to ś c ia c h s k ła d a ją c y c h s ię z c ią g ó w te k s to w y c h s ą p r z e c h o w y w a n e w p u li i d o d a w a n e d o n ie j ty lk o je d n o k r o tn ie . P rz e d s ta w io n y p o n iż e j p rz y k ła d p o k a z u je , ja k lite ra ły są d o d a w a n e d o p u li i u żyw ane: //Dodanie ciągu tekstowego "tenCiągTekstowy” do puli. String stringValue5 = "tenCiągTekstowy"; // Użycie ciągu tekstowego "tenCiągTekstowy” z puli.
String stringValue6 = "tenCiągTekstowy"; C iąg te k sto w y m o ż e z o sta ć d o d a n y d o p u li (jeżeli je sz cz e się w n iej n ie zn aj d u je) p rz e z w y w o ła n ie m e to d y in te rn () w z g lę d e m ciąg u te k sto w e g o . W a rto ś c ią z w r o tn ą m e to d y i n t e r n ( ) je s t c ią g te k s to w y b ę d ą c y o d n ie s ie n ie m d o n o w e g o c ią g u te k s to w e g o d o d a n e g o d o p u li lu b o d n ie s ie n ie m d o is tn ie ją c e g o c ią g u te k s to w e g o :
L terały
|
29
String stringValue7 = new String("tenCiągTekstowy"); String stringValue8 = stringValue7.intern();
Literały null L ite ra ł n u ll je s t ty p u null i m o ż e b y ć z a s to s o w a n y d o ty p ó w o d n o ś n ik o w y c h . N ie je s t s to s o w a n y d o ty p ó w p o d s ta w o w y c h : String n = null;
Sekw encje sterujące W ta b e li 2 .6 w y m ie n io n o s e k w e n c je s te r u ją c e u ż y w a n e w Ja v ie . Tabela 2.6. Literały znakowe oraz w postaci ciągów tekstowych dla sekwencji sterujących
Nazwa
Sekwencja
Dz es ętn e
Un code
\b
8
\u0008
Tabulato poziomy
\t
9
\u0009
Wysuw wie sza
\n
10
\u000A
Znak końca st ony
\f
12
\u000C
Znak nowego wie sza
\r
13
\u000D
Cudzysłów
\"
34
\u0022
Apost of
\'
39
\u0027
Backspace
P o sz cz eg ó ln e z n a k i k o ń ca w ie rsz a są u ż y w a n e n a ró ż n y ch p la tfo rm a ch w celu p rz e jś c ia d o n o w e g o w ie r s z a (p a trz ta b e la 2 .7 ). U ż y c ie m e to d y p r in t ln ( ) o b e jm u ją ce j k o n ie c w ie rsz a to le p sz e ro z w ią z a n ie n iż u m iesz c z a n ie w k o d zie n a s ta łe s e k w e n c ji s te r u ją c y c h \n i \r. Tabela 2 .7 . Znaki now ego wiersza na różnych platformach
System operacyjny
Znak nowego w ersza
System ope acyjny zgodny z POS X (na p zykład Sola is Linux) i OS X
LF(\n)
Mac OS do we sji 9
CR(\r)
Mic osoft Windows
CR+LF (\r\n)
30
I
R o zd zał 2. Elementy leksykalne
Sym bole w alut w Unicode S y m b o le w a lu t w U n ic o d e s ą p r z e d s ta w ia n e z a p o m o c ą z n a k ó w o lic z b ie k o d o w e j z z a k r e s u o d \u20A0 d o \u20CF (8352-+8399+). P rz y k ła d y z n a jd z ie s z w ta b e li 2 .8 . Tabela 2 .8 . Sym bole walut w zakresie od \ u 2 0 A 0 do \ u 2 0 C F
Nazwa
Symbol
Dz es ętn e
Un code
F ank f ancuski
t
8355
\u20A3
Li
f
8356
\u2GA4
8357
\u20A5
Rs
8360
\u20A8
Dong
d
8363
\u2GAB
Eu o
€
8364
\u2GAC
D achma
4
8367
\u2GAF
i
8368
\u20B0
Mill Rupia
Fenig
W ie le in n y c h s y m b o li w a lu t is tn ie je p o z a w y m ie n io n y m z a k r e s e m . P r z y k ła d y p rz e d s ta w io n o w ta b e li 2.9 . Tabela 2 .9 . Sym bole walut spoza zakresu od \ u 2 0 A 0 do \ u 2 0 C F
Nazwa
Symbol
Dz es ętn e
Un code
Dola
S
36
\u0024
Cent
i
162
\u00A2
Funt
£
163
\u00A3
Znak waluty
n
164
\uGGA4
Jen
¥
164
\uGGA5
Małe łacińskie f z k eską
f
Symbol upii bengalskiej
402
\uG192
2546
\uG9F2
Znak upii bengalskiej
*
2547
\uG9F3
Znak upii gudża ackiej
3.
2801
\uGAF1
Znak upii tamilskiej
«
3065
\uGBF9
Symbol bahta tajskiego
1
3647
\uGE3F
8499
\u2133
Wielka lite a M
Symbole walut w Un code
I
31
Tabela 2.9. Symbole walut spoza zakresu od \u20A0 do \u20CF — ciąg dalszy Nazwa
Symbol
Dz es ętn e
Un code
Ujednolicony ideog am CJK2 1
TC
20803
\u5143
Ujednolicony ideog am CJK 3
n
20870
\u5186
Ujednolicony ideog am CJK 2
■
22278
\u5706
Ujednolicony ideog am CJK 4
■
22291
\u5713
2 CJK (ang. Chinese, Japanese and Korean) oznacza ujednolicone znaki pisma chińskiego, japońskiego i koreańskiego — przyp. tłum.
32
|
R o zd zał 2. Elementy leksykalne
ROZDZIAŁ 3.
Typy proste
T y p y p r o s te o b e jm u ją ty p y p o d s ta w o w e (a n g . p rim itiv e ty p es) i o d p o w ia d a ją c e im k la s y o p a k o w u ją c e o ra z ty p y o d n o ś n ik o w e (a n g . re fe re n c e ty p es). Ja v a 5.0 i n o w s z e z a p e w n ia ją a u to m a ty c z n ą k o n w e rsję m ię d z y ty p a m i p o d s ta w o w y m i i o d n o śn ik o w y m i z a p o m o c ą a u to m a ty c z n e g o p a k o w a n ia i ro z p a k o w y w a n ia . P ro m o c ja licz b o w a je s t s to so w a n a w z g lę d e m ty p ó w p o d sta w o w y c h , g d y ty lk o ta k ie ro z w ią z a n ie je s t o d p o w ie d n ie .
Typy podstaw ow e W Ja v ie istn ie je o sie m ty p ó w p o d sta w o w y ch , k a ż d y z n ic h je s t sło w e m z a re z e rw o w a n y m . O p is u ją z m ie n n e z a w ie r a ją c e p o je d y n c z e w a rto ś c i o o d p o w ie d n im fo rm a c ie i w ie lk o ś c i (p a trz ta b e la 3 .1 ). T y p y p o d s ta w o w e z a w s z e c h a r a k te r y z u ją s ię p o d a n ą p r e c y z ją , n i e z a le ż n ie o d p r e c y z ji u ż y w a n e g o s p r z ę tu (n a p rz y k ła d 3 2 - lu b 6 4 -b ito w y ).
W przypadku typów podstaw ow ych byte, short, int, long, float i doubl e m ożna w skazać znak. Z kolei typ char jest bez znaku.
Literały dla typów podstaw ow ych W s z y s tk ie ty p y p o d s ta w o w e p o z a boolean m o g ą a k c e p to w a ć z n a k i, lic z b y d ziesiętn e, szesn astk o w e, ó se m k o w e i literały U n ico d e, a tak że sek w en cje z n a k ó w steru jących . K ied y zach o d zi p o trzeb a, w a rto ść literału je s t a u to m aty czn ie
33
Tabela 3.1. Typy podstawowe Typ
Op s
Wymagana lość pam ęc masowej
Zakres wartośc
boolean
true lub false
1 bit
nie dotyczy
char
znak Unicode
2 bajty
od \u0000 do \uFFFF
byte
liczba całkowita
1 bajt
od 128 do 127
short
liczba całkowita
2 bajty
od 32 768 do 32 767
int
liczba całkowita
4 bajty
od 2 147 483 648 do 2 147 483 647
long
liczba całkowita
8 bajtów
od 263 do 263 1
fl oat
liczba zmiennop zecinkowa
4 bajty
od 1 4e-45 do 3 4e+38
double
liczba zmiennop zecinkowa
8 bajtów
od 5e-324 do 1 8e+308
r z u to w a n a lu b k o n w e rto w a n a . P a m ię ta j, ż e tra k c ie s k ra c a n ia d o c h o d z i d o u tr a ty b itó w . P o n iż e j p r z e d s ta w io n o p r z y k ła d y p r z y p is a ń ty p ó w p o d s ta w ow y ch : boolean is T it le F ig h t = tr u e ; W p rz y p a d k u ty p u p o d sta w o w e g o boolean je d y n e p ra w id ło w e w a rto ś ci lite ra łó w to tru e i f a ls e . char [] cArray = {'\ u 0 0 4 B ',
'O ',
0x0064, 041,
(ch ar) 131105, 0b00100001}; / / K O ’d !!! T y p p o d s ta w o w y char p rz e d s ta w ia p o je d y n c z y z n a k U n ic o d e . W a rto ś c i lite r a łó w ty p u p o d s ta w o w e g o char w ię k s z e n iż d w a b a jty w y m a g a ją w y ra ź n e g o rz u to w a n ia . byte rounds = 12, fig h te r s = (b y te) 2; L ite rałe m d la try bu p o d sta w o w e g o byte jest czterob ajto w a liczba całk o w ita z e z n a k ie m . Je że li n ie z o sta n ie p rz e p ro w a d z o n e w y ra ź n e rz u to w a n ie , w s p o m n ia n a licz b a c a łk o w ita b ę d z ie n ie ja w n ie rz u to w a n a n a je d e n b a jt. sh o rt seatin g C ap acity = 17157, v ip Seats = (s h o rt) 500; L ite ra łe m d la try b u p o d sta w o w e g o short je s t c z tero b a jto w a licz b a całk o w ita z e z n a k ie m . Je ż e li n ie z o s ta n ie p r z e p r o w a d z o n e w y r a ź n e rz u to w a n ie , w sp o m n ia n a liczb a całk o w ita b ę d z ie n ie ja w n ie rz u to w a n a n a d w a b a jty . in t ppvRecord = 19800000, vs = v ip S e a ts , venues = ( i n t ) 20000.50D ; L ite r a łe m d la try b u p o d s ta w o w e g o in t je s t c z te r o b a jto w a lic z b a c a ł k o w ita z e z n a k ie m . K ie d y ty p y p o d s ta w o w e char, byte i sh o rt s ą u ż y w a n e ja k o lite ra ły , a u to m a ty c z n ie z o s ta ją r z u to w a n e n a c z te r o b a jto w e
34
|
Rozdz ał 3. Typy proste
lic z b y c a łk o w ite , ja k w p r z y p a d k u w a r to ś c i sh o rt v ip S e a ts . L ite r a ły w p o sta ci licz b z m ie n n o p rz e cin k o w y c h i ty p u long m u s z ą b y ć w y ra ź n ie rz u to w a n e . long wins = 38L, lo ss e s = 4 l , draws = 0 , knockouts = (long) 30; L ite r a łe m d la try b u p o d s ta w o w e g o long je s t o ś m io b a jto w a lic z b a c a ł k o w ita z e z n a k ie m . N a u ż y c ie ty p u long w s k a z u je p r z y r o s te k L lu b l. W p rz y p a d k u b ra k u p rz y ro stk a lu b w sk a z a n e g o rz u to w a n ia w a rto ś ć je s t a u to m a ty c z n ie rz u to w a n a z c z te r e c h b a jtó w n a o sie m . f l o a t payPerView = 5 4 .9 5 F , balcony = 2 0 0 .0 0 f, rin g sid e = ( f l o a t ) 2000, cheapSeats = 50; L ite rałe m d la try b u p o d sta w o w e g o flo a t je st c ztero b ajto w a liczb a z m ie n n o p rz e c in k o w a z e z n a k ie m . N a u ż y c ie ty p u f l o a t w s k a z u je p r z y r o s te k F lu b f. C h o cia ż n ie je s t w y m a g a n e w y ra ź n e rz u to w a n ie d la literału in t, to in t n ie z a w s z e z m ie ś c i s ię w f l o a t , g d y w a r to ś ć b ę d z ie w ię k s z a n iż o k o ło 2 23. double champsPay = 20000000.00D , challeng ersP ay = 12000000.00d, chlT rain erP ay = (double) 1300000, refereesP ay = 3000, soda = 4 .5 0 ; L ite ra łe m d la try b u p o d sta w o w e g o double je s t o śm io b a jto w a liczb a cał k o w ita z e z n a k ie m . N a u ż y c ie ty p u double w s k a z u je p r z y r o s te k D, d lu b w y ra ź n e rz u to w a n ie i b r a k p rz y ro stk a . Je ż e li lite rał je s t lic z b ą całk o w itą, b ę d z ie n ie ja w n ie rz u to w a n y . W ię c e j in fo rm a c ji o lite ra ła c h p rz e d s ta w io n o w ro z d z ia le 2.
Encje zm iennoprzecinkow e D o d a tn ie i u je m n e n ie s k o ń c z o n e lic z b y z m ie n n o p r z e c in k o w e , u je m n e z e ro i N a N (an g . n o t-a -n u m b er) to e n c je sp e cja ln e z d e fin io w a n e w celu sp ro sta n ia w y m a g a n io m s ta n d a r d u IE E E 7 5 4 -1 9 8 5 (p a trz ta b e la 3 .2 ). Tabela 3.2. E n cje zm iennoprzecinkow e
Encja
Ops
Przykłady
Infin ity
P zedstawia koncepcję dodatniej nieskończoności
1.0/0.0 1e300/1e-300 Math.abs (-1.0/0.0)
-In fin ity
P zedstawia koncepcję ujemnej nieskończoności
-1.0/0.0 1.0/(-0.0) 1e300/-1e- 300
-0.0
P zedstawia liczbę ujemną bliską ze u
-1.0/(1.0/0.0) -1e-300/1e300
NaN
P zedstawia nieok eślony wynik
0.0/0.0 1e300*Float.NaN Math.sqrt (-9.0)
Encje zm ennoprzec nkowe
|
35
E n cje In fin ity , - I n f in it y i -0 .0 są zw racan e , g d y o p e racja w y g e n e ru je w a rto ść z m ie n n o p rz e c in k o w ą z b y t d u ż ą , a b y m o g ła z o s ta ć p rz e d sta w io n a w tra d y c y jn y s p o só b . E n c je d o d a tn ie j i u je m n e j n ie s k o ń c z o n o ś c i o ra z N a N są d o s tę p n e ja k o sta łe ty p ó w dobule i f lo a t : Double.POSITIVE_INFINITY; //Nieskończoność. F lo at.POSITIVE_INFINITY; //Nieskończoność. Double.NEGATIVE_INFINITY; //Ujemna nieskończoność. Fl oat. NEGATI VE_INFINITY; //Ujemna nieskończoność. Double.NaN; //NaN. Float.NaN; //NaN. K la s y o p a k o w u ją c e Double i F lo a t m a ją m e to d y p o z w a la ją c e n a u s ta le n ie , c z y lic z b a je s t s k o ń c z o n a , n ie s k o ń c z o n a lu b N a N : Double.isFinite(Double.POSITIVE_INFINITY); // Wartość false. Double.isFinite(Double.NEGATIVE_INFINITY); // Wartość false. Double.isFinite(Double.NaN); // Wartość false. D ouble.isFinite(1); // Wartość true. D ouble.isInfinite (Double.POSITIVE_INFINITY); // Wartość true. D ouble.isInfinite (Double.NEGATIVE_INFINITY); // Wartość true. D ouble.isInfinite (Double.NaN); // Wartość false. D ouble.isInfinite(1); // Wartość false. Double.i sNaN(Double.NaN); // Wartość true. Double.isNaN(1); // Wartość false.
Operacje obejmujące encje specjalne W ta b e li 3 .3 p rz e d s ta w io n o w y n ik i o p e ra c ji o b e jm u ją c y c h e n c je s p e c ja ln e . W e w s p o m n ia n y c h o p e ra c ja ch z n a c z e n ie o p e ra n d ó w je s t n a s tę p u ją c e : INF to Double.POSITIVE_INFINITY, -INF to Double.NEGATIVE_INFINITY, n a to m ia s t NAN to Double.NaN. N a p rz y k ła d w k o lu m n ie cz w a rte j (- 0 .0 ) w o sta tn im w ie rsz u (* NAN) o trz y m u je m y w y n ik NaN. A lte r n a ty w n y s p o s ó b z a p is u te g o w ie rs z a p rz e d s ta w ia s ię n a s tę p u ją c o : / / Dane wyjściowe to 'NaN'.
System .out.print((-0.0) * Double.NaN); *
m%
36
|
W ynikiem dowolnej operacji przeprow adzanej na NaN jest NaN. N ie m a czegoś takiego, jak -NaN.
Rozdz ał 3. Typy proste
Tabela 3.3. Operacje obejmujące encje specjalne NF
(- NF)
(-0.0)
Infin ity
-In fin ity
NaN
+ INF
Infin ity
NaN
Infin ity
- INF
NaN
-In fin ity
-In fin ity
/ INF
NaN
NaN
-0.0
* 0.0
NaN
NaN
-0.0
+ 0.0
Infin ity
-In fin ity
0.0
+ 0.5
Infin ity
-In fin ity
0.5
* 0.5
Infin ity
-In fin ity
-0.0
+ (-0.5)
Infin ity
-In fin ity
-0.5
* INF
* (-0.5)
-In fin ity
Infin ity
0.0
+ NAN
NaN
NaN
NaN
* NAN
NaN
NaN
NaN
Promocja liczbow a dla typów podstaw ow ych P ro m o c ja lic z b o w a to z b ió r re g u ł s to s o w a n y c h w o k r e ś lo n y c h w a r u n k a c h w z g lę d e m o p e ra n d ó w o p e ra to ra a ry tm e ty c z n e g o . R e g u ły p ro m o c ji lic z b o w e j s k ła d a ją się z z a ró w n o je d n o a rg u m e n to w y c h , ja k i d w u a rg u m e n to w y c h re g u ł p ro m o c ji.
Jednoargumentowa promocja liczbowa K ie d y ty p p o d sta w o w y je s t c z ęścią w y ra ż e n ia (ja k w y m ie n io n o w ta b e li 3.4), w te d y z a s to s o w a n e z o s ta ją n a s tę p u ją c e r e g u ły p ro m o c ji: • G d y o p erato r je s t typ u byte, short lu b char, zo staje p ro m o w a n y d o ty p u int. • W p rz e c iw n y m r a z ie ty p o p e ra n d u p o z o s ta je n ie z m ie n io n y .
Dwuargumentowa promocja liczbowa K ie d y d w a ró ż n e ty p y p o d sta w o w e s ą p o ró w n y w a n e z a p o m o c ą o p e ra to ró w w y m ie n io n y c h w tab eli 3.5, w ó w c z a s je d e n ty p je s t p ro m o w a n y n a p o d sta w ie p r z e d s ta w io n y c h p o n iż e j re g u ł d w u a rg u m e n to w e j p r o m o c ji lic z b o w e j:
Promocja l czbowa dla typów podstawowych
|
37
Tabela 3.4. Wyrażenie dla reguł jednoargum entow ej prom ocji liczbowej Wyrażen e Ope and jednoa gumentowego ope ato a plus (+) Ope and jednoa gumentowego ope ato a minus (-) Ope and bitowego ope ato a uzupełniania (~) Wszystkie ope ato y p zesunięcia (>> >>> i <<) Wy ażenie indeksu w wy ażeniu dostępu do tablicy Wy ażenie wymia u w wy ażeniu two zenia tablicy • Je ż e li k tó r y k o lw ie k o p e r a n d je s t ty p u double, w ó w c z a s d r u g i (in n y n iż double) ró w n ie ż z o s ta je s k o n w e r to w a n y n a ty p double. • Je ż e li k tó r y k o lw ie k o p e r a n d je s t ty p u f l o a t , w ó w c z a s d ru g i (in n y n iż f l o a t ) ró w n ie ż z o s ta je s k o n w e r to w a n y n a ty p f l o a t . • Je ż e li k tó r y k o lw ie k o p e r a n d je s t ty p u long, w ó w c z a s d ru g i (in n y n iż long) ró w n ie ż z o s ta je s k o n w e r to w a n y n a ty p long. • W p rz e c iw n y m ra z ie o b a o p e ra n d y z o s ta ją s k o n w e rto w a n e n a ty p in t. Tabela 3 .5 . O peratory dla d w u argum entow ej prom ocji liczbowej
Operator
Op s
+i-
Ope ato y dodawania i odejmowania
* / i%
Ope ato y mnożenia dzielenia i eszty z dzielenia
< <= > i>=
Ope ato y po ównywania
== i ! =
Ope ato y ówności i nie ówności
&~i |
Ope ato y bitowe
?:
Ope ato wa unkowy (pat z kolejny punkt w ozdziale)
Specjalne przypadki operatorów warunkowych • Je ż e li je d e n o p e ra n d je st ty p u byte, n a to m ia s t d ru g i short, w ó w c z a s w y ra że n ie w a ru n k o w e ró w n ie ż b ę d z ie ty p u sh o rt: short = true ? byte : short • Je ż e li o p e ra n d R je s t ty p u byte, short lu b char, a d ru g i je s t s ta łą ty p u in t, k tó re j w a rto ś ć m ie śc i się w z a k r e sie R, w ó w c z a s w y ra ż e n ie w a ru n k o w e je s t ty p u R: short = (true ? short : 1967)
38
|
R o zd zał 3. Typy proste
• W p rz e c iw n y m ra z ie z o s ta n ie z a s to s o w a n a d w u a rg u m e n to w a p ro m o cja liczb o w a, a ty p e m w y ra ż e n ia w a ru n k o w e g o b ę d z ie p ro m o w a n y ty p d ru g ie g o i trz e c ie g o o p e ra n d u .
Klasy opakow ujące K a ż d y ty p p o d sta w o w y p o sia d a o d p o w ia d a ją c ą m u k la sę o p a k o w u ją c ą i ty p o d n o ś n ik o w y , k tó re z n a jd u ją s ię w p a k ie c ie ja v a .la n g . P o s z c z e g ó ln e k la s y o p a k o w u ją c e m a ją w ie le m e to d , m ię d z y in n y m i p r z e z n a c z o n y c h d o z w ró c e n ia w a r to ś c i d a n e g o ty p u (p a trz ta b e la 3 .6 ). K la s y o p a k o w u ją c e d la lic z b c a łk o w ity ch i z m ie n n o p rz e cin k o w y c h m o g ą z w ra c a ć w a rto ści w ie lu ró ż n y ch ty p ó w p o d s ta w o w y c h . Tabela 3 .6 . Klasy opakowujące
Typ podstawowy
Typ odnosn kowy
Metody przeznaczone do pob eran a wartośc typów podstawowych
boolean
Boolean
booleanValue()
char
Character
charValue()
byte
Byte
byteValue() shortValue() intValue() longValue() flo at Value() doubleValue()
short
Short
byteValue() shortValue() intValue() longValue() flo at Value() doubleValue()
int
Integer
byteValue() shortValue() intValue() longValue() flo at Value() doubleValue()
long
Long
byteValue() shortValue() intValue() longValue() flo at Value() doubleValue()
fl oat
Fl oat
byteValue() shortValue() intValue() longValue() flo at Value() doubleValue()
double
Double
byteValue() shortValue() intValue() longValue() flo at Value() doubleValue()
Autom atyczne pakow anie i rozpakow yw anie A u t o m a ty c z n e p a k o w a n ie i r o z p a k o w y w a n ie je s t n a jc z ę ś c ie j s to s o w a n e w z g lę d e m k o le k c ji ty p ó w p o d s ta w o w y c h . A u to m a ty c z n e p a k o w a n ie o bej m u je d y n a m icz n ą alok ację p a m ię c i i in icjalizację o b iek tu d la k ażd e g o elem en tu
Automatyczne pakowan e rozpakowywan e
|
39
ty p u p o d sta w o w e g o . Z w ró ć u w ag ę, ż e o b cią ż e n ie z w ią z a n e z a u to m a ty cz n y m p a k o w a n ie m m o ż e c z ęsto b y ć w ię k s z e n iż z sa m y m w y k o n a n ie m ż ą d a n ej o p eracji. Z k o lei ro z p a k o w y w a n ie o zn acza w y g e n e ro w a n ie e lem e n tu typ u p o d s ta w o w e g o d la k a ż d e g o o b ie k tu . O p a r te n a ty p a c h p o d s t a w o w y c h z a d a n ia p r z e p r o w a d z a ją c e in te n s y w n e o b lic z e n ia (n a p rz y k ła d iteracja p rz e z e lem e n ty ty p u p o d sta w o w e g o w k o n te n e rz e ) p o w in n y b y ć w y k o n y w a n e z a p o m o c ą ta b lic ty p u p o d s ta w o w e g o z a m ia s t z u ż y c ie m k o le k c ji o b ie k tó w o p a k o w u ją c y c h .
Automatyczne pakowanie A u to m a ty c z n e p a k o w a n ie o z n a c z a a u to m a ty c z n ą k o n w e rs ję ty p u p o d s ta w o w e g o n a e g z e m p la r z o d p o w ia d a ją c e j m u k la s y o p a k o w u ją c e j. W p r z e d s ta w io n y m p o n iż e j p r z y k ła d z ie w a r to ś ć 147 b ę d z ie a u to m a ty c z n ie s k o n w e rto w a n a n a eg z e m p la rz o d p o w ia d a ją cej je j k la sy o p a k o w u ją cej, p o n ie w a ż k o le k c je p r z e c h o w u ją o d n ie s ie n ia , a n ie w a rto ś c i ty p ó w p o d s ta w o w y c h : //Utworzenie mapy hash dla grup wagi. HashMap weightGroups = new HashMap (); weightGroups.put("welterweight", 147); weightGroups.put("middleweight", 160); weightGroups.put("cruiserweight", 200); P o n iż s z y fra g m e n t k o d u p o k a z u je a k c e p to w a ln y , c h o ć n ie z a le c a n y p rz y k ła d a u to m a ty c z n e g o p a k o w a n ia : // Określenie dopuszczalnej wagi.
Integer weightAllowanceW = 5; // Niepoprawnie.
~TV*~
^
W przedstawionych przykładach nazwy zmiennych klasy opakowującej kończą się na dużą literę W. To nie jest konwencja.
N ie m a p o w o d u w y m u sz a n ia a u to m aty czn eg o p ak o w an ia. D lateg o też p rz e d staw io n e w c z e ś n ie j p o le c e n ie p o w in n o b y ć z a p is a n e n a s tę p u ją c o : Integer weightAllowanceW = new Integer (5);
Rozpakowywanie R o z p a k o w y w a n ie o z n a c z a a u to m a ty c z n ą k o n w e rsję e g z e m p la rz a k la sy op ak o w u jącej n a o d p o w ia d a ją cy m u ty p p o d sta w o w y . W p rz e d sta w io n y m p rz y k ła d z ie ty p o d n o śn ik o w y z o s ta ł p o b ra n y z m a p y h a s h . N a stę p n ie je s t a u to
40
|
Rozdz ał 3. Typy proste
m a t y c z n ie r o z p a k o w y w a n y , a b y m o ż n a g o p r z e d s t a w ić z a p o m o c ą ty p u p o d s ta w o w e g o : / / Pobranie przechowywanej wartości dopuszczalnej wagi.
int weightLimitP = weightGroups.get(middleweight); _**r'
W przedstaw ionych przykładach nazw y zm iennych typu pod stawow ego kończą się na dużą literę P. To nie jest konwencja.
P o n iż s z y fr a g m e n t k o d u p o k a z u je a k c e p to w a ln y , c h o ć n ie z a le c a n y p r z y k ła d ro z p a k o w a n ia : // Określenie dopuszczalnej wagi.
weightLimitP = weightLimitP + weightAllowanceW; Z n a c z n ie le p sz y m ro z w ią z a n ie m je s t z a p isa n ie w y ra ż e n ia z a p o m o c ą m e to d y in tV a lu e (), ja k p r z e d s ta w io n o p o n iż e j: weightLimitP = weightLimitP + weightAllowanceW.intValue();
Automatyczne pakowan e rozpakowywan e
|
41
42
I
Rozdz ał S. Typy proste
ROZDZIAŁ 4.
Typy odnośnikowe
T y p y o d n o ś n ik o w e p r z e c h o w u ją o d n ie s ie n ia d o o b ie k tó w i z a p e w n ia ją d o s tę p d o w s p o m n ia n y c h o b ie k tó w z n a jd u ją c y c h s ię g d z ie ś w p a m ię c i. D o k ła d n y a d re s w p a m ię c i n ie m a z n a c z e n ia d la p r o g r a m is ty . W s z y s tk ie ty p y o d n o ś n ik o w e s ą p o d k la s a m i ty p u ja v a .la n g .O b je c t. W ta b e li 4.1 w y m ie n io n o p ię ć ty p ó w o d n o ś n ik o w y c h Ja v y . Tabela 4 .1 . T yp y odnośnikowe
Typ odnośn kowy
Krótk op s
Adnotacja
Zapewnia możliwość powiązania metadanych (czyli danych opisujących dane) z elementami p og amu
Tablica
Zapewnia stałej wielkości st uktu ę danych p zeznaczoną do p zechowywania elementów tego samego typu
Klasa
Zap ojektowana w celu zapewnienia obsługi dziedziczenia polimo fizmu i he metyzacji Z eguły p zedstawia coś zeczywistego i składa się z zestawu wa tości p zechowujących dane o az zestawu metod ope ujących na wspomnianych danych
Wyliczenie
Odniesienie dla zbio u obiektów p zedstawiających powiązane ze sobą elementy
nte fejs
Zapewnia publiczne AP ijest „implementowany” p zez klasy Javy
43
Porów nanie typów odnośnikow ych i podstaw ow ych W Jav ie istnieją d w ie kateg o rie typ ów : o d n o śn ik o w e i p o d staw o w e. W tabeli 4.2 w y m ie n io n o n a jw a ż n ie js z e ró ż n ic e m ię d z y n im i. W ię ce j in fo rm a c ji n a te m a t ty p ó w p r z e d s ta w io n o w ro z d z ia le 3. Tabela 4 .2 . T yp y odnośnikowe w porów naniu do podstawowych
Typy odnośn kowe
Typy podstawowe
Nieog aniczona liczba typów odnośnikowych zdefiniowanych p zez użytkownika
Składa się z typów bool ean i liczbowych char byte short int long float i double
Ad es w pamięci p zechowuje odniesienie do danych
Ad es w pamięci p zechowuje zeczywiste dane typu podstawowego
Kiedy typ odnośnikowy jest p zypisywany innemu typowi odnośnikowemu wtedy oba p owadzą do tego samego obiektu
Kiedy wa tość typu podstawowego jest p zypisywana innej zmiennej tego samego typu wtedy two zona jest kopia wa tości
Kiedy obiekt jest p zekazywany metodzie wywołana metoda może zmienić zawa tość ot zymanego obiektu ale nie jego ad es
Kiedy typ podstawowy jest p zekazywany metodzie tak nap awdę p zekazywana jest jedynie jego kopia Wywoływana metoda nie ma dostępu do o yginalnej wa tości typu podstawowego i dlatego nie może jej zmienić Wywoływana metoda może zmienić skopiowaną wa tość
W artości dom yślne W a rto ś ć d o m y ś ln a to ta k a , k tó ra je s t p rz y p isy w a n a e g z e m p la rz o w i z m ie n n e j w Ja v ie , g d y n ie z o sta n ie w y ra ź n ie z d e fin io w a n a w a rto ś ć in icja liz a cy jn a .
Obiekty zmiennych egzemplarza i lokalnych Z m ie n n e e g z e m p la r z a (to z n a c z y z d e fin io w a n e n a p o z io m ie k la s y ) m a ją w a r to ś ć d o m y ś ln ą n u ll, k tó ra p o p ro s tu o z n a c z a b r a k w a rto ś c i. Z m ie n n e lo k a ln e (to z n a c z y z d e fin io w a n e w m e to d z ie ) n ie m a ją w a r to ś c i d o m y ś ln y c h , n ie m a ją n a w e t p r z y p is a n e j w a r to ś c i n u ll. Z p o w o d u b ra k u w s p o m n ia n y c h w a rto ś ci d o m y ś ln y c h z m ie n n e lo k a ln e z a w s z e n a le ż y in icja liz o w a ć . P ró b a u ż y c ia n ie z a in ic ja liz o w a n e j z m ie n n e j lo k a ln e j o b ie k tu (d o ty c z y to ró w n ie ż s p r a w d z e n ia p o d k ą te m w a r to ś c i n u ll) s p o w o d u je w y s tą p ie n ie b łę d u p o d c z a s k o m p ila c ji.
44
|
Rozdz ał 4. Typy odnośn kowe
W p r a w d z ie z a w ie r a ją c e w a r to ś ć null o d n ie s ie n ia d o o b ie k tó w n ie p ro w a d z ą d o ż a d n y c h o b ie k tó w n a s to s ie , a le d o o b ie k tó w z p rz y p is a n y m i w a r to ś c ia m i null m o ż n a s ię o d w o ły w a ć w k o d z ie i n ie p o w o d u je to w y s tą p ie n ia b łę d ó w w tra k c ie k o m p ila c ji lu b w y k o n y w a n ia p r o g r a m u : Date dateOfParty = null; // Ten kod zostanie skompilowany.
i f (dateOfParty == null) { } W y w o ła n ie m e to d y w z g lę d e m z m ie n n ej o w a rto ści null lu b u ż y cie w ob iek cie s k ład n i o p artej n a o p e ra to rz e k ro p k i s p o w o d u je z g ło sz en ie w y ją tk u ja v a . l ang. ^ N u llP o in te rE x ce p tio n : private s ta tic int MAX_LENGTH = 20; String theme = null; //Zgłoszenie wyjątku, ponieważ wartością theme jest null. i f (theme.length() > MAX_LENGTH) { }
Tablice T a b lic e z a w s z e m a ją p rz y p isa n ą w a rto ś ć d o m y śln ą , g d y są d e k la ro w a n e ja k o z m ie n n e e g z e m p la rz a lu b lo k a ln e . W p rz y p a d k u z a d e k la ro w a n ia ta b licy , ale je j n ie z a in ic ja liz o w a n ia w a r to ś c ią d o m y ś ln ą b ę d z ie n u ll. W p rz e d s ta w io n y m p o n iż e j fr a g m e n c ie k o d u n a s tę p u je in ic ja liz a c ja ta b lic y gam eListl, a le n ie p o s z c z e g ó ln y c h w a rto ś c i. O z n a c z a to , ż e o d n ie s ie n ia d o o b ie k tó w b ę d ą m ia ły w a rto ś ć n u ll. O b ie k ty trz e b a d o p ie ro d o d a ć d o tab licy : //Zadeklarowane tablice o nazwach gameListl i gameList2 / / zostały zainicjalizowane i domyślnie mają wartość null. Game[] gameListl; Game gameList2 []; //Poniższa tablica została zainicjalizowana, ale / / odniesienia do obiektów nadal mają wartość null, // ponieważ tablica nie zawiera jeszcze obiektów.
gameListl = new Game[10]; //Dodanie obiektu Game do listy. // Teraz lista ma jeden obiekt.
gameList1[0] = new Game();
Wartość domyślne
|
45
W Ja v ie ta b lic e w ie lo w y m ia ro w e w rz e c z y w is to ś c i s ą ta b lic a m i ta b lic . M o g ą b y ć in ic ja liz o w a n e z a p o m o c ą o p e ra to ra new lu b p rz e z p o d a n ie ich w a rto ś c i w n a w ia s a c h k w a d ra to w y c h . T a b lic e w ie lo w y m ia ro w e m o g ą , ale n ie m u sz ą b y ć je d n a k o w e . / / Tablica anonimowa.
int twoDimensionalArray[][] = new in t[6 ][6 ]; twoDimensionalArray[0][0] = 100; int threeDimensionalArray[][][] = new int[2] [2 ][2 ]; threeDimensionalArray[0][0][0] = 200; int varDimensionArray[][] = { { 0 ,0 } ,{ 1 ,1 ,1 } ,{ 2 ,2 ,2 ,2 } } ; varDimensionArray[0][0] = 300; T ab lice a n o n im o w e p o z w a la ją n a tw o rzen ie n o w y ch tablic w arto ści w d o w ol n y m m ie js c u k o d u : / / Przykłady użycia tablic anonimowych.
int[] luckyNumbers = new in t [] {7, 13, 21}; int totalWinnings = sum(new in t[] {3000, 4500, 5000});
Konw ersja typów odnośnikow ych O b ie k t m o ż e b y ć s k o n w e rto w a n y n a ty p je g o k la s y n a d rz ę d n e j (k o n w e rsja ro z s z e r z a ją c a ) lu b d o w o ln e j p o d k la s y (k o n w e r s ja z a w ę ż a ją c a ). K o m p ila to r sp ra w d z a d a n ą k o n w e rsję w tra k cie k o m p ila c ji, n a to m ia s t w irtu a ln a m a s z y n a Ja v y (ang . Java V irtu a l M a ch in e ) p rz e p ro w a d z a k o n w e rsję p o d cz a s w y k o n y w a n ia p ro g ra m u .
Konwersje rozszerzające O to c e c h y c h a ra k te r y s ty c z n e k o n w e rs ji r o z s z e r z a ją c e j: • K o n w e rsja ro z sz e rz a ją ca p o w o d u je sk o n w e rto w a n ie p o d k la sy n a je j k lasę n a d r z ę d n ą (s u p e rk la s ę ). • K o n w e r s ja r o z s z e r z a ją c a n ie p o w o d u je z g ła s z a n ia w y ją tk ó w w tra k c ie w y k o n y w a n ia p ro g ra m u . • N ie je s t w y m a g a n e w y r a ź n e rz u to w a n ie : String s = new S trin g (); Object o = s; //Konwersja rozszerzająca.
46
|
R o zd zał 4. Typy odnośnkowe
Konwersja zawężająca O to c e c h y c h a ra k te r y s ty c z n e k o n w e rs ji z a w ę ż a ją c e j: • K o n w e rsja z a w ę ż a ją ca p o w o d u je sk o n w e rto w a n ie ty p u o g ó ln e g o n a b a r d ziej s z c z e g ó ło w y . • K o n w e rs ja z a w ę ż a ją c a p o w o d u je s k o n w e r to w a n ie k la s y n a d rz ę d n e j n a p o d k la s ę . • W y m a g a n e je s t u ż y c ie w y ra ź n e g o rz u to w a n ia . A b y p rz e p ro w a d z ić rzu to w a n ie o b ie k tu n a in n y , d o c e lo w y ty p n a le ż y p o d a ć w n a w ia s ie tu ż p r z e z r z u to w a n y m o b ie k te m . • N ie p r a w id ło w a k o n w e r s ja z a w ę ż a ją c a p o w o d u je z g ło s z e n ie w y ją tk u C lassC astE xcep tion. • K o n w e rs ja z a w ę ż a ją c a m o ż e p o w o d o w a ć u tr a tę d a n y c h lu b p re c y z ji. O b ie k ty n ie m o g ą b y ć r z u to w a n e n a z u p e łn ie d o w o ln y ty p , c z y li in n y n iż ty p k la s y n a d rz ę d n e j lu b je d n e j z je g o p o d k la s . W p rz y p a d k u te g o ro d z a ju p ró b y w trak cie k o m p ila cji n a stą p i w y g e n e ro w a n ie b łęd u in con vertible types. P o n iż e j p rz e d s ta w io n o p r z y k ła d k o n w e rs ji, k tó ra z a k o ń c z y s ię w y g e n e r o w a n ie m w y m ie n io n e g o b łę d u z e w z g lę d u n a n ie z g o d n o ś ć ty p ó w : Object c = new O bject(); String d = (Integer) c; //Błąd w trakcie kompilacji.
Konw ersja m iędzy typam i podstaw ow ym i i odnośnikow ym i A u to m a ty cz n a k o n w e rsja ty p ó w p o d sta w o w y ch n a o d n o śn ik o w e i n a o d w ró t n o s i n a z w ę o d p o w ie d n io a u to m a ty c z n e g o p a k o w a n ia i r o z p a k o w y w a n ia . W ię c e j in fo rm a c ji n a te n te m a t p rz e d s ta w io n o w ro z d z ia le 3.
Przekazanie typu odnośnikow ego m etodzie K ie d y o b ie k t je s t p r z e k a z y w a n y m e to d z ie ja k o z m ie n n a , w te d y : • N a s tę p u je p r z e k a z a n ie k o p ii o d n ie s ie n ia d o z m ie n n e j, a n ie r z e c z y w i s te g o o b ie k tu . • K o m p o n e n t w y w o łu ją cy i w y w o ły w a n e m e to d y m a ją id e n ty cz n e k o p ie o d n ie s ie n ia .
Przekazan e typu odnośn kowego metodz e
|
47
• K o m p o n e n t w y w o łu ją cy b ę d z ie „ w id z ia ł" w s z e lk ie z m ia n y , ja k ie w y w o ły w a n a m e to d a w p r o w a d z a w o b ie k c ie . P rz e k a z a n ie k o p ii o b ie k tu d o w y w o ły w a n e j m e to d y c h ro n i p r z e d w p r o w a d z e n ie m w s p o m n ia n y c h z m ia n w o r y g in a ln y m o b ie k c ie . • W y w o ły w a n a m e to d a n ie m o ż e z m ie n ić a d re s u o b ie k tu , n a to m ia s t m a m o ż liw o ś ć m o d y fik a c ji z a w a r to ś c i o b ie k tu . W p o n iż s z y m p r z y k ła d z ie z ilu s tr o w a n o p r z e k a z y w a n ie m e to d o m ty p ó w o d n o śn ik o w y c h i p o d sta w o w y c h o raz e fe k t d la w s p o m n ia n y ch ty p ó w , g d y z o s ta n ą z m ie n io n e p rz e z w y w o ły w a n ą m e to d ę : void roomSetup() { / / Przekazanie odniesienia.
Table table = new Table(); table.setLength(72); //Długość zostanie zmieniona. modTableLength(table); //Przekazanie typu podstawowego. // Wartość chairs nie ulega zmianie.
int chairs = 8; modChairCount(chairs); } void modTableLength(Table t) { t.setLength(36); } void modChairCount(int i) { i = 10; }
Porów nyw anie typów odnośnikow ych Ja v a p o zw ala n a p o ró w n y w a n ie ty p ó w o d n o śn ik o w y ch . D o p o ró w n a ń m o ż n a w y k o r z y s ta ć o p e ra to ry ró w n o ś c i i m e to d ę e q u a ls ().
Użycie operatorów równości O p e ra to ry ró w n o ści (!= i ==) są u ż y w a n e d o p o ró w n y w a n ia lo kacji w p a m ię ci d w ó ch o b iek tó w . Je ż e li p o ró w n y w a n e a d re sy o b iek tó w są ta k ie sam e, w ó w czas o b ie k ty s ą u z n a w a n e z a je d n a k o w e . W s p o m n ia n e o p e ra to ry ró w n o ś c i n ie s ą s to s o w a n e p o d c z a s p o ró w n y w a n ia z a w a r to ś c i d w ó c h o b ie k tó w . W p o n iż s z y m p r z y k ła d z ie g u e s tl i g u est2 m a ją te n s a m a d r e s w p a m ię c i, a w ię c d a n e w y jś c io w e to k o m u n ik a t Obiekty są ta k ie same:
48
|
Rozdz ał 4. Typy odnośn kowe
Guest guest1= new Guest("name"); Guest guest2= guest1; i f (guest1 == guest2) System.out.println("Obiekty są takie same.") Z k o le i w p o n iż sz y m p rz y k ła d z ie a d re sy w p a m ię c i są ró ż n e i d la te g o d an e w y jś c io w e to k o m u n ik a t Obiekty n ie są ta k ie same: Guest guest3= new Guest("name"); Guest guest4= new Guest("name"); i f (guest3 == guest4) System.out.println("Obiekty są takie same.") else System.out.println("Obiekty nie są takie same.")
Użycie metody equals() W celu p o ró w n a n ia z a w a rto ści d w ó ch o b iek tó w klas m o ż n a n a d p isa ć m e to d ę e q u a ls () k la s y O b ject. K ie d y n a d p is y w a n a je s t m e to d a e q u a ls (), w ó w c z a s n a le ż y n a d p is a ć ta k ż e m e to d ę hashCode(). T o je s t w s k a z a n e w c e lu z a c h o w a n ia z g o d n o ś c i z k o le k c ja m i o p a rty m i n a w a r to ś c ia c h h a s h , n a p rz y k ła d HashMap() i H ashSet().
N a p rz y k ła d , je śli ch ce sz p o ró w n a ć w a rto ści zn a jd u ją ce się w d w ó ch e g z e m p la r z a c h te j s a m e j k la s y , w t e d y p o w in ie n e ś z a s t o s o w a ć p r e d e f in io w a n ą m e to d ę e q u a ls ().
Porównywanie ciągów tekstowych W Ja v ie is tn ie ją d w a s p o s o b y s p ra w d z e n ia , c z y c ią g i te k s to w e s ą je d n a k o w e . Je d n a k d e fin ic ja „ r ó w n o ś c i" je s t in n a w p o s z c z e g ó ln y c h s p o s o b a c h . Je ż e li c e le m je s t p o r ó w n a n ie s e k w e n c ji z n a k ó w z n a jd u ją c y c h s ię w d w ó c h c ią g a c h te k s to w y c h , w te d y n a le ż y u ż y ć m e to d y e q u a ls (): • M e to d a eq u als() p o w o d u je p o ró w n a n ie d w ó ch c ią g ó w te k s to w y c h z n a k p o z n a k u i n a te j p o d s ta w ie u s ta le n ie , c z y s ą ta k ie s a m e . T o n ie je s t d o m y śln a im p le m e n ta cja m e to d y equ als() d o starczan e j p rz e z k lasę O bject, a ra c z e j n a d p is a n a w e rs ja z a im p le m e n to w a n a w k la s ie S trin g . • O p e r a to r === s p ra w d z a , c z y d w a o d n ie s ie n ia d o o b ie k tó w p r o w a d z ą d o te g o s a m e g o e g z e m p la r z a o b ie k tu .
Porównywan e typów odnośn kowych
|
49
P o n iż e j z n a jd u je s ię p ro g ra m p o k a z u ją c y , ja k c ią g i te k s to w e są p o r ó w n y w a n e z a p o m o c ą m e to d y e q u a ls () i o p e ra to ra ===. W ię c e j in fo rm a c ji d o ty c z ą c y c h a n a liz y c ią g ó w te k s to w y c h p rz e d s ta w io n o w ro z d z ia le 2. class MyComparisons { //Dodanie ciągu tekstowego do puli. String f i r s t = "chairs"; //Użycie ciągu tekstowego z puli. String second = "chairs"; // Utworzenie nowego ciągu tekstowego.
String third = new String ("ch airs"); void myMethod() { //Choć wydaje się to dziwne, wynikiem poniższego // porównania jest wartość true. Sprawdź to!
i f (f ir s t == second) { System .ou t.println("first == second"); } //Wynikiem poniższego wywołania jest wartość true. i f (first.equals(second)) { System.out.println("Elementy f i r s t i second są jednakowe."); } // Wynikiem poniższego wywołania jest wartość false.
i f (f ir s t == third) { System .ou t.println("first == th ird "); } // Wynikiem poniższego wywołania jest wartość true.
i f (first.e q u a ls(th ird )) { System.out.println("Elementy f i r s t i third są jednakowe."); } } / / Koniec myMethod(). } //Koniec klasy. Obiekty klasy String są niem odyfikow alne. Z kolei obiekty klas StringBuffer i Stri ngBuil der m ożna m odyfikować.
Porównywanie wyliczeń W a r to ś c i enum m o ż n a p o r ó w n y w a ć z a p o m o c ą o p e ra to ra == lu b m e to d y e q u a ls (), p o n ie w a ż w o b u p rz y p a d k a c h o trz y m u je m y te n sam w y n ik . P o d cz a s p o ró w n y w a n ia w y lic z e ń c z ę ś c ie j s p o ty k a s ię u ż y c ie o p e ra to ra ==.
50
|
Rozdz ał 4. Typy odnośn kowe
Kopiow anie typów odnośnikow ych W tr a k c ie k o p io w a n ia ty p u o d n o ś n ik o w e g o n a s t ę p u je u t w o r z e n ie k o p ii o d n ie s ie n ia d o o b ie k t u lu b r z e c z y w is t e j k o p ii o b ie k tu , c z y li u tw o r z e n ie n o w e g o o b ie k tu . W Ja v ie d ru g a z w y m ie n io n y c h m o ż liw o ś c i n o s i n a z w ę klonow ania.
Kopiowanie odniesienia do obiektu W y n ik ie m o p eracji k o p io w a n ia o d n ie sien ia d o o b iek tu je s t o b ie k t p o siad ający d w a o d n ie sien ia . W p o n iż s z y m p rz y k ła d z ie n a s tę p u je p rz y p isa n ie o b iek to w i closingSong o d n ie s ie n ia d o o b ie k tu w s k a z y w a n e g o p rz e z lastSong . W s z e l k ie z m ia n y w p r o w a d z o n e w lastSo ng b ę d ą o d z w ie r c ie d lo n e w closingSong i n a o d w ró t: Song lastSong = new Song(); Song closingSong = lastSong;
Klonowanie obiektów W y n ik ie m k lo n o w a n ia je s t in n a k o p ia o b iek tu , a n ie je d y n ie k o p ia o d n iesien ia d o o b ie k tu . K lo n o w a n ie n ie je s t d o m y ś ln ie o fe ro w a n e p rz e z k la s y . N a le ż y p a m ię t a ć , ż e k lo n o w a n ie to n a jc z ę ś c ie j b a r d z o s k o m p lik o w a n a o p e r a c ja i d la te g o w a rto r o z w a ż y ć u ż y c ie k o n s tru k to ra k o p iu ją c e g o : • A b y k la s ę m o ż n a b y ło k lo n o w a ć , m u s i o n a im p le m e n to w a ć in te r fe js Cloneable. • C h ro n io n a m e to d a c lo n e () p o z w a la n a k lo n o w a n ie o b ie k tó w . • W celu k lo n o w a n ia o b iek tu in n e g o n iż d a n y o b ie k t k o n ie c z n e je s t n a d p i sa n ie m e to d y c lo n e (), k tó ra p o w in n a b y ć p u b licz n ie u d o s tę p n ia n a p rz e z k lo n o w a n y o b ie k t. • P o d c z a s k lo n o w a n ia tr z e b a s t o s o w a ć r z u t o w a n ie , p o n ie w a ż m e to d a c lo n e () z w ra c a ty p o b je c t. • K lo n o w a n ie m o ż e z g ło s ić w y ją te k CloneNotSupportedException.
Klonowanie płytkie i głębokie W Ja v ie m a m y d w a ro d z a je k lo n o w a n ia : p ły tk ie i g łę b o k ie .
Kopowane typów odnośn kowych
|
51
W p rz y p a d k u k lo n o w a n ia p ły tk ie g o k o p io w a n e s ą w a rto ści ty p ó w p o d sta w o w y ch i o d n iesien ia w k lo n o w an y m o b iek cie. N ie są tw o rz o n e k o p ie o b iek tów , d o k tó ry c h p r o w a d z ą w s p o m n ia n e o d n ie s ie n ia . W p o n iż s z y m fra g m e n c ie k o d u e g z e m p la rz o w i leadingSong z o sta n ą p rz y p i s a n e w a r to ś c i length i y ear, p o n ie w a ż to ty p y p o d s ta w o w e . P o n a d to p r z y p is a n e b ę d ą o d n ie s ie n ia t i t l e i a r t i s t , p o n ie w a ż to s ą ty p y o d n o ś n i kow e: Class Song { String t i t l e ; A rtist a r tis t ; flo a t length; int year; void setData() { . . . } } Song firstSong = new Song(); try { // Utworzenie rzeczywistej kopii przez klonowanie.
Song leadingSong = (Song)firstSong.clone(); } catch (CloneNotSupportedException cnse) { cnse.printStackTrace(); } // Koniec. W p rz y p a d k u k lo n o w a n ia g łę b o k ie g o k lo n o w a n y o b ie k t p o sia d a k o p ie k aż d eg o p o la o b ie k tu , łą c z n ie z e w s z y s tk im i o b ie k ta m i, d o k tó ry c h p ro w a d z ą o d n ie s ie n ia . M e to d a k lo n o w a n ia g łę b o k ie g o m u si b y ć z d e fin io w a n a p rz e z p ro g ra m istę, p o n ie w a ż A P I Ja v y n ie d o starcza te g o ro d z a ju m e to d y . A lte rn a ty w ą d la k lo n o w a n ia g łę b o k ie g o je s t z a s to s o w a n ie seria liz a cji i k o n stru k to ró w k o p iu ją c y c h . (U ż y c ie k o n s tru k to ró w k o p iu ją c y c h n a jc z ę ś c ie j je s t b a r d z ie j p re fe ro w a n y m r o z w ią z a n ie m n iż p r z e p r o w a d z a n ie s e ria liz a c ji).
Alokacja pamięci i usuw anie nieużytków w przypadku typów odnośnikow ych U tw o rz e n ie n o w e g o o b ie k tu o z n a c z a a lo k a c ję p a m ię c i. W p rz y p a d k u b ra k u o d n ie s ie ń d o o b ie k tu z a jm o w a n a p rz e z n ie g o p a m ię ć m o ż e b y ć o d z y s k a n a w trak cie d ziałan ia m e ch a n iz m u u su w a n ia n ie u ż y tk ó w (ang. garbage collection ). W ię c e j in fo rm a c ji n a te n te m a t z n a jd z ie s z w ro z d z ia le 11.
52
|
Rozdz ał 4. Typy odnośn kowe
ROZDZIAŁ 5.
Programowanie zorientowane obiektowo
P o d sta w o w e elem en ty p ro g ra m o w a n ia zo rie n to w an e g o ob iek to w o (ang. objecto r i e n t e d p ro g r a m m in g , O O P ) w Ja v ie o b e jm u ją k la s y , o b ie k ty i in te rfe jsy .
Klasy i obiekty Klasa d efin iu je en cję , k tó ra n a jcz ę ściej p rz e d sta w ia co ś rz e cz y w iste g o . W k la
sie z n a jd u je s ię z e s ta w w a rto ś c i p r z e c h o w u ją c y c h d a n e o ra z z e s ta w m e to d p r z e z n a c z o n y c h d o o p e ro w a n ia n a w s p o m n ia n y c h d a n y c h . E g z e m p la rz k la s y n o s i n a z w ę o biek tu i je s t a lo k o w a n y w p a m ię c i. W d a n e j c h w ili m o ż e is tn ie ć w ie le e g z e m p la r z y k la s y . K lasa m o ż e d z ie d z icz y ć d a n e sk ła d o w e i m e to d y p o in n y ch k lasach . P o n ad to k la s a m o ż e b e z p o ś r e d n io d z ie d z ic z y ć ty lk o p o je d n e j k la s ie , n a z y w a n e j superklasą. D a n a klasa m o ż e m ie ć ty lk o je d n ą b e z p o śre d n ią su p erk lasę. T o je st
o k r e ś la n e m ia n e m d z ied z icz en ia . P o d c z a s im p le m e n ta c ji k la s y je j w e w n ę tr z n e s z c z e g ó ły p o w in n y p o z o s ta ć p r y w a tn e (d z ię k i u ż y c iu m o d y fik a to ra d o s tę p u p riv a te ) i d o s tę p n e je d y n ie z a p o m o c ą in te rfe js ó w p u b lic z n y c h . T e g o ro d z a ju p o d e jś c ie je s t n a z y w a n e h erm ety z a cją . Z g o d n ie z k o n w e n c ją Ja v a B e a n m e to d y a k c e s o r a i m u ta to r a
(n a p rz y k ła d getFirstName() i setFirstN am e("Leonardina")) są u ż y w a n e w celu u z y sk a n ia p o śre d n ie g o d o stę p u d o e lem e n tó w k la sy i u n ie m o ż liw ien ia in n y m k la s o m m o d y fik a c ji e le m e n tó w p r y w a t n y c h d a n e j k la s y . Z w r o t w a r t o ś c i
53
n ie m o d y fik o w a ln y ch (n a p rz y k ła d c ią g ó w te k sto w y ch , w a rto ś ci ty p ó w p o d sta w o w y c h i o b ie k tó w c e lo w o u c z y n io n y c h n ie m o d y fik o w a ln y m i) to k o le jn y s p o s ó b o c h r o n y e le m e n tó w s k ła d o w y c h p rz e d ic h m o d y fik a c ją p rz e z in n e o b ie k ty .
Składnia klasy K la s a p o s ia d a s y g n a tu r ę , o p c jo n a ln e k o n s t r u k t o r y , m e t o d y i e le m e n t y s k ła d o w e : [modyfikatoryDostępuJavy] class nazwaKlasy [extends dowolnaSuperKlasa] [implements listaIn terfejsów rozdzielonych przecinkami] { / / Dane składowe. // Konstruktory. //Metody.
}
Utworzenie egzemplarza klasy (obiektu) O b ie k t je s t e g z e m p la rz e m k la sy . P o u tw o rz e n iu o b iek ty m a ją w ła sn e z e sta w y m e to d i d a n y c h s k ła d o w y c h : / / Przykładowe definicje klas.
public class Candidate { . . . } class Stats extends ToolSet { . . . } public class Report extends ToolSet implements Runnable { . . . } P o s z c z e g ó ln e o b ie k ty k la s y Candidate s ą tw o rz o n e z a p o m o c ą s ło w a k lu cz o w e g o new: Candidate candidate1 = new Candidate(); Candidate candidate2 = new Candidate();
Metody i dane składowe D a n e sk ła d o w e , n a z y w a n e ta k ż e p o la m i, p rz e c h o w u ją d a n e d o ty cz ą c e klasy. N ie s ta ty c z n e d a n e sk ła d o w e s ą n a z y w a n e ró w n ie ż z m ie n n y m i eg ze m p larza: [modyfikatoryDostępuJavy] typ nazwaDanychSkładowych M e to d y d z ia ła ją n a d a n y c h k la sy : [modyfikatoryDostępuJavy] typ nazwaMetody(listaParametrów) [throws listaWyjątkówRozdzielonychPrzecinkami] { / / Polecenia tworzące metodę.
}
54
|
R o zd zał 5. Programowane zorentowane obektowo
P o n iż e j p rz e d sta w io n o p rz y k ła d k la sy Candidate w ra z z m e to d a m i i d a n y m i s k ła d o w y m i: public class Candidate { / / Dane składowe, czyli pola.
private String firstName; private String lastName; private int year; // Metody.
public void setYear (int y) {year = y;} public String getLastName() {return lastName;} } // Koniec klasy Candidate.
Uzyskanie dostępu do metod i danych składowych w obiekcie O p e r a to r w p o s ta c i k r o p k i ( . ) je s t u ż y w a n y w c e lu u z y s k a n ia d o s tę p u d o m e to d i d a n y c h s k ła d o w y c h w o b ie k c ie . P o d c z a s u z y s k iw a n ia d o s tę p u d o m e to d i d a n y c h sk ła d o w y c h w e w n ą trz o b ie k tu n ie m a k o n ie c z n o śc i k o rz y sta n ia z o p e ra to ra w p o s ta c i k ro p k i. candidate1.setYear(2016); String name = getFirstName() + getLastName();
Przeciążanie M e to d y i k o n s tr u k to r y m o g ą b y ć p r z e c ią ż a n e . W s p o m n ia n e p r z e c ią ż e n ie o z n a c z a , ż e d w ie lu b w ię c e j m e to d m a tę s a m ą n a z w ę , a le ró ż n e s y g n a tu ry (p a r a m e tr y i w a r t o ś ć z w r o tn ą ). N a le ż y p a m ię ta ć , ż e p r z e c ią ż o n e m e to d y m u s z ą m ie ć r ó ż n e p a r a m e tr y o ra z ty p y w a r to ś c i z w r o tn e j. Z m ia n a je d y n ie ty p u w a rto ś c i z w ro tn e j n ie je st p rz e c ią ż e n ie m . M o d y fik a to ry d o stę p u p rz e c ią ż a n y c h m e to d m o g ą b y ć r ó ż n e : public class VotingMachine { public void startUp() { . . . } private void startUp(int delay) { . . . } } K ie d y m e to d a je s t p r z e c ią ż o n a , je j p o s z c z e g ó ln e s y g n a tu r y m o g ą z g ła s z a ć ró ż n e s p ra w d z a n e w y ją tk i: private String startUp(D istrict d) throws new IOException { . . . }
Klasy ob ekty
|
55
Nadpisywanie P o d k la s a m o ż e n a d p is y w a ć d z ie d z ic z o n e m e to d y . P o d c z a s n a d p is y w a n ia m e to d a z a w ie ra tę s a m ą sy g n a tu rę (n a z w a i p a ra m e try ), ja k m e to d a z n a jd u ją c a s ię w s u p e rk la s ie , a le c h a ra k te r y z u je s ię in n y m i s z c z e g ó ła m i d o ty c z ą c y m i im p le m e n ta c ji. P o n iż e j p r z e d s t a w io n o p r z y k ła d n a d p is a n ia w k la s ie TouchScreenD isplay m e to d y sta rtU p () z s u p e rk la s y Display: public class Display { void startUp(){ System.out.println("Użycie wyświetlacza bazowego."); } } public class TouchScreenDisplay extends Display { void startUp() { System.out.println("Użycie nowego wyświetlacza."); } } R e g u ły d o ty c z ą c e n a d p is y w a n ia m e to d są n a s tę p u ją c e : • N a d p is a ć m o ż n a m e to d y in n e n iż f i n a l , p riv a te lu b s t a t i c . • M e to d y c h ro n io n e m o g ą n a d p isy w a ć m e to d y n ie p o sia d a ją ce m o d y fik a to ró w d o stę p u . • M e to d a n a d p isu ją ca m o ż e m ie ć z n a c z n ie b ard ziej re stry k cy jn y m o d y fi k a to r d o stę p u (n a p rz y k ła d package, public, p riv ate, protected) n iż m e to d a n a d p is y w a n a . • N a d p isy w a n a m e to d a n ie m o ż e z g ła sz a ć ż a d n y c h n o w y ch sp ra w d z a n y ch w y ją tk ó w .
Konstruktory W y w o ła n ie k o n stru k to ra n a s tę p u je p o u tw o rz e n iu o b iek tu ; je s t o n o d p o w ie d z ia ln y z a in ic ja liz a c ję d a n y c h w n o w o u tw o r z o n y m o b ie k c ie . K o n s tru k to r je s t o p cjo n a ln y , m a d o k ła d n ie ta k ą sa m ą n a z w ę ja k k lasa, n a to m ia s t w p rz e c iw ie ń stw ie d o m e to d n ie z a w ie ra p o le c e n ia retu rn . W k la s ie m o ż e z n a jd o w a ć s ię w ie le k o n s t r u k t o r ó w . W tr a k c ie tw o r z e n ia n o w e g o o b iek tu n a stę p u je w y w o ła n ie k o n stru k to ra, k tó re g o sy g n atu ra zo staje d o p a so w a n a :
56
|
R o zd zał 5. Programowane zorentowane obektowo
public class Candidate { Candidate(int id) { th is.id e n tifica tio n = id; } Candidate(int id, int age) { th is.id e n tifica tio n = id; this.age = age; } } //Utworzenie nowego egzemplarza klasy Candidate i wywołanie jej konstruktora. Candidate candidate = new Candidate(id); Je ż e li w k la sie n ie z o sta ł w y ra ź n ie z d e fin io w a n y k o n stru k to r, w te d y n a stą p i p o ś re d n ie u ż y c ie k o n stru k to ra p o z b a w io n e g o a rg u m e n tó w . W ty m m ie js c u p a m ię ta j o je d n y m : z d e fin io w a n ie k o n s tru k to ra z a r g u m e n ta m i p o w o d u je , że k la sa n ie b ę d z ie z a w ie ra ła k o n stru k to ra p o z b a w io n e g o a rg u m e n tó w , o ile n ie z o s ta n ie w y r a ź n ie d o d a n y .
Superklasy i podklasy W Ja v ie k la s a (n a z y w a n a podklasę) m o ż e b e z p o ś r e d n io d z ie d z ic z y ć p o je d n ej k la sie (n azy w an e j su p erk la sę). S ło w o k lu cz o w e extends w s k a z u je n a d z ie d z ic z e n ie m e to d i d a n y c h s k ła d o w y c h p o in n e j k la s ie . P o d k la s y n ie m a ją b e z p o ś r e d n ie g o d o s tę p u d o e le m e n tó w p r y w a tn y c h (p riv a te ) s u p e r k la s y , n a t o m ia s t m a ją d o s tę p d o e le m e n tó w p u b lic z n y c h (publ ic ) i c h r o n io n y c h (protected) su p erk lasy. P o n ad to p o d k lasa m a d o stęp d o elem en tó w su p erk lasy w s p ó łd z ie lo n y c h p r z e z te n s a m p a k ie t (p a ck a ge-p riv a te 1 lu b p ro te cted ). Ja k w c z e ś n ie j w s p o m n ia n o , m e t o d y a k c e s o r a i m u ta to r a z a p e w n ia ją m e c h a n iz m p o ś r e d n ie g o d o s tę p u d o e le m e n tó w p r y w a tn y c h k la s y , w ty m ta k ż e s u p e rk la s y : public class Machine { boolean sta te ; void setState(boolean s) {state = s ;} boolean getState() {return s ta te ;} } public class VotingMachine extends Machine { }
1 Zapis package-private oznacza po prostu brak wyraźnie zdefiniowanego modyfikatora dostępu — przyp. tłum.
Klasy ob ekty
|
57
S ło w o k lu c z o w e super w d o m y ś ln y m k o n stru k to rz e k la sy Curtain je s t u ż y w a n e w c e lu u z y s k a n ia d o s tę p u d o m e to d s u p e r k la s y n a d p is a n y c h p rz e z m e to d y z d e fin io w a n e w p o d k la s ie : public class PrivacyWall { public void printSpecs() { . . . } } public class Curtain extends PrivacyWall { public void printSpecs() { super.printSpecs(); } } In n e c z ę sto s p o ty k a n e p rz e z n a c z e n ie sło w a k lu c z o w e g o super to w y w o ła n ie k o n s tru k to ra s u p e rk la s y i p r z e k a z a n ie je g o p a r a m e tr ó w . Z w r ó ć u w a g ę , ż e w s p o m n ia n e w y w o ła n ie m u s i b y ć p ie rw s z y m p o le c e n ie m w k o n stru k to rz e w y w o łu ją c y m super: public PrivacyWall(int l , int w) { int length = l ; int width = w; } public class Curtain extends PrivacyWall { // Ustawienie domyślnej długości i szerokości.
public Curtain() {super(15, 25);} } Je ż e li w k lasie n ie m a w y ra ź n e g o w y w o ła n ia k o n stru k to ra su p e rk lasy , w te d y n a s tą p i a u to m a ty c z n e w y w o ła n ie p o z b a w io n e g o a rg u m e n tó w k o n stru k to ra su p e rk la s y .
Słowo kluczowe this M a m y trz y n a jc z ę s ts z e z a s to s o w a n ia d la s ło w a k lu c z o w e g o th is : o d n ie s ie n ie d o b ie ż ą c e g o o b ie k tu , w y w o ła n ie k o n s tr u k to r a z p o z io m u in n e g o k o n s tru k to ra w tej s a m e j k la s ie o ra z p r z e k a z a n ie in n e m u o b ie k to w i o d n ie sie n ia d o o b ie k tu b ie ż ą c e g o . P o n iż e j p o k a z a n o p rz y k ła d p r z y p is a n ia z m ie n n e j p a r a m e tr u d o z m ie n n e j e g z e m p la r z a b ie ż ą c e g o o b ie k tu : public class Curtain extends PrivacyWall { String color; public void setColor(String color) { th is.co lo r = color; } }
58
|
R o zd zał 5. Programowane zorentowane obektowo
O to p rz y k ła d w y w o ła n ia k o n stru k to ra z p o z io m u in n e g o k o n stru k to ra w tej s a m e j k la sie : public class Curtain extends PrivacyWall { public Curtain(int length, int width) {} public Curtain() {th is (10, 9 );} } N a to m ia st p o n iżej p rz e d sta w io n o p rz e k a z a n ie in n e m u o b iek to w i o d n iesien ia d o b ie ż ą c e g o o b ie k tu : // Wyświetlenie zawartości klasy Curtain.
System .out.println(this); public class Builder { public void setWallType(Curtain c) { . . . } }
Zm iennej długości lista argum entów P o c z ą w sz y o d Ja v y 5.0, m e to d y m o g ą m ie ć z m ie n n ej d łu g o ści listę a rg u m en tó w . T e g o ro d z a ju m e to d a je s t n a z y w a n a v a ra r g i z o s t a je z a d e k la r o w a n a w ta k i s p o s ó b , ż e o s ta tn i (i ty lk o o s ta tn i) a r g u m e n t m o ż e b y ć p o w tó r z o n y z e ro lu b w ię c e j ra z y p o d c z a s w y w o ła n ia m e to d y . W s p o m n ia n y p a ra m e tr m o ż e b y ć ty p e m p o d sta w o w y m lu b o b iek te m . W ie lo k r o p e k (...) u m ie s z c z o n y n a liś c ie a r g u m e n tó w w s y g n a tu r z e m e to d y w s k a z u je n a z a d e k la r o w a n ie m e to d y ja k o ty p u v a ra rg . S k ła d n ia te g o ro d z a ju p a ra m e tru p rz e d sta w ia się n a s tę p u ją c o : ty p e ... nazwaObiektuLubTypuPodstawowego O to p r z y k ła d s y g n a tu ry m e to d y ty p u v a ra rg : public setDisplayButtons(int row, S trin g ... names) { . . . } K o m p ila to r Ja v y m o d y fik u je m e to d y ty p u v a ra rg , a b y w y g lą d a ły je s t z w y k łe m e to d y . D la te g o te ż w tra k c ie k o m p ila c ji m e to d a p r z e d s ta w io n a p o w y ż e j z o s ta n ie z m o d y fik o w a n a n a n a s tę p u ją c ą p o s ta ć: public setDisplayButtons(int row, String [] names) { . . . } Istn ie je m o ż liw o ść , a b y m e to d a ty p u v a ra rg p o s ia d a ła ty lk o je d e n p a ra m e tr, k tó r y m o ż e p r z y ją ć z m ie n n ą lic z b ę a rg u m e n tó w : //Zero lub więcej wierszy. public void setDisplayButtons (S trin g ... names) { . . . } M e to d a ty p u v a r a r g je s t w y w o ły w a n a w d o k ła d n ie ta k i s a m s p o s ó b , ja k z w y k ła m e to d a , a je d y n a ró ż n ic a p o le g a n a m o ż liw o ś c i p o b ie ra n ia z m ie n n e j lic z b y p a r a m e tr ó w p rz e z p o w ta rz a n ie ty lk o o s ta tn ie g o a rg u m e n tu :
Zm ennej długośc l sta argumentów
|
59
setDisplayButtons("Janek"); setDisplayButtons("Jan", "Maria", "Paweł"); setDisplayButtons("Sylwia", "Dorota", "Tadeusz", "Jan"); M e to d a p r i n t f ( ) je s t b a rd z o c z ę sto s to s o w a n a p o d c z a s fo rm a to w a n ia z b io ru d a n y c h w y jścio w y ch , p o n ie w a ż p r in tf() je s t zalicz a n a w ła śn ie d o m e to d ty p u v a ra rg . W e d łu g d o k u m e n ta cji A P I Ja v y ty p w y m ie n io n e j m e to d y p rz e d sta w ia s ię n a s tę p u ją c o : public PrintStream printf(String format, O b je ct... args) M e to d a p r i n t f ( ) je s t w y w o ły w a n a w r a z z c ią g ie m te k s to w y m fo rm a to w a n ia o ra z z m ie n n ą lic z b ą o b ie k tó w : System .out.printf("W itaj, %s%n To je s t maszyna %d%n", "Sara", 1); W ię ce j sz c z e g ó ło w y c h in fo rm a c ji d o ty c z ą c y c h fo rm a to w a n ia c ią g u te k s to w e g o p rz e k a z y w a n e g o m e to d z ie p r i n t f ( ) z n a jd z ie s z w d o k u m e n ta c ji k la s y ja v a .u t il.F o r m a t t e r . U s p r a w n io n a p ę tla fo r je s t c z ę s to s to s o w a n a d o p rz e p r o w a d z e n ia ite r a c ji p r z e z z m ie n n ą lic z b ę a rg u m e n tó w : printRows() { for (String name: names) System.out.pri ntln(name); }
Klasy i m etody abstrakcyjne K la s y i m e to d y a b s tr a k c y jn e s ą d e k la r o w a n e z a p o m o c ą s ło w a k lu c z o w e g o a b s tr a c t.
Klasy abstrakcyjne K la sa a b s tr a k c y jn a je s t z w y k le u ż y w a n a w c h a ra k te r z e k la s y b a z o w e j i n ie m o ż n a u tw o rz y ć je j eg zem p larza. M o ż e z a w ie ra ć m e to d y ab strak cy jn e i nieab strak cy jn e, a p o n a d to m o ż e b y ć p o d k la s ą k la s y a b s tr a k c y jn e j lu b n ie a b s tra k cy jn e j. W s z y s tk ie je j m e to d y a b s tra k c y jn e m u s z ą b y ć d e fin io w a n e p rz e z k la sy d zied ziczące p o niej (extend), o ile p o d k lasa ró w n ież n ie jest ab strakcyjn a: public abstract class Alarm { public void reset() { . . . } public abstract void renderAlarm(); }
60
I
R o zd zał 5. Programowane zorentowane obektowo
Metody abstrakcyjne M e to d a a b strak cy jn a z a w ie ra je d y n ie d ek larację m e to d y , k tó ra m u si b y ć d efi n io w a n a p rz e z k a ż d ą k la sę n ie a b stra k c y jn ą d z ie d z ic z ą c ą p o k la sie z a w ie ra ją cej d a n ą m e to d ę a b s tra k c y jn ą : public class DisplayAlarm extends Alarm { public void renderAlarm() { System.out.pri ntln("Aktywacja alarmu."); } }
Statyczne dane składow e, metody, stałe i inicjalizatory S ta ty cz n e d a n e sk ła d o w e , m e to d y , stałe i in icja liz a to ry z n a jd u ją się w klasie, a n ie w e g z e m p la rz a c h d a n e j k la sy . D o s tę p d o s ta ty c z n y c h d a n y c h sk ła d o w y c h , m e to d i s ta ły c h m o ż n a u z y s k a ć w k la s ie , w k tó re j z o s ta ły zd efin io w a n e . D z ię k i u ż y c iu o p e ra to ra k ro p k i m o ż n a d o n ic h u z y s k a ć d o stę p ró w n ie ż z p o z io m u in n y c h k la s.
Statyczne dane składowe S ta ty c z n e d a n e s k ła d o w e c h a ra k te r y z u ją s ię ty m i s a m y m i fu n k c ja m i, ja k ie m a ją m e to d y s ta ty c z n e , i s ą p r z e c h o w y w a n e p o d p o je d y n c z y m a d r e s e m w p a m ię c i. S ta ty c z n e d a n e s k ła d o w e są u ż y w a n e , g d y ty lk o je d n a k o p ia d a n y c h s k ła d o w y c h (n a p rz y k ła d lic z n ik ) je s t p o trz e b n a w e w s z y s tk ic h e g z e m p la r z a c h k la s y . //Zadeklarowanie statycznych danych składowych. public class Voter { s ta tic int voterCount = 0; public Voter() { voterCount++;} public s ta tic int getVoterCount() { return voterCount; } } int numVoters = Voter.voterCount;
Statyczne dane składowe, metody, stałe
n cjalzatory
|
61
Metody statyczne W d e k la ra c ji m e to d y s ta ty c z n e j z n a jd u je s ię s ło w o k lu c z o w e s t a t i c : / / Deklaracja metody statycznej.
class Analyzer { public s ta tic int getVotesByAge() { . . . } } // Użycie metody statycznej.
Analyzer.getVotesByAge(); M e t o d y s ta ty c z n e n ie m o g ą u z y s k a ć d o s tę p u d o n ie s t a t y c z n y c h m e to d lu b z m ie n n y c h , p o n ie w a ż m e t o d y s t a ty c z n e s ą p o w ią z a n e z k la s ą , a n ie z o b ie k t e m .
Stałe statyczne S ta łe s ta ty c z n e to e le m e n ty s ta ty c z n e z a d e k la ro w a n e ja k o s ta łe . M a ją s ło w o k lu c z o w e s t a t i c lu b f i n a l , a p ro g ra m n ie m o ż e z m ie n ić s ta łe j: //Zadeklarowanie stałej statycznej. s ta tic final int AGE_LIMIT = 18; // Użycie stałej statycznej.
i f (age == AGE_LIMIT) newVoter = "yes";
Inicjalizator statyczny In ic ja liz a to r s ta ty cz n y z a w ie ra b lo k k o d u p o p rz e d z o n y s ło w e m k lu cz o w y m s t a t i c . K la sa m o ż e z a w ie ra ć d o w o ln ą lic z b ę b lo k ó w in icja liz a to ró w s ta ty cz n y ch ; b ę d ą o n e w y k o n y w a n e w k o le jn o ści ich u m iesz cz en ia w k o d zie. B lo k i in icja liz a to ró w s ta ty c z n y c h są w y k o n y w a n e ty lk o je d e n raz p o d c z a s in icja liza cji k la s y . W s p o m n ia n y b lo k z o s ta n ie w y k o n a n y , g d y k o m p o n e n t w c z y tu ją c y k la sę w irtu a ln e j m a s z y n y Ja v y w c z y tu je k la s ę s ta ty cz n ą , co n a s tę p u je p o p o c z ą tk o w y m o d n ie s ie n iu w k o d z ie : // Inicjalizator statyczny.
s ta tic { numberOfCandidates = getNumberOfCandidates(); }
62
|
R o zd zał 5. Programowane zorentowane obektowo
Interfejsy In te rfe jsy z a p e w n ia ją z e sta w z a d e k la ro w a n y ch m e to d p u b licz n y c h , k tó re n ie p o s ia d a ją im p le m e n ta c ji. K la s a im p le m e n tu ją c a in te r fe js m u s i d o s ta r c z a ć k o n k re tn e im p le m e n ta c je w sz y stk ich m e to d z d e fin io w a n y ch p rz e z in terfejs lu b in te rfe js p o w in ie n b y ć z a d e k la r o w a n y ja k o a b s tr a k c y jn y . D e k la r a c ja in te r fe js u r o z p o c z y n a s ię o d s ło w a k lu c z o w e g o in t e r fa c e , p o k tó r y m z n a jd u je s ię n a z w a in te rfe js u i z e s ta w d e k la ra c ji m e to d . N a z w y in te rfe jsó w są n a jc z ę śc ie j p rz y m io tn ik a m i k o ń c z ą c y m i się n a „ a b le " lu b „ ib le " , p o n ie w a ż in te rfe js d a je p e w n e m o ż liw o śc i: interface Reportable { void genReport(String repType); void printReport(String repType); } K la sa im p le m e n tu ją c a in te rfe js m u si w d e k la ra cji k la s y w s k a z y w a ć in te rfe js, co o d b y w a s ię z a p o m o c ą s ło w a k lu c z o w e g o implements: class VotingMachine implements Reportable { public void genReport (String repType) { Report report = new Report(repType); } public void printReport(String repType) { System.out.pri ntln(repType); } } *
Klasa m oże im plem entow ać wiele interfejsów, a interfejs może
W yliczenia W n ajp ro stszej p ostaci w y liczen ie to z b ió r o b iek tó w p rz e d sta w ia ją cy ch p o w ią za n e z e s o b ą e le m e n ty : enum DisplayButton {ROUND, SQUARE} DisplayButton round = DisplayButton.ROUND; W y k r a c z a ją c p o z a p r o s tą d e fin ic ję , w y lic z e n ie to k la s a ty p u enum b ę d ą c a w z o rc e m p ro je k to w y m S in g le to n . K la sy ty p u enum m a ją m e to d y , k o n stru k to ry i d a n e s k ła d o w e :
Wyl czen a
|
63
enum DisplayButton { //Wielkość wyrażona w calach. ROUND ( .5 0 f ), SQUARE (.4 0 f); private final float size; DisplayButton(float size) {th is.siz e = siz e ;} private float size() { return size; } } W arto ścią z w ro tn ą m e to d y v a lu e s() jest tab lica listy u p o rz ą d k o w a n y ch o b iek tó w , k tó re z o s ta ły z d e fin io w a n e d la d a n e g o w y lic z e n ia : for (DisplayButton b : DisplayButton.values()) System.out.println("Przycisk: " + b .s iz e ());
Typy adnotacji T y p y a d n o ta cji z a p e w n ia ją s p o só b p o w ią z a n ia m e ta d a n y c h (d a n e d o ty cz ą ce d a n y c h ) w ra z z e le m e n ta m i p ro g ra m u w tra k c ie je g o k o m p ila c ji i d z ia ła n ia . A d n o ta c je m o ż n a s to s o w a ć w z g lę d e m p a k ie tó w , k la s, m e to d , p ó l, p a ra m e tró w , z m ie n n y c h i k o n s tru k to ró w .
Wbudowane adnotacje A d n o ta c je w Ja v ie u m o ż liw ia ją p o b ra n ie m e ta d a n y c h o k la sie . Ja v a p o sia d a trz y w b u d o w a n e ty p y a d n o ta cji, w y m ie n io n e w ta b e li 5.1. W s p o m n ia n e ty p y a d n o ta c ji s ą z a w a r te w p a k ie c ie ja v a .la n g . Tabela 5 .1 . W budow ane adnotacje w Javie
Typ adnotacj
Op s
@Override
Wskazuje że metoda jest p zeznaczona do nadpisania metody supe klasy
@Deprecated
Wskazuje na użycie lub nadpisanie AP uznanego za p zesta załe
@SuppressWarnings
Używane do wybió czego zawieszania wyświetlania ost zeżeń
A d n o ta c je m u sz ą b y ć u m ie s z c z a n e b e z p o śre d n io p rz e d e le m e n te m , k tó re g o d o ty c z ą . N ie m a ją ż a d n y c h p a r a m e tr ó w i n ie p o w o d u ją z g ła s z a n ia w y ją t k ó w . W a r to ś c ią z w r o tn ą a d n o ta c ji je s t ty p p o d s ta w o w y , w y lic z e n ie , k la sa S trin g , k la s a C lass, a d n o ta c ja i ta b lic a (w y m ie n io n y c h ty p ó w ). P o n iż e j p rz e d s ta w io n o p rz y k ła d u ż y c ia a d n o ta c ji: @Override public String toString() { return super.toString() + " w ięcej"; }
64
|
R o zd zał 5. Programowane zorentowane obektowo
P o n ie w a ż u ż y to a d n o ta c ji @Override, je ż e li n ie z o s ta n ie z n a le z io n a m e to d a p r z e z n a c z o n a d o n a d p is a n ia , w ó w c z a s w a r to ś c ią z w r o tn ą b ę d z ie w y g e n e ro w a n y p rz e z k o m p ila to r k o m u n ik a t o str z e ż e n ia .
Adnotacje zdefiniowane przez programistę P ro g ra m iści m o g ą d efin io w a ć w ła sn e a d n o ta cje z a p o m o c ą trz e ch d o stę p n y ch ty p ó w a d n o ta cji. A d n o ta c ja m a rk er n ie m a p a ra m e tró w , a d n o ta cja pojedyncza w artość m a p o je d y n c z y p a ra m e tr, n a to m ia s t ad n o ta cja w iele w artości m a w ie le
p a ra m e tró w . D e f in ic ją a d n o t a c ji je s t z n a k @, p o k t ó r y m z n a jd u je s ię s ło w o i n t e r f a c e i n a z w a a d n o ta c ji. D o z w o lo n e je s t s to s o w a n ie p o w ta r z a ją c y c h s ię a d n o ta c ji. M e ta a d n o ta c ja Retention w s k a z u je , ż e a d n o ta cja p o w in n a b y ć p o z o s ta w io n a p rz e z m a s z y n ę w irtu a ln ą , c o p o z w a la n a je j o d c z y t w tra k c ie d z ia ła n ia p ro g ra m u . R etention z n a jd u je s ię w p a k ie c ie ja v a .la n g .a n n o ta tio n : @Retention(RetentionPoli cy.RUNTIME) public ^interface Feedback {} //Adnotacja marker. public ^interface Feedback { String reportName(); } //Adnotacja pojedyncza wartość. public @interface Feedback { String reportName(); String comment() default "Brak"; } //Adnotacja wiele wartości. A d n o ta c ję z d e fin io w a n ą p rz e z u ż y tk o w n ik a n a le ż y u m ie ś c ić b e z p o ś r e d n io p rz e d o b ie k te m , k tó re g o d o ty cz y : @Feedback(reportName="Raport 1") public void myMethod() { . . . } P r o g r a m y m o g ą s p r a w d z a ć is t n ie n ie a d n o t a c ji i p o b ie r a ć je j w a r to ś c i z a p o m o c ą w y w o ła n ia m e to d y getA n n otation (): Feedback fb = myMethod.getAnnotation(Feedback.class); S p e c y fik a c ja ty p u a d n o ta c ji (n a z y w a n a ró w n ie ż JS R 3 0 8 ) p o z w a la n a z a p i s y w a n ie a d n o ta c ji w ta b lic a c h i s to s o w a n ie a rg u m e n tó w o g ó ln y c h ty p ó w . A d n o ta c je m o g ą b y ć ró w n ie ż u m ie s z c z a n e w s u p e rk la s a c h , z a im p le m e n to w a n y c h in te rfe jsa c h , rz u to w a n ia c h , s p ra w d z e n ia c h in stan ce o f, s p e c y fik a cjach w y ją tk ó w , z n a k a ch w ie lo z n a c z n y ch , re fe re n c ja c h m e to d i k o n stru k to ró w . S z c z e g ó ło w e in fo r m a c je o a d n o ta c ja c h w w y m ie n io n y c h k o n te k s ta c h z n a jd z ie s z w k s ią ż c e C a y a S . H o rs tm a n n a Java S E 8 f o r the R ea lly Im p a tien t (A d d iso n -W e s le y ).
Typy adnotacj
|
65
Interfejsy funkcjonalne In te rfe js fu n k cjo n aln y , n a z y w a n y ró w n ie ż S A M (ang . S in gle A bstract M eth o d ), to je s t in te rfe js , k tó ry d e fin iu je je d n ą i ty lk o je d n ą m e to d ę a b s tr a k c y jn ą . A d n o ta c ja @ F u n c tio n a lIn te rfa c e m o ż e b y ć u m ie s z c z o n a p r z e d in te r fe js e m i w s k a z y w a ć je g o p rz e z n a c z e n ie ja k o in te rfe jsu fu n k c jo n a ln e g o . W a rto w ie d z ie ć, ż e in te rfe js m o ż e m ie ć d o w o ln ą lic z b ę m e to d d o m y ś ln y c h . @FunctionalInterface public interface InterfaceName { //Dozwolona jest tylkojedna metoda abstrakcyjna. public void doAbstractTask(); //Dozwolonych jest wiele metod domyślnych. default public void performTask1(){ System.out.println("Komunikat z zadania 1 ." ) ; } default public void performTask2(){ System.out.println("Komunikat z zadania 2 ." ) ; } } E g z e m p la rz e in te rfe jsó w fu n k c jo n a ln y c h m o g ą b y ć tw o rz o n e w ra z z w y ra ż e n ia m i la m b d a , o d n ie s ie n ia m i d o m e to d lu b k o n s tru k to ró w .
66
|
Rozdz ał 5. Programowan e zor entowane ob ektowo
ROZDZIAŁ 6.
Polecenia i bloki
P o le c e n ie to p o je d y n c z a in s tr u k c ja r e a liz u ją c a p e w n e z a d a n ie p o d c z a s je j w y k o n a n ia p r z e z in te rp re te r Ja v y : GigSim simulator = new GigSim("Zagrajmy na g ita rz e !"); D o p o le c e ń J a v y z a lic z a m y m ię d z y in n y m i: w y r a ż e n ie , in s tr u k c ję p u s tą , b lo k , k o n s tru k c ję w a ru n k o w ą , ite ra cję , tra n s fe r k o n tro li, o b słu g ę w y ją tk ó w , z m ie n n ą , a s e r c ję i p o le c e n ia s y n c h r o n iz o w a n e . S ło w a z a r e z e r w o w a n e u ż y w a n e w p o le c e n ia c h to: i f , e ls e , sw itch, case, w hile, do, fo r, break, con tin ue, retu rn , synchronized, throw, tr y , catch , f i n a l l y i a s s e r t.
Polecenie w postaci w yrażenia P o le c e n ie w p o s ta c i w y ra ż e n ia to ta k ie , k tó re z m ie n ia s ta n p ro g ra m u , c z y li w y ra ż e n ie Ja v y z a k o ń c z o n e ś re d n ik ie m . W y r a ż e n ie o b e jm u je p rz y p is a n ia , in k r e m e n ta c ję p r e fik s o w ą i p o s tfik s o w ą , d e k re m e n ta c ję p r e fik s o w ą i p o s tfiksow ą, tw o rze n ie o b iek tu i w y w o ła n ie m eto d y . P on iżej p rze d staw io n o p rzy k ład y p o le c e ń w p o s ta c i w y ra ż e ń : isWithinOperatingHours = true; ++fret; patron++; --glassOfWater; pick—; Guitarist gu itarist = new G u itarist(); guitarist.placeCapo(guitar, capo, fr e t ) ;
67
Polecenie puste P o le c e n ie p u s te n ie o fe r u je ż a d n e j d o d a tk o w e j fu n k c ji i je s t z a p is y w a n e w p o s ta c i p o je d y n c z e g o ś re d n ik a ( ; ) lu b p u s te g o b lo k u { } .
Blok G r u p a p o le c e ń n o s i n a z w ę b lo k u . W p rz y p a d k u b lo k u p o le c e n ia s ą u ję te w n a w ia s ie k la m ro w y m . Z m ie n n e i k la s y z a d e k la ro w a n e w b lo k u s ą n a z y w a n e o d p o w ie d n io z m ie n n y m i i k la sa m i lo k a ln y m i. Z a s ię g ie m w s p o m n ia n y c h z m ie n n y c h i k las lo k a ln y c h je s t b lo k , w k tó ry m z o sta ły z a d e k la ro w a n e . W b lo k u p o le c e n ia s ą in te r p r e to w a n e w k o le jn o ś c i ic h w y s tę p o w a n ia lu b w k o le jn o ś ci w sk a z y w a n e j p rz e z k o n tro lę ste ro w a n ia d z ia ła n ie m p ro g ra m u . P o n iż e j p rz e d s ta w io n o p r z y k ła d b lo k u : s ta tic { GigSimProperties.setFirstFestivalActive(true); System.out.println("Pierwszy festiwal został rozpoczęty."); gigsimLogger.info("Symulator rozpoczął pierwszy fe stiw a l."); }
Polecenia w arunkow e P o le c e n ia i f , i f e ls e i i f e ls e i f s ą p rz e z n a c z o n e d o p o d e jm o w a n ia d e c y z ji i s te r o w a n ia p rz e b ie g ie m p r o g r a m u . P o z w a la ją n a w a r u n k o w e w y k o n y w a n ie p o le c e ń . W y r a ż e n ie d o w o ln e g o z w y m ie n io n y c h p o le c e ń m u s i m ie ć ty p o d n o ś n ik o w y Boolean lu b ty p p r o s ty boolean. T y p Boolean je s t p o d d a w a n y ro z p a k o w y w a n iu i a u to m a ty c z n e j k o n w e rs ji n a boolean.
Konstrukcja if K o n s tru k c ja i f s k ła d a s ię z w y ra ż e n ia o ra z z p o le c e n ia lu b b lo k u p o le c e ń , k tó r e s ą w y k o n y w a n e , je ś li w a r to ś c ią w y r a ż e n ia b ę d z ie tr u e : Guitar guitar = new Guitar(); guitar.addProblemItem("Whammy b ar"); i f (guitar.isBroken()) { Luthier luthier = new Luthier(); luthier.repairGuitar(gui t a r ) ; }
68
|
R o zd zał 6. Polecen a blok
Konstrukcja if-else P o d cz a s u ż y cia e ls e w ra z z i f p ie rw sz y b lo k p o le ce ń je s t w y k o n y w a n y , g d y w y ra ż e n ie p rz y jm u je w a rto ś ć tru e. W p rz e c iw n y m ra z ie n a stę p u je w y k o n a n ie b lo k u k o d u w e ls e : CoffeeShop coffeeshop = new CoffeeShop(); i f (coffeeshop.getPatronCount() > 5) { System.out.println("Weź udział w wydarzeniu."); } else { System.out.println("Wróć do domu bez p łacen ia."); }
Konstrukcja if-else-if K o n s tru k c ja i f e ls e i f je s t n a jc z ę ś c ie j u ż y w a n a , g d y z a c h o d z i k o n ie c z n o ś ć d o k o n a n ia w y b o ru w ś ró d w ie lu b lo k ó w k o d u . K ie d y n ie z o s ta n ą s p e łn io n e kry teria w y k o n a n ia k tó re g o k o lw ie k b lo k u , w ó w c z a s n a stą p i w y k o n a n ie k o d u w o s ta tn im b lo k u e ls e : ArrayList playList = new ArrayList<>(); Song song1 = new Song("Mister Sandman"); Song song2 = new Song("Amazing Grace"); playList.add(song1); playList.add(song2); int numOfSongs = p la y L ist.siz e (); i f (numOfSongs <= 24) { System.out.println("Bez rezerw acji."); } else i f ((numOfSongs > 24) & (numOfSongs < 50)){ System.out.println("Rezerwacja na jedną n o c."); } else i f ((numOfSongs >= 50)) { System.out.println("Rezerwacja na dwie noce."); } else { System.out.println("Rezerwacja na tydzień"); }
Polecenie switch P o le c e n ie switch je s t p o le c e n ie m s te ro w a n ia p rz e b ie g ie m p ro g ra m u . R o z p o cz y n a s ię o d w y ra ż e n ia i n a p o d sta w ie je g o w a rto ś c i p rz e p ro w a d z a tra n s fe r k o n tro li d z ia ła n ia p r o g ra m u d o je d n e g o z b lo k ó w case. P o le c e n ie switch d z ia ła z ty p a m i char, byte, sh o rt, in t, a ta k ż e z ty p a m i o p a k o w u ją c y m i Cha ^ r a c t e r , Byte, Short i In te g e r o ra z z ty p a m i w y lic z e n ia i S trin g . O b s łu g a d la o b ie k tó w S trin g z o s ta ła w p r o w a d z o n a w Ja v ie S E 7. P o le c e n ie break s łu ż y
Polecen a warunkowe
|
69
d o o p u szcze n ia k o n stru k cji switch. Jeżeli b lo k case n ie b ę d z ie za w ie ra ł p o le ce n ia break, n a s tą p i w y k o n a n ie w ie r s z a k o d u z n a jd u ją c e g o s ię p o b lo k u case. W y k o n y w a n ie k o d u b ę d z ie k o n ty n u o w a n e aż d o n a p o tk a n ia p o le ce n ia break lu b k o ń c a k o n s tru k c ji sw itch. D o z w o lo n e je s t u ż y c ie je d n e g o b lo k u d e fa u lt; w c e lu z a c h o w a n ia c z y t e ln o ś c i je s t o n n a jc z ę ś c ie j u m ie s z c z a n y n a k o ń c u k o n s tru k c ji: String sty le; String gu itarist = "Erie Clapton"; switch (gu itarist) { case "Chet Atkins": style = "Nashville"; break; case "Thomas Emmanuel": style = "Skomplikowany"; break; default: style = "Nieznany"; break; }
Polecenia iteracji D o p o le c e ń ite r a c ji z a lic z a m y p ę tlę fo r, u s p r a w n io n ą p ę tlę fo r, p ę tlę while i p ę tlę do-while. W y m ie n io n e p o le ce n ia są u ż y w a n e w celu p rz e p ro w a d z a n ia ite r a c ji p rz e z fr a g m e n ty k o d u .
Pętla for P o le c e n ie fo r s k ła d a s ię z trz e c h c z ę ś c i: in ic ja liz a to r a , w y ra ż e n ia i u a k tu a l n ie n ia . J a k p o k a z a n o n ie c o d a le j, w p o le c e n iu fo r z m ie n n a (n a p rz y k ła d i ) m u si b y ć zain icjalizo w an a p rz e d u ży ciem . W y ra ż e n ie (n a p rzy k ład i < bArray. ^ le n g t h ) je s t o b lic z a n e p rz e d p rz e p r o w a d z e n ie m ite r a c ji p ę tli (n a p r z y k ła d i++). Ite r a c ja z a c h o d z i ty lk o w te d y , g d y w a r to ś c ią w y r a ż e n ia je s t tru e. Z m ie n n a je s t u a k tu a ln ia n a p o k a ż d e j ite ra cji. Banjo [] bArray = new Banjo[2]; bArray[0] = new Banjo(); bArray[0].setManufacturer("Windsor"); bArray[1] = new Banjo(); bArray[1].setManufacturer("Gibson"); for (int i=0; i
70
|
R o zd zał 6. Polecen a blok
Usprawniona pętla for U sp r a w n io n a p ę tla fo r (in a cz e j fo r in lu b fo r each) je s t s to s o w a n a w celu p rz e p ro w a d z e n ia iteracji p rz e z u m o ż liw ia ją cy iterację o b ie k t lu b p rz e z tab licę. P ę tla je s t w y k o n y w a n a ra z d la k a ż d e g o e le m e n tu ta b lic y lu b z b io r u i n ie u ż y w a lic z n ik a , p o n ie w a ż lic z b a ite r a c ji je s t ju ż u s ta lo n a : ElectricGuitar eGuitarl = new E lectricG uitar(); eGuitar1.setName("Blackie"); ElectricGuitar eGuitar2 = new E lectricG uitar(); eGuitar2.setName("L u cille"); ArrayList eList = new ArrayList<>(); eList.add(eG uitarl); eList.add(eGuitar2); for (ElectricG uitar e : eList) { System.out.println("Nazwa:" + e.getName()); }
Pętla while W p o le ce n iu while n a s tę p u je o b lic z e n ie w a rto ści w y ra ż e n ia i w y k o n a n ie p ę tli ty lk o w te d y , g d y w a r to ś c ią w y r a ż e n ia je s t tru e . W s p o m n ia n e w y r a ż e n ie m o ż e b y ć ty p u boolean lu b Boolean: int bandMembers = 5; while (bandMembers > 3) { CoffeeShop c = new CoffeeShop(); c.performGig(bandMembers); Random generator = new Random(); bandMembers = generator.nextInt(7) + 1; //1-7. }
Pętla do-while W p o le c e n iu do-w hile p ę tla je s t z a w s z e w y k o n y w a n a p rz y n a jm n ie j je d n o k r o tn ie , a je j w y k o n y w a n ie tr w a , d o p ó k i w a r to ś c ią w y r a ż e n ia je s t tru e . W s p o m n ia n e w y r a ż e n ie m o ż e b y ć ty p u boolean lu b Boolean: int bandMembers = 1; do { CoffeeShop c = new CoffeeShop(); c.performGig(bandMembers); Random generator = new Random(); bandMembers = generator.nextInt(7) + 1; //1-7. } while (bandMembers > 3);
Polecen a teracj
|
71
Transfer kontroli P o le c e n ia tra n sfe ru k o n tro li są u ż y w a n e w celu z m ia n y p rz e b ie g u d ziałan ia p ro g ra m u . S k ła d a ją s ię n a n ie p o le c e n ia break, continue i return.
Polecenie break P o z b a w io n e e ty k ie ty p o le ce n ie break je st u ż y w a n e d o o p u szcze n ia k o n stru k cji sw itch lu b n a ty c h m ia s to w e g o w y jś c ia z p ę tli, w k tó re j z o s ta ło w y w o ła n e . P o le c e n ie break z n a jd u je s ię w ite r a c ja c h p ę tli fo r, u s p r a w n io n e j p ę tli fo r, p ę tli while i p ę tli do-whi le : Song song = new Song("Pink Panther"); Guitar guitar = new Guitar(); int measure = 1; int lastMeasure = 10; while (measure <= lastMeasure) { i f (guitar.checkForBrokenStrings()) { break; } song.playMeasure(measure); measure++; } P o le c e n ie break w ra z z e ty k ie tą w y m u s z a o p u sz c z e n ie p ę tli n a ty ch m ia st p o e ty k ie c ie . E ty k ie ty s ą n a jc z ę ś c ie j s to s o w a n e w p ę tla c h fo r i w hile, g d y ist n ie ją z a g n ie ż d ż o n e p ę t le i tr z e b a z id e n t y f ik o w a ć p ę t lę d o o p u s z c z e n ia . W celu d o d a n ia e ty k ie ty d o p ę tli lu b p o le c e n ia n a le ż y ją u m ie ś c ić tu ż p rz e d p ę tlą lu b p o le c e n ie m , ja k p o k a z a n o w p o n iż s z y m fr a g m e n c ie k o d u : playMeasures: while (isWithinOperatingHours()) { while (measure <= lastMeasure) { i f (guitar.checkForBrokenStrings()) { break playMeasures; } song.playMeasure(measure); measure++; } } / / Opuszczenie do tego miejsca.
Polecenie continue P o w y d a n iu p o z b a w io n e e ty k ie ty p o le c e n ie continue p o w o d u je z a trz y m a n ie w y k o n y w a n ia b ie ż ą c e j p ę tli fo r, u s p r a w n io n e j p ę tli fo r, p ę tli w hile lu b p ę tli do-while, a n a stę p n ie ro z p o c z y n a n a s tę p n ą itera cję p ę tli. Z a s to s o w a n ie
72
|
R o zd zał 6. Polecen a blok
m a ją r e g u ły te s to w a n ia w a r u n k ó w p ę tli. P o le c e n ie continue w ra z z e ty k ie tą w y m u s z a n a s tę p n ą ite r a c ję p ę tli n a ty c h m ia s t p o n a tk n ię c iu s ię n a e ty k ie tę : for (int i=0; i<25; i++) { i f (p lay L ist.g et(i).isP lay ed ()) { continue; } else { song.playAllMeasures(); } }
Polecenie return P o le c e n ie re tu rn je s t u ż y w a n e w c e lu o p u s z c z e n ia m e to d y i p r z e k a z a n ia w a rto ś c i z w ro tn e j, o ile m e to d a w s k a z u je w a r to ś ć z w ro tn ą : private int numberOfFrets = 18; // Wartość domyślna. public int getNumberOfFrets() { return numberOfFrets; } P o le c e n ie retu rn je s t o p c jo n a ln e , g d y b ę d z ie o s ta tn im p o le c e n ie m w m e to d z ie , a s a m a m e to d a n ie z w ra c a ż a d n e j w a rto ś c i.
Polecenie synchronized W Ja v ie s ło w o k lu c z o w e synchronized m o ż e b y ć u ż y te w c e lu o g r a n ic z e n ia d o s tę p u p e w n y c h s e k c ji k o d u (n a p r z y k ła d c a ły c h m e to d ) ty lk o d o p o je d y n c z e g o w ą tk u . Z a p e w n ia m o ż liw o ść w z a k re sie k o n tro li d o stę p u d o z a so b ó w w s p ó łd z ie lo n y c h p r z e z w ie le w ą tk ó w . W ię c e j in fo rm a c ji n a te n te m a t z n a jd z ie s z w ro z d z ia le 14.
Polecenie assert A s e rc je i w y r a ż e n ia Boolean s ą u ż y w a n e d o s p ra w d z e n ia , c z y z a c h o w a n ie k o d u je s t z g o d n e z o cz e k iw a n ia m i. W s p o m n ia n e s p ra w d z e n ie n a s tę p u je p o u r u c h o m ie n iu k o d u w tr y b ie d e b u g o w a n ia (n a p r z y k ła d z a p o m o c ą o p c ji -e n a b le a s s e r tio n s lu b -e a w i n te r p r e t e r z e Ja v y ) . A s e r c je s ą z a p is y w a n e n a s tę p u ją c o : assert wyrażenie_boolowskie; A s e r c je u ła tw ia ją w y k r y w a n ie b łę d ó w , m ię d z y in n y m i id e n ty fik a c ję n ie o c z e k iw a n y c h w a r t o ś c i. Z o s ta ły z a p r o je k to w a n e d o w e r y fik a c ji z a ło ż e ń ,
Polecen e assert
|
73
k tó r e z a w s z e p o w in n y p r z y jm o w a ć w a r to ś ć tru e. Je ż e li p o u r u c h o m ie n iu k o d u w try b ie d e b u g o w a n ia a s e r c ja p r z y jm ie w a r to ś ć f a l s e , w te d y n a s tą p i z g ło s z e n ie b łę d u ja v a .la n g .A s s e r t io n E r r o r i p r o g r a m z a k o ń c z y d z ia ła n ie . N a to m ia st je śli asercja p rz y jm ie w a rto ść tru e, p ro g ra m d ziała w z w y k ły sp o sób. A se rc je m u sz ą b y ć w y ra ź n ie w łą cz o n e . A b y o d sz u k a ć a rg u m e n ty w ie r sza p o le c e ń u ż y w a n e d o w łą c z a n ia a s e rc ji, z a p o z n a j s ię z ro z d z ia łe m 10. // Wartość 'strings'powinna wynosić 4, 5, 6, 7, 8 lub 12.
assert (strings == 12 || (strings >= 4 && strings <= 8 )); A s e rc je m o g ą b y ć u tw o r z o n e w ta k i s p o s ó b , ż e z a w ie r a ją o p c jo n a ln y k o d b łęd u . W p ra w d z ie n a z y w a m y g o k o d e m b łęd u , ale ta k n a p ra w d ę to p o p ro stu te k s t lu b w a r to ś ć u ż y w a n e je d y n ie w c e la c h in fo rm a c y jn y c h . K ied y asercja zaw iera jąca k o d b łęd u p rz y jm ie w a rto ść fa ls e , w ó w czas w sp o m n ia n y k o d b łęd u z o sta n ie z a m ie n io n y n a ciąg te k sto w y i w y św ie tlo n y u ży t k o w n ik o w i tu ż p r z e d z a k o ń c z e n ie m d z ia ła n ia p ro g ra m u : assert wyrażenie_boolowskie : kod_błędu; P o n iż e j p rz e d s ta w io n o p r z y k ła d a s e r c ji w y k o r z y s tu ją c e j k o d b łę d u : // Wyświetlony zostanie komunikat ''Nieprawidłowa liczba ciągów tekstowych”.
assert (strings == 12 || (strings >= 4 && strings <= 8)) : "Nieprawidłowa liczba ciągów tekstowych: " + strings;
Polecenia obsługi w yjątków P o le c e n ia o b s łu g i w y ją tk ó w są u ż y w a n e w c e lu w s k a z a n ia k o d u , k tó ry m a z o s ta ć w y k o n a n y p o w y s tą p ie n iu n ie o c z e k iw a n y c h o k o lic z n o ś c i. S ło w a k lu cz o w e throw i try / c a tc h / fin a lly są sto so w a n e p o d cz a s o b słu g i w y ją tk ó w . W ię c e j in fo rm a c ji n a te m a t o b s łu g i w y ją tk ó w z n a jd z ie s z w ro z d z ia le 7.
74
|
R o zd zał 6. Polecen a blok
ROZDZIAŁ 7.
Obsługa wyjątków
W yjątek to a n o m a lia z m ie n ia ją ca lu b z a k łó cająca p rz e b ie g d ziałan ia p ro g ram u .
Ja v a o fe ru je w b u d o w a n ą o b s łu g ę w y ją tk ó w , a b y p o z w o lić p r o g r a m iś c ie n a ro z w ią z a n ie te g o ro d z a ju p ro b le m ó w . O b s łu g a w y ją tk ó w n ie p o w in n a b y ć c z ę ś c ią n o r m a ln e g o d z ia ła n ia p ro g ra m u .
Hierarchia w yjątku Ja k p o k a z a n o n a ry s u n k u 7.1 , w s z y s tk ie w y ją tk i i b łę d y są d z ie d z ic z o n e p o k la s ie Throwable, k tó ra z k o le i d z ie d z ic z y p o k la s ie O bject.
R y su n ek 7.1. H ierarchia wyjątku
75
Spraw dzane i niespraw dzane w yjątki oraz błędy W y ją tk i i b łę d y z a lic z a ją s ię d o tr z e c h k a te g o rii: s p r a w d z a n e w y ją tk i, n ie s p r a w d z a n e w y ją tk i i b łę d y .
Sprawdzane wyjątki O to k ilk a w a ż n y c h fa k tó w d o ty c z ą c y c h s p r a w d z a n y c h w y ją tk ó w : • S p ra w d z a n e w y ją tk i s ą s p ra w d z a n e p rz e z k o m p ila to r w tra k c ie k o m p ila c ji. • M e to d y z g ła s z a ją c e s p ra w d z a n e w y ją tk i m u s z ą te n fa k t w s k a z y w a ć z a p o m o c ą k lau zu li throws w d ek laracji m e to d y . W y m ie n io n ą klau zu lę trzeba p o d a w a ć n a c a ły m s to s ie w y w o ła ń a ż d o c h w ili o b s łu ż e n ia w y ją tk u . • W s z y s tk ie s p ra w d z a n e w y ją tk i m u s z ą b y ć w y r a ź n ie p r z e c h w y ty w a n e p rz e z b lo k catch . • S p ra w d z a n e w y jątk i o b e jm u ją m ię d z y in n y m i w y jątk i ty p u Exception oraz w sz y stk ie k lasy b ę d ą ce p o d ty p am i Exception, p o z a ty p em RuntimeException i je g o p o d ty p a m i. P o n iż e j p rz e d s ta w io n o p r z y k ła d m e to d y z g ła s z a ją c e j s p ra w d z a n y w y ją te k : / / Deklaracja metody zgłaszającej // wyjątek IOException.
void readFile(String filename) throws IOException { }
Niesprawdzane wyjątki O to k ilk a w a ż n y c h fa k tó w d o ty c z ą c y c h n ie s p r a w d z a n y c h w y ją tk ó w : • K o m p ila to r n ie s p ra w d z a te g o r o d z a ju w y ją tk ó w w tr a k c ie k o m p ila c ji p ro g ra m u . • N ie s p r a w d z a n e w y ją tk i w y s tę p u ją w tr a k c ie d z ia ła n ia p r o g r a m u i są z g ła s z a n e z e w z g lę d u n a b łą d p o p e łn io n y p r z e z p r o g r a m is tę (in d e k s sp o za d o z w o lo n e g o zak resu , d zie le n ie p rz e z zero , w s k a ź n ik n u ll itd .) lu b z p o w o d u w y k o rz y s ta n ia z a s o b ó w s y s te m u . • N ie s p r a w d z a n e w y ją tk i n ie m u s z ą b y ć p r z e c h w y ty w a n e .
76
|
Rozdz ał 7. Obsługa wyjątków
M e to d y zg ła sz a ją ce n ie sp ra w d z a n e w y ją tk i n ie m u sz ą (ch o ć o czy w iście m o g ą ) z g ła s z a ć te g o fa k tu w d e k la ra c ji m e to d y . N ie s p r a w d z a n e w y ją tk i o b e jm u ją w y ją tk i ty p u RuntimeException o ra z w s z y s tk ie je g o p o d ty p y .
Błędy O to k ilk a w a ż n y c h fa k tó w d o ty c z ą c y c h b łę d ó w : • B łę d y s ą n a jc z ę ś c ie j n ie m o ż liw e d o u s u n ię c ia i o z n a c z a ją w y s tą p ie n ie p o w a ż n e g o p ro b le m u . • P o d c z a s k o m p ila c ji n ie n a s tę p u je s p r a w d z e n ie p o d k ą te m b łę d ó w ; n ie m u s z ą (c h o ć m o g ą ) b y ć w te d y p r z e c h w y c o n e lu b o b s łu ż o n e .
Przechw ycić m ożna każdy spraw dzany i niespraw dzany w yją tek oraz błędy.
N ajczęstsze spraw dzane i niespraw dzane w yjątki oraz błędy S ta n d a r d o w ą c z ę ś ć p la tfo r m y Ja v a s ta n o w ią r ó ż n e s p ra w d z a n e i n ie s p ra w d z a n e w y ją tk i o ra z n ie s p r a w d z a n e b łę d y . W p rz y p a d k u n ie k tó r y c h p r a w d o p o d o b ie ń s tw o ic h w y s tą p ie n ia je s t w y ż s z e n iż in n y ch .
Najczęściej występujące sprawdzane wyjątki O to lis ta n a jc z ę ś c ie j w y s tę p u ją c y c h s p r a w d z a n y c h w y ją tk ó w : ClassNotFoundException Z g ła s z a n y , g d y k la s a n ie m o ż e z o s ta ć w c z y ta n a z e w z g lę d u n a b r a k je j d e fin ic ji. IOException Z g ła s z a n y w p r z y p a d k u n ie p o w o d z e n ia lu b p r z e r w a n ia o p e r a c ji. D o d w ó c h n a jc z ę ś c ie j w y s tę p u ją c y c h p o d ty p ó w w y ją tk u IOException z a li c z a m y EOFException i FileNotFoundException.
Najczęstsze sprawdzane n esprawdzane wyjątk oraz błędy
|
77
FileNotFoundException Z g ła s z a n y w p r z y p a d k u p r ó b y o tw o r z e n ia p lik u , k tó r y n ie m o ż e b y ć z n a le z io n y . SQLException Z g ła s z a n y w p rz y p a d k u w y s tą p ie n ia b łę d u w b a z ie d a n y c h . In terru ptedE xception Z g ła s z a n y , g d y n a s tą p i p r z e r w a n ie d z ia ła n ia w ą tk u . NoSuchMethodException Z g ła s z a n y w p r z y p a d k u n ie z n a le z ie n ia w y w o ły w a n e j m e to d y . CloneNotSupportedException T e n w y ją te k je s t z g ła sz a n y , g d y n a stą p i w y w o ła n ie m e to d y clone () p rz e z o b ie k t, k tó re g o n ie m o ż n a k lo n o w a ć .
Najczęściej występujące niesprawdzane wyjątki O to lis ta n a jc z ę ś c ie j w y s tę p u ją c y c h n ie s p r a w d z a n y c h w y ją tk ó w : A rithm eticE xception Z g ła s z a n y w c e lu w s k a z a n ia w y s tą p ie n ia p o w a ż n e g o p ro b le m u a ry t m e ty c z n e g o . ArrayIndexOutOfBoundsException Z g ła s z a n y w c e lu w s k a z a n ia , ż e w a r to ś ć in d e k s u je s t s p o z a d o z w o lo n e g o z a k r e s u . C lassC astE xception Z g ła s z a n y w c e lu w s k a z a n ia , ż e p o d ję to p r ó b ę rz u to w a n ia o b ie k tu n a p o d k la s ę , k tó re j n ie je s t e g z e m p la r z e m . DateTimeException Z g ła sz a n y w celu w sk a z a n ia w y stąp ie n ia p ro b le m ó w z w ią z a n y c h z tw o r z e n ie m , u ż y w a n ie m i p r z e p r o w a d z a n ie m o p e r a c ji n a o b ie k ta c h d a ty i g o d z in y . IllegalA rgum entException Z g ła sz a n y , g d y m e to d z ie z o sta n ie p rz e k a z a n y n ie p ra w id ło w y arg u m en t. Ille g a lS ta te E x c e p tio n Z g ła s z a n y w celu w s k a z a n ia , ż e m e to d a z o sta ła w y w o ła n a w n ie p ra w i d ło w y m m o m e n c ie . IndexOutOfBoundsException Z g ła s z a n y w c e lu w s k a z a n ia , ż e w a r to ś ć in d e k s u je s t s p o z a d o z w o lo n eg o zak resu .
78
|
Rozdz ał 7. Obsługa wyjątków
N ullP ointerE xcep tion Z g ła s z a n y w c e lu w s k a z a n ia , ż e k o d o d w o łu je s ię d o o b ie k tu n u ll, g d y w y m a g a n e je s t u ż y c ie o b ie k tu in n e g o n iż n u ll. NumberFormatException Z g ła s z a n y , g d y z o s ta n ie p o d ję ta n ie p ra w id ło w a p ró b a k o n w e rs ji c ią g u te k s to w e g o n a ty p lic z b o w y . UncheckedIOException O p a k o w u je w y ją te k IOException n ie s p ra w d z a n y m w y ją tk ie m .
Najczęściej występujące błędy O to lis ta n a jc z ę ś c ie j w y s tę p u ją c y c h b łę d ó w : A ssertion E rro r Z g ła s z a n y w c e lu p o in fo r m o w a n ia o n ie u d a n e j a s e rcji. E x c e p tio n In In itia liz e E r r o r Z g ła s z a n y w c e lu p o in fo rm o w a n ia o n ie o c z e k iw a n y m w y ją tk u w sta ty c z n y m in ic ja liz a to r z e . V irtualM achineError Z g ła s z a n y , a b y w s k a z a ć n a p ro b le m z w ir tu a ln ą m a s z y n ą Ja v y . OutOfMemoryError Z g ła sz a n y , g d y n ie m a w o ln e j p a m ię c i d la a lo k a cji o b ie k tu lu b p rz e p ro w a d z e n ia o p e ra c ji p rz e z m e c h a n iz m u s u w a n ia n ie u ż y tk ó w . NoClassDefFoundError Z g ła sz a n y , g d y w irtu a ln a m a s z y n a Ja v y n ie m o ż e z n a le ź ć d efin icji k lasy , k tó ra b y ła w tra k c ie k o m p ila c ji. StackO verflow Error Z g ła s z a n y w c e lu p o in fo r m o w a n ia o p rz e p e łn ie n iu sto s u .
Słow a kluczow e zw ią za n e z obsługą w yjątków W Ja v ie k o d p r z e z n a c z o n y d o o b s łu g i b łę d ó w je s t w y r a ź n ie o d d z ie ln y o d k o d u g e n e r u ją c e g o b łą d . K o d g e n e r u ją c y w y ją t e k je s t o k r e ś la n y m ia n e m „ z g ła s z a ją c e g o " w y ją te k , p o d c z a s g d y k o d o b s łu g u ją c y w y ją te k je s t n a z y w a n y „ p r z e c h w y tu ją c y m " w y ją te k :
Słowa kluczowe zw ązane z obsługą wyjątków
|
79
/ / Deklaracja wyjątku.
public void methodA() throws IOException { throw new IOException(); } // Przechwycenie wyjątku.
public void methodB() { /* Wywołanie methodA() musi następować w bloku try/catch, * * ponieważ wyjątek zalicza się do kategorii sprawdzanych; ** w przeciwnym razie methodB() może zgłosić wyjątek. */
try { methodA(); } catch (IOException ioe) { System.err.pri ntln(ioe.getM essage()); ioe.printStackTrace(); } }
Słowo kluczowe throw D o z g ło s z e n ia w y ją tk u s łu ż y s ło w o k lu c z o w e throw. Z g ło s ić m o ż n a k a ż d y w y ją te k s p r a w d z a n y i n ie s p r a w d z a n y o ra z b łą d : i f (n == -1) throw new EOFException();
Słowa kluczowe try, catch i finally Z g ła s z a n e w y ją tk i s ą o b s łu g iw a n e w Ja v ie p r z e z b lo k i t r y , c a tch i f i n a l l y . I n t e r p r e t e r J a v y , s z u k a ją c k o d u p r z e z n a c z o n e g o d o o b s łu g i w y ją t k ó w , w p ie rw s z e j k o le jn o ś ci s p ra w d z a w y m ie n io n e b lo k i k o d u , a n a s tę p n ie p ro p a g u je w y ją t e k w g ó r ę s to s u w y w o ła ń , a ż d o tr z e d o fu n k c ji m ain (), o ile z a ch o d z i p o trz e b a . Jeżeli w ą te k n ie z o sta n ie o b słu ż o n y w w ą tk u g łó w n y m — n a p rz y k ła d w E D T (an g . E v e n t D ispatch T h rea d ), w ó w c z a s p ro g ra m k o ń cz y d z ia ła n ie i n a s tę p u je w y ś w ie tle n ie s to s u w y w o ła ń : try { method(); } catch (EOFException eofe) { eofe.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } fin a lly { // Sprzątanie.
}
80
|
Rozdz ał 7. Obsługa wyjątków
Konstrukcja try-catch K o n s tru k c ja tr y -c a tc h z a w ie ra je d e n b lo k tr y o ra z je d e n lu b w ię c e j b lo k ó w catch . W b lo k u t r y z n a jd u je s ię k o d , k t ó r y m o ż e z g ła s z a ć w y ją t k i. D la k a ż d e g o s p ra w d z a n e g o w y ją tk u , k tó ry m o ż e b y ć z g ło s z o n y , m u s i is tn ie ć b lo k catch z a w ie ra ją c y k o d o d p o w ie d z ia ln y z a o b słu g ę d a n e g o w y ją tk u . Je ż e li w y ją te k n ie z o s ta n ie z g ło s z o n y , w y k o n y w a n ie k o d u b lo k u tr y k o ń c z y s ię w z w y k ły s p o s ó b . D la b lo k u t r y m o ż e is tn ie ć z e r o lu b w ię c e j b lo k ó w catch p r z e z n a c z o n y c h d o o b s łu g i w y ją tk ó w .
Blokow i try m usi być przypisany przynajm niej jeden blok catch lub finally .
_A Ż a d e n k o d n ie m o ż e s ię z n a jd o w a ć m ię d z y b lo k ie m t r y i b lo k a m i ca tch (o ile są z d e fin io w a n e ) lu b b lo k ie m f i n a l l y (o ile je s t z d e fin io w a n y ). B lo k catch z a w ie r a k o d p r z e z n a c z o n y d o o b s łu g i z g ło s z o n y c h w y ją tk ó w , m ię d z y in n y m i u m ie s z c z a n ia w p lik u in fo rm a cji o w y ją tk u o raz u m o ż liw ie n ia u ż y tk o w n ik o w i d o s ta rc z e n ia o d p o w ie d n ic h in fo rm a c ji. P a m ię ta j, ż e b lo k catch n ig d y n ie p o w in ie n b y ć p u s ty , p o n ie w a ż ta k a „ c is z a " s k u tk u je u k r y c ie m w y ją t k u , c o je s z c z e b a r d z ie j u t r u d n ia w y c h w y ty w a n ie b łę d ó w w k o d z ie p ro g ra m u . N a jc z ę ś c ie j s to s o w a n a k o n w e n c ja n a d a w a n ia n a z w p a ra m e tro m w p o le c e n iu catch to u ż y c ie p ie r w s z y c h lite r z w s z y s tk ic h s łó w tw o rz ą c y c h n a z w ę w y ją tk u : catch (ArrayIndexOutOfBoundsException aioobe) { aioobe.printStackStrace(); } W b lo k u catch m o ż n a ró w n ie ż z g ło sić n o w y w y ją tek , je śli za c h o d z i p o trzeb a. K o le jn o ś ć b lo k ó w catch w k o n s tr u k c ji t r y -c a t c h d e fin iu je p ie r w s z e ń s tw o p o d cz a s p rz e c h w y ty w a n ia w y ją tk ó w . Z a w s z e z a c z y n a j o d n a jd o k ła d n ie j z d e fin io w a n e g o w y ją tk u , k tó ry m o ż e b y ć z g ło s z o n y , a n a k o ń c u p rz e c h o d ź d o n a jb a r d z ie j o g ó ln e g o . Je ż e li ż a d e n p a ra m e tr b lo k ó w catch n ie z o sta n ie d o p a so w a n y d o z g ło sz o n e g o w y ją tk u , w ó w c z a s s y s te m b ę d z ie s z u k a ł d o p a s o w a n ia p a ra m e tru w k la s ie n a d rz ę d n e j w y ją tk u .
Słowa kluczowe zw ązane z obsługą wyjątków
|
81
W yjątki zgłaszane w bloku try są kierowane do pierwszego bloku catch zaw ierającego argum enty takiego samego typu, jak obiekt wyjątku lub superklasa danego typu. Blok catch wraz z parame trem Exception zaw sze pow inien znajdow ać się na końcu listy.
Konstrukcja try-finally K o n s tr u k c ja t r y - f i n a l l y s k ła d a s ię z je d n e g o b lo k u tr y o ra z je d n e g o b lo k u f i n a l ly . B lo k f i n a l l y je s t u ż y w a n y d o z w o ln ie n ia z a s o b ó w , g d y z a c h o d z i p o trz e b a : public void testMethod() throws IOException { FileWriter fileW riter = new FileW riter("\\data.txt"); try { f i leWriter.wri te("Inform acje.. . " ) ; } fin a lly { file W rite r.clo se (); } } O m a w ia n y b lo k je s t o p c jo n a ln y i s t o s o w a n y ty lk o w t e d y , g d y z a c h o d z i p o tr z e b a . W p rz y p a d k u je g o u ż y c ia je s t w y k o n y w a n y ja k o o s ta tn i w k o n s t r u k c ji t r y - f i n a l l y . N ie z a le ż n ie o d s p o s o b u z a k o ń c z e n ia b lo k u t r y b lo k f i n a l l y z a w s z e b ę d z ie w y k o n a n y . Je ż e li b lo k f i n a l l y z g ło s i w y ją te k , m u s i o n z o s ta ć o b słu ż o n y .
Konstrukcja try-catch-finally K o n s tru k c ja t r y - c a t c h - f in a l ly z a w ie ra je d e n b lo k tr y o ra z je d e n lu b w ię c e j b lo k ó w catch i je d e n b lo k f i n a l ly . W o m a w ia n e j k o n s tru k c ji b lo k f i n a l l y je s t u ż y w a n y ta k ż e d o p r z e p r o w a d z e n ia o p e ra c ji s p rz ą ta n ia i z w o ln ie n ia n ie p o tr z e b n y c h ju ż z a s o b ó w : public void testMethod() { FileWriter fileW riter = null; try { fileW riter = new FileW riter("\\data.txt"); fi leWriter.wri te("Inform acje.. . " ) ; } catch (IOException ex) { ex.printStackTrace(); } fin a lly { try { file W rite r.clo se (); } catch (Exception e) { e.printStackTrace();
82
|
Rozdz ał 7. Obsługa wyjątków
} } } B lo k f in a lly je s t o p cjo n a ln y i sto so w a n y ty lk o w te d y , g d y za c h o d z i p o trze b a. W p rz y p a d k u je g o u ż y c ia je s t w y k o n y w a n y ja k o o s ta tn i w k o n s tru k c ji tr y ^ c a t c h - f in a l ly. N ie z a le ż n ie o d sp o so b u z a k o ń cz e n ia b lo k u try lu b w y k o n a n ia b ą d ź n ie b lo k u catch, b lo k fin a l ly z a w s z e b ę d z ie w y k o n a n y . Je ż e li b lo k f i n a l l y z g ło s i w y ją te k , m u s i o n z o s ta ć o b s łu ż o n y .
Konstrukcja try wraz z zasobami K o n stru k cja try z z a so b a m i je s t u ż y w a n a d o z a d e k la ro w a n ia z a s o b ó w , k tó re m u s z ą b y ć z w o ln io n e , g d y n ie s ą d łu ż e j p o tr z e b n e . W s p o m n ia n e z a s o b y są d e k la ro w a n e w b lo k u tr y : public void testMethod() throws IOException { try (FileW riter fw = new FileW riter("\\data.txt")) { fw .w rite("In form acje..."); } } W s z e lk ie z a s o b y im p le m e n tu ją c e in te rfe js A utoClosable m o g ą b y ć u ż y w a n e w k o n s tru k c ji tr y w ra z z z a s o b a m i.
Wieloargumentowy blok catch O m a w ia n y b lo k catch je s t s to so w a n y w celu u m o ż liw ie n ia w s k a z a n ia w ie lu a rg u m e n tó w w y ją tk u w p o je d y n c z e j k la u z u li c a tch : boolean isTest = fa lse ; public void testMethod() { try { i f (isTest) { throw new IOException(); } else { throw new SQLException(); } } catch (IOException | SQLException e) { e.printStackTrace(); } }
Słowa kluczowe zw ązane z obsługą wyjątków
|
83
Proces obsługi w yjątków W p r o c e s ie o b słu g i w y ją tk ó w m o ż n a w y r ó ż n ić k ilk a e ta p ó w : 1. W y s tę p u je a n o m a lia z a k łó c a ją c a p rz e b ie g d z ia ła n ia p ro g ra m u , co p ro w a d z i d o u tw o r z e n ia o b ie k tu w y ją tk u . 2 . N o w y o b ie k t w y ją tk u z o s ta je z g ło s z o n y . 3 . S y stem u ru ch o m ie n io w y szu k a k o d u p rze zn aczo n e g o d o o b słu g i w y jątku . W y s z u k iw a n ie r o z p o c z y n a s ię o d m e to d y , w k tó re j u tw o r z o n o o b ie k t w y ją tk u . Je ż e li o d p o w ie d n i k o d n ie z o s ta n ie z n a le z io n y , ś ro d o w is k o u ru c h o m ie n io w e z a cz y n a się p o ru sz a ć w g ó rę sto su w y w o ła ń (u p o rząd k o w a n e j listy m e to d ) w p o sz u k iw a n iu k o d u o d p o w ie d z ia ln e g o z a o b słu ż e n ie w y ją tk u . G d y w y ją te k n ie z o s ta n ie o b s łu ż o n y , p r o g r a m k o ń c z y d z ia ła n ie i a u to m a ty c z n ie n a s tę p u je w y ś w ie tle n ie s to s u w y w o ła ń . 4 . S y ste m u ru c h o m ie n io w y p rz e k a z u je o b ie k t w y ją tk u d o p ro c e d u ry o b słu g i w y ją tk u w c e lu o b s łu ż e n ia (p rz e c h w y c e n ia ) w y ją tk u .
Zdefiniow anie w łasnej klasy w yjątku W y ją tk i d efin io w an e p rz e z p ro g ram istę p o w in n y b y ć tw o rzo n e, g d y k o n ieczn e je s t u ż y cie w y ją tk ó w in n e n iż o fe ro w a n e p rz e z Ja v ę . O g ó ln ie rzecz b io rąc, jeśli to m o ż liw e , n a le ż y w ie lo k r o tn ie w y k o r z y s ty w a ć w y ją tk i d o s tę p n e w Ja v ie : • W c e lu z d e fin io w a n ia s p ra w d z a n e g o w y ją tk u n o w a k la s a m u s i b e z p o ś re d n io lu b p o ś r e d n io ro z s z e r z a ć k la s ę Exception. • W celu z d e fin io w a n ia n ie sp ra w d z a n e g o w y ją tk u n o w a k la sa m u si b e z p o ś re d n io lu b p o ś re d n io ro z s z e r z a ć k la s ę RuntimeException. • W c e lu z d e fin io w a n ia n ie s p r a w d z a n e g o b łę d u n o w a k la s a b łę d u m u s i ro z s z e r z a ć k la s ę Error. W y ją tk i d e fin io w a n e p r z e z u ż y tk o w n ik a p o w in n y m ie ć p r z y n a jm n ie j d w a k o n s tru k to ry : je d e n n ie a k c e p tu ją c y ż a d n y c h a rg u m e n tó w i je d e n a k c e p tu ją c y a rg u m e n ty : public class ReportException extends Exception { public ReportException () {} public ReportException (String message, int reportId) { } }
84
|
Rozdz ał 7. Obsługa wyjątków
W yśw ietlanie inform acji o w yjątku M e to d y k la s y Throwable d o s ta rc z a ją c e in fo r m a c je o w y ją tk u to getM essage(), to S tr in g () i p rin tS ta c k T ra c e (). O g ó ln ie rz e c z b io r ą c , je d n a z w y m ie n io n y c h m e to d p o w in n a b y ć w y w o ła n a w b lo k u catch o d p o w ie d z ia ln y m z a o b słu g ę w y ją tk u . P ro g ra m ista m o ż e ró w n ie ż u tw o rz y ć k o d p rz e z n a cz o n y d o p o b ie ran ia d a lsz y ch u ż y te cz n y c h in fo rm acji w trak cie z g ła sz a n ia w y ją tk u (na p rz y k ła d n a z w y n ie z n a le z io n e g o p lik u ).
Metoda getMessage() W a r t o ś c ią z w r o t n ą m e t o d y g etM essage() je s t c ią g t e k s to w y z a w ie r a ją c y d o k ła d n e in fo r m a c je o w y ją tk u : try { new F ile R e a d e r("file .js") ; } catch (FileNotFoundException fnfe) { System .err.println(fnfe.getM essage()); }
Metoda toString() W a rto ścią z w ro tn ą m e to d y to S trin g () je s t ciąg te k sto w y za w ie ra ją c y d o k ład n e in fo rm a c je o w y ją tk u , m ię d z y in n y m i n a z w ę k la sy : try { new F ile R e a d e r("file .js") ; } catch (FileNotFoundException fnfe) { System .err.p rin tln (fn fe.to Strin g()); }
Metoda printStackTrace() W a rto ś c ią z w ro tn ą m e to d y p rin tS tack T race() je s t c ią g te k s to w y z a w ie ra ją c y d o k ła d n e in fo rm a c je o w y ją tk u , m ię d z y in n y m i n a z w ę k la sy i stos w y w o ła ń p r z e d s ta w ia ją c y m e to d y o d te j, w k tó re j z o s ta ł p r z e c h w y c o n y b łą d , w s te c z d o m e to d y , w k tó re j b łą d z o s ta ł z g ło s z o n y : try { new F ile R e a d e r("file .js") ; } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); }
Wyśw etlan e nformacj o wyjątku
|
85
P o n iż e j p rz e d s ta w io n o p r z y k ła d s to s u w y w o ła ń . W ie rs z p ie r w s z y z a w ie ra in fo rm a cje z w ró c o n e p rz e z m e to d ę to S tr in g () w y w o ła n ą w z g lę d e m o b iek tu w y ją t k u . P o z o s t a łe w ie r s z e p o k a z u ją w y w o ła n ia m e to d , p o c z ą w s z y o d m ie js c a z g ło s z e n ia w y ją tk u a ż d o m ie js c a , w k tó ry m z o s ta ł p r z e c h w y c o n y i o b słu ż o n y : java.io.FileNotFoundException: f i l e . j s (The system cannot find the f i le ^sp ecified ) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream .(init)(FileInputSteam .java:106) at java.io.FileInputStream .(init)(FileInputSteam .java:66) at java.io.FileR ead er(init)(FileR eader.java:41) at EHExample.openFile(EHExample.java:24) at EHExample.main(EHExample.java:15)
86
|
R o zd zał 7. Obsługa wyjątków
ROZDZIAŁ 8.
Modyfikatory w Javie
M o d y fik a to ry , k tó re s ą s ło w a m i k lu c z o w y m i w Ja v ie , m o g ą b y ć s to s o w a n e w z g lę d e m k la s , in te rfe js ó w , k o n s tru k to ró w , m e to d i d a n y c h s k ła d o w y c h . W ta b e li 8.1 w y m ie n io n o m o d y fik a to ry Ja v y i e le m e n ty , w z g lę d e m k tó ry c h m o g ą b y ć s to s o w a n e . Z w r ó ć u w a g ę n a z e z w o le n ie u ż y c ia k la s p r y w a tn y c h i c h ro n io n y ch , ale ty lk o ja k o k la s w e w n ę trz n y c h , to z n a c z y z a g n ie ż d ż o n y c h . Tabela 8 .1 . M odyfikatory Javy
Modyf kator
Klasa
nterfejs
Konstruktor
Metoda
Dane składowe
Modyf katory dostępu package private
tak
tak
tak
tak
tak
private
nie
nie
tak
tak
tak
protected
nie
nie
tak
tak
tak
public
tak
tak
tak
tak
tak
abstract
tak
tak
nie
tak
nie
fi nal
tak
nie
nie
tak
tak
native
nie
nie
nie
tak
nie
s tri ctfp
tak
tak
nie
tak
nie
s ta tic
nie
nie
nie
tak
tak
synchronized
nie
nie
nie
tak
nie
transient
nie
nie
nie
nie
tak
volatile
nie
nie
nie
nie
tak
nne modyf katory
87
K la s y w e w n ę tr z n e m o g ą ró w n ie ż u ż y w a ć m o d y fik a to r ó w d o s tę p u p riv a te lu b p ro tected . Z m ie n n e lo k a ln e m o g ą u ż y w a ć ty lk o je d n e g o m o d y fik a to ra : fin a l.
M odyfikatory dostępu M o d y fik a to ry d o s tę p u d e fin iu ją u p ra w n ie n ia d o s tę p u d o k la s , in te rfe js ó w , k o n stru k to ró w , m e to d i d a n y c h s k ła d o w y ch . W Ja v ie m o ż n a u ż y w a ć n a stę p u ją c y c h m o d y fik a to ró w d o stę p u : pu blic, p riv ate i protected. Je ż e li n ie z o sta n ie w y r a ź n ie p o d a n y m o d y fik a to r d o s tę p u , w ó w c z a s d o m y ś ln ie u ż y ty je s t pack a ge-p riv a te.
W ta b e li 8.2 w y m ie n io n o in fo rm a c je d o ty cz ą ce w id o c z n o ś ci p o d cz a s u ż y cia p o s z c z e g ó ln y c h m o d y fik a to r ó w d o s tę p u . Tabela 8 .2 . M odyfikatory dostępu i ich w idoczność
Modyf kator dostępu
W doczność
package private
Domyślny modyfikato package privateog anicza dostęp jedynie z poziomu pakietu
p riv a te
Metoda p ywatna jest dostępna jedynie z poziomu danej klasy
staje się możliwy
P ywatne dane składowe są dostępne z poziomu klasy Poś ednio są dostępne ównież za pomocą metod (na p zykład typu gette i sette ) p ro tected
Metoda ch oniona jest dostępna na poziomie pakietu a także z zewnąt z pakietu p zez podklasy klasy zawie ającej daną metodę Ch onione dane składowe są dostępne na poziomie pakietu a także z zewnąt z pakietu p zez podklasy klasy zawie ającej ch onione dane składowe
p u b lic
Modyfikato publiczny pozwala na uzyskanie dostępu z każdego miejsca nawet z zewnąt z pakietu w któ ym została zdefiniowana metoda publiczna Wa to pamiętać że domyślnie inte fejs jest publiczny
Inne m odyfikatory (niedotyczące dostępu) W ta b e li 8.3 w y m ie n io n o istn ie ją c e w Ja v ie m o d y fik a to ry , k tó re n ie d o ty cz ą d o s tę p u , o ra z p rz e d s ta w io n o ic h z a s to s o w a n ie .
88
|
R o zd zał 8. Modyf katory w Ja ve
Tabela 8.3. Niedotyczące dostępu modyfikatory w Javie Modyf kator
Op s
abstract
Klasa abst akcyjna to taka któ a została zadekla owana z użyciem słowa kluczowego abstract Nie może być jednocześnie zadekla owana jako fin al nte fejsy są domyślnie dekla owane jako abst akcyjne a więc nie jest konieczne wy aźne stosowanie słowa kluczowego abstract Metoda abst akcyjna to taka któ a zawie a jedynie sygnatu ę i nie posiada definicji Jeżeli choć jedna metoda w klasie jest abst akcyjna wówczas zawie ająca ją klasa ównież jest abst akcyjna Tego odzaju metoda nie może być zadekla owana z użyciem modyfikato a final native private s ta tic lub synchronized
default
Metoda domyślna (ok eślana ównież mianem defender method) pozwala na two zenie w inte fejsie implementacji metody domyślnej
fi nal
Klasy typu final nie można ozsze zać Metody typu final nie można nadpisać Dane składowe fin al są inicjalizowane tylko jednok otnie i nie mogą być zmodyfikowane Dane składowe zadekla owane jako static final są ustawiane w t akcie kompilacji i nie mogą być zmodyfikowane
native
Metoda native jest używana do wyko zystania w p og amie Javy kodu utwo zonego w innym języku p og amowania na p zykład C lub C++ Zawie a jedynie sygnatu ę nie posiada definicji Ten modyfikato może być używany jednocześnie z modyfikato em s tric tfp
s ta tic
Metody i zmienne statyczne są dostępne za pomocą nazwy klasy Wymienione elementy są dostępne do użycia w całej klasie o az wszystkich jej egzempla zach Statyczne dane składowe są dostępne za pomocą nazwy klasy stnieje tylko jeden egzempla z statycznych danych składowych niezależnie od liczby istniejących egzempla zy klasy
s tri ctfp
Klasa typu s tr ic tf p jest zgodna ze specyfikacją EEE 754 1985 dotyczącą liczb zmiennop zecinkowych i ope acji na tego odzaju liczbach Wszystkie wy ażenia w metodzie typu s tr ic t f p są ściśle zgodne z liczbami zmiennop zecinkowymi Metody w inte fejsie nie mogą być zadekla owane jako s tric tfp a ponadto nie mogą być jednocześnie używane w az z modyfikato em native
synchronized
Metoda typu synchronized zezwala aby w danej chwili tylko jeden wątek wykonywał blok metody co zapewnia bezpieczeństwo wątków Polecenia ównież mogą być typu synchronized
transient
Dane składowe typu tran sien t nie są se ializowane w t akcie se ializacji klasy Nie stanowią części t wałego stanu obiektu
volatile
Dane składowe typu v o la tile nakazują wątkowi pob anie najnowszej wa tości zmiennej (zamiast użycia bufo owanej kopii) o az zapis wszystkich uaktualnień zmiennej gdy takie nastąpią
nne modyf katory (n edotyczące dostępu)
|
89
90
I
Rozdz ał 8. Modyf katory w Jav e
CZĘŚĆ II
Platforma
ROZDZIAŁ 9.
Java SE
P la tfo r m a Ja v a S E (Java P la tfo rm , S ta n d a rd E d itio n ) o b e jm u je JR E (a n g . Java R u n tim e E n v iro n m e n t), JD K (a n g . Java D ev elo p m en t K it, p a trz ro z d z ia ł 10 .),
ję z y k p ro g ra m o w a n ia Jav a, w irtu a ln ą m a sz y n ę Ja v y (ang. Java V irtual M a ch ine, JV M ), n a r z ę d z ia o ra z b ib lio te k i Ja v a S E A P I. D o s tę p n e są o d d z ie ln e p la t fo r m y d la s y s te m ó w W in d o w s (3 2 - i 6 4 -b ito w y ), O S X (6 4 -b ito w y ), L in u x (3 2 - i 6 4 -b ito w y ), L in u x A R M v 6 / 7 V F P -H a r d F P A B I (3 2 -b ito w y ), S o la ris S P A R C (6 4 -b ito w y ) i S o la r is (6 4 -b ito w y ).
Najczęściej używ ane biblioteki API Javy SE S ta n d a rd o w e b ib lio te k i A P I Ja v y S E (h ttp ://d o cs.o ra cle.co m /ja v a se/8/d o cs/a p i/) są d o sta rc z a n e w p a k ie ta c h . K a ż d y z p a k ie tó w sk ła d a się z k la s i/ lu b in te r fe js ó w . W r o z d z ia le p r z e d s ta w io n o s k r ó c o n ą lis tę n a jc z ę ś c ie j u ż y w a n y c h p a k ie tó w . Ja v a S E o fe ru je b ib lio tek i u ru c h o m ie n io w e Ja v a F X z Ja v a S E 7 U p d a te 6 o raz Ja v a F X 2.2 (h ttp://docs.oracle.com /javafxf2/apil ). W y m ie n io n e b ib lio te k i Ja v a F X z a stę p u ją A P I S w in g ja k o n o w ą b ib lio te k ę in terfejsu u ż y tk o w n ik a d la Ja v y SE.
Biblioteki języka i narzędziowe O to lis ta n a jc z ę ś c ie j u ż y w a n y c h b ib lio te k ję z y k a i n a r z ę d z io w y c h : ja v a .la n g Z a p e w n ia o b słu g ę ję z y k a , m e to d sy ste m o w y ch i m a te m a ty cz n y ch , ty p ó w p ro s ty c h , c ią g ó w te k s to w y c h , w ą tk ó w i w y ją tk ó w .
93
ja v a .la n g .a n n o ta tio n F r a m e w o r k a d n o ta c ji, o b słu g a b ib lio te k i m e ta d a n y c h . ja v a .la n g .in s tru m e n t In stru m e n ta cja p ro g ra m u , u słu g i a g e n ta p rz e z n a cz o n e g o d o in stru m e n tami p r o g r a m ó w JV M . ja v a .la n g .in v o k e O b słu g a d y n a m ic z n y ch ję z y k ó w p ro g ra m o w a n ia (an g . D y n a m ic L a n gu a ge S u p p o rt) d o s tę p n a d la k la s p o d s ta w o w y c h i m a s z y n w irtu a ln y c h .
java.lang.m anagem ent A P I Ja v a M a n a g e m e n t E x te n sio n s, m o n ito ro w a n ie i z a rz ą d z a n ie w irtu a ln ą m a s z y n ą Ja v y . ja v a .l a n g .r e f K la sy d o ty cz ą c e o d n ie sień o b iek tu , o b słu g a w s p ó łp ra cy z m e c h a n iz m e m u s u w a n ia n ie u ż y tk ó w . ja v a .l a n g .r e f l e c t R e fle k s y jn e in fo rm a c je o k la s a c h i o b ie k ta c h . ja v a .u t i l N a r z ę d z ia : k o le k c je , m o d e l z d a r z e ń , o b s łu g a d a ty i g o d z in y , a ta k ż e o b s łu g a m ię d z y n a r o d o w a . ja v a .u til.c o n c u r r e n t N a rz ę d z ia d o ty cz ą c e w sp ó łb ie ż n o ści: w y k o n a w c y , k o lejk i, o d m ie rz a n ie c z a su i s y n c h ro n iz a to ry . ja v a .u til.c o n c u r r e n t.a to m ic Z e sta w n a rz ę d z i n ie p o d z ie ln o śc i: z a p e w n ia ją c e b e z p ie c z e ń s tw o w ą tk ó w i u n ik a n ie b lo k a d p ro g ra m o w a n ie z u ż y cie m p o je d y n c z y c h z m ie n n y c h . ja v a .u t il.c o n c u r r e n t .lo c k s F r a m e w o r k b lo k a d , o b słu g a b lo k a d i w a ru n k ó w . ja v a .u t il .f u n c t io n In te rfe js y fu n k c jo n a ln e , z a p e w n ia ty p y d o c e lo w e d la w y r a ż e ń la m b d a i re fe re n c ji d o m e to d . ja v a .u t il .ja r F o r m a t p lik u Ja v a A rc h iv e : o d c z y t i z a p is. ja v a .u t il .lo g g i n g R e je s tro w a n ie d a n y ch , n ie p o w o d z e ń , b łę d ó w , p ro b le m ó w z w y d a jn o śc ią i a w a rii.
94
|
Rozdz ał 9. Java SE
j a v a .u t i l . p r e f s P re fe re n c je u ż y tk o w n ik a i s y s te m u , p o b ie r a n ie i z a p is p re fe re n c ji. ja v a .u t il .r e g e x W y r a ż e n ia re g u la rn e , d o p a s o w y w a n ie s e k w e n c ji z n a k ó w d o w z o rc a . ja v a .u t il.s t r e a m S tru m ie n ie : o p e ra c je w sty lu fu n k c jo n a ln y m p rz e p ro w a d z a n e n a stru m ie n ia c h e le m e n tó w . j a v a .u t i l . z i p F o r m a ty p lik u Z IP i G Z IP : o d c z y t i z a p is.
Biblioteki bazowe O to lis ta n a jc z ę ś c ie j u ż y w a n y c h b ib lio te k b a z o w y c h : ja v a .a p p le t F r a m e w o r k A p p le t: m e to d y d o ty c z ą c e o s a d z a n y c h o k ie n i ic h k o n tro li. ja v a .b e a n s B ea n s: k o m p o n e n ty o p a rte n a Ja v a B e a n s , d łu g o te rm in o w e p rz e c h o w y w a n ie d a n y c h . ja v a .b e a n s.b e a n co n te x t K o n te k s t B e a n s: k o n te n e ry d la B e a n s, ś ro d o w is k a u r u c h o m ie n io w e . ja v a .i o O p e ra c je w e jścia -w y jśc ia p rz e p ro w a d z a n e z a p o m o c ą s tru m ie n i d a n y ch , s y s te m u p lik ó w i s e r ia liz a c ji. java.m ath M a te m a ty k a , o b słu g a n ie z w y k le o g r o m n y c h lic z b c a łk o w ity ch i o p e ra c ji n a lic z b a c h d z ie s ię tn y c h . ja v a .n e t S ie c i: T C P , U D P , g n ia z d a i a d re sy . ja v a .n io W y s o k o w y d a jn e o p e r a c je w e jś c ia -w y jś c ia , b u fo r y , p lik i m a p o w a n e w p a m ię c i. ja v a .n io .c h a n n e ls K a n a ły d la o p e ra c ji w e jścia -w y jśc ia , se le k to ry d la n ie b lo k u ją c y c h o p eracji w e jś c ia -w y jś c ia . ja v a .n io .c h a r s e t Z e s ta w y z n a k ó w , k o n w e rs ja m ię d z y b a jta m i i U n ic o d e .
Najczęśc ej używane b bl otek AP Javy SE
|
95
ja v a .n io .f ile O b s łu g a p lik ó w : p lik i, a try b u ty p lik u , s y s te m y p lik ó w . j a v a .n i o . f i l e .a t t r i b u t e O b s łu g a a try b u tó w p lik u i s y s te m u p lik ó w . ja v a .t e x t N a r z ę d z ia te k s to w e : te k s t, d a ty , lic z b y i k o m u n ik a ty . ja v a .tim e C z a s : d a ta , g o d z in a , c h w ile , c z a s trw a n ia . ja v a .tim e .ch ro n o C z a s : d o s tę p n e s y s te m y k a le n d a rz y . ja v a .tim e .fo rm a t C z a s : w y ś w ie tla n ie i p rz e tw a r z a n ie . jav a.tim e .tem p o ral C z a s : u ż y c ie p ó l d o s tę p u , je d n o s tk i i d o s to s o w a n ie . ja v a .tim e .z o n e C z a s : o b s łu g a s tr e f c z a s o w y c h i ic h re g u ły . ja v a x .a n n o ta tio n T y p y a d n o ta c ji, o b s łu g a b ib lio te k i. javax.management A P I JM X : k o n fig u ra c ja a p lik a c ji, d a n e s ta ty s ty c z n e i z m ia n y sta n u . ja v a x .n e t S ie c i: c z y n n ik i d o ty c z ą c e g n ia z d . ja v a x .n e t .s s l S S L : w y k r y w a n ie b łę d ó w , s z y fro w a n ie d a n y c h i u w ie rz y te ln ia n ie . ja v a x .t o o ls In te rfe jsy n a rz ę d z i w y w o ły w a n y c h p rz e z p ro g ra m , k o m p ila to ry , m e n e d ż e ry p lik ó w .
Biblioteki integracji O to lis ta n a jc z ę ś c ie j u ż y w a n y c h b ib lio te k in te g ra c ji: ja v a .s q l O b słu g a S Q L (ang. S tru ctu red Q u e ry L an gu a ge): u z y sk a n ie d o stęp u i p rze tw arzan ie in fo rm a c ji p o c h o d z ą c y c h z e ź r ó d e ł d a n y c h .
96
|
Rozdz ał 9. Java SE
ja v a x .jw s U s łu g i s ie c io w e Ja v y : o b s łu g a ty p ó w a d n o ta c ji. ja v a x .jw s.s o a p U s łu g i s ie c io w e Ja v y : w ią z a n ia S O A P i p a r a m e tr y k o m u n ik a tó w . javax.nam ing U s łu g i n a z w : JN D I (a n g . Java N a m in g a n d D irecto ry In terfa ce). ja v a x .n a m in g .d ire cto ry U s łu g i k a ta lo g o w e : o p e r a c je JN D I d la o b ie k tó w p r z e c h o w y w a n y c h w k a ta lo g u . jav ax.nam ing .ev ent U s łu g i z d a r z e ń : p o w ia d o m ie n ia o o p e r a c ja c h z w ią z a n y c h z e z d a r z e n ia m i JN D I. javax.nam ing.ld ap O b s łu g a p r o to k o łu L D A P (a n g . L ig h tw e ig h t D ir e c t o r y A c c e s s P ro to co l) w w e r s ji 3: o p e ra c je i k o n tro la . ja v a x .s c r i p t O b s łu g a ję z y k a s k ry p to w e g o : in te g ra c ja , w ią z a n ia i w y w o ły w a n ie . ja v a x .s q l S Q L : A P I b a z y d a n y c h i m o ż liw o ś c i o fe ro w a n e p rz e z s e rw e r. ja v a x .s q l.r o w s e t.s e r ia l M a p o w a n ia s e r ia liz o w a n e m ię d z y ty p a m i S Q L i ty p a m i d a n y c h . ja v a x .s q l.r o w s e t O b słu g a JD B C (an g . Java D atabase C o n nectiv ity ): in te rfe jsy s ta n d a rd o w e . ja v a x .tr a n s a c tio n s .x a O b s łu g a in te rfe js u X A : m e n e d ż e r tr a n s a k c ji i k o n tra k to w a n ia z a s o b ó w d la JT A .
Różne biblioteki interfejsu użytkownika O to lis ta n a jc z ę ś c ie j u ż y w a n y c h b ib lio te k in te rfe js u u ż y tk o w n ik a : ja v a x .a c c e s s i b i l i t y T e c h n o lo g ia u ła tw ie ń d o stę p n o ś c i: o b słu g a w s p o m a g a ją c a k o m p o n e n ty in te rfe js u u ż y tk o w n ik a . jav ax.im ag eio O p e r a c je w e jś c ia -w y jś c ia d o ty c z ą c e o b r a z ó w w Ja v ie , o p is z a w a r to ś c i p lik u g r a fic z n e g o (m e ta d a n e , m in ia tu r k i).
Najczęśc ej używane b bl otek AP Javy SE
|
97
ja v a x .p r in t U s łu g i w y d ru k u : fo r m a to w a n ie i z le c a n ie z a d a ń w y d ru k u . ja v a x .p r i n t .a t t r ib u t e U s łu g i w y d ru k u w Ja v ie : z b ie r a n ie a try b u tó w i k o le k c ji a try b u tó w . ja v a x .p r in t .a tt r ib u t e .s ta n d a r d A tr y b u ty s ta n d a r d o w e , n a jc z ę ś c ie j u ż y w a n e a try b u ty i w a rto ś c i. ja v a x .p r in t.e v e n t Z d a r z e n ia w y d r u k u , m o n ito r o w a n ie u s łu g i z a d a ń w y d ru k u . javax.sound.m idi D ź w ię k : o p e ra c je w e jś c ia -w y jś c ia , s e k w e n c je i M ID I ty p u 0 i 1. javax.sound.sam pled D ź w ię k : s a m p lo w a n ie (a n g . s a m p lin g ) d a n y c h a u d io i o b s łu g a d a n y c h w fo r m a ta c h A IF F , A U i W A V .
Biblioteki JavaFX dla interfejsu użytkownika O to lista n a jc z ę śc ie j u ż y w a n y c h b ib lio te k Ja v a F X d la in te rfe jsu u ż y tk o w n ik a : ja v a fx .a n im a tio n A n im a c je o p a rte n a p rz e jś c ia c h . ja v a fx .a p p lic a tio n C y k l ż y c io w y a p lik a c ji. ja v a fx .b e a n s O g ó ln a fo rm a m o n ito ro w a n ia . ja v a fx .b e a n s.b in d in g C e c h y c h a ra k te r y s ty c z n e w ią z a ń . ja v a fx .b e a n s.p ro p e rty W ła ś c iw o ś c i ty lk o d o o d c z y tu o ra z m o ż liw e d o z a p is u . ja v a fx .b e a n s.p ro p e rty .a d a p te r A d a p te r w ła ś c iw o ś c i. ja v a fx .b e a n s .v a lu e O d c z y t i z a p is. ja v a f x .c o l le c t io n s K o le k c ja n a r z ę d z i Ja v a F X . ja v a fx .c o n c u r re n t W s p ó łb ie ż n e z a d a n ia Ja v a F X .
98
|
Rozdz ał 9. Java SE
javafx.em bed.sw ing A P I S w in g d o ty c z ą c e in te g ra c ji a p lik a c ji. javafx.em bed.sw t A P I S W T d o ty c z ą c e in te g ra c ji a p lik a c ji. ja v a fx .e v e n t F r a m e w o r k E v e n t (n a p r z y k ła d d o s ta r c z a n ie i o b słu g a ). ja v a fx .fx m l Ję z y k z n a c z n ik ó w (n a p r z y k ła d w c z y ty w a n ie h ie r a r c h ii o b ie k tu ). jav afx.g eo m etry G e o m e tr ia d w u w y m ia ro w a . ja v a fx .s c e n e K la s y b a z o w e , A P I S c e n e G ra p h . ja v a fx .s c e n e .c a n v a s K la s y p łó tn a : A P I b e z p o ś r e d n ie g o try b u g e n e r o w a n ia . ja v a fx .s c e n e .c h a r t K o m p o n e n ty w y k r e s ó w , w iz u a liz a c ja d a n y c h . ja v a fx .s c e n e .c o n tr o l K o n tro lk i in te rfe js u u ż y tk o w n ik a , s p e c ja liz o w a n e w ę z ły w A P I S c e n e G rap h . ja v a f x .s c e n e .c o n t r o l .c e ll K la s y z w ią z a n e z k o m ó rk a m i (n a p rz y k ła d k la s y in n e n iż b a z o w e ). ja v a f x .s c e n e .e f f e c t F iltry d la e fe k tó w g r a fic z n y c h , o b s łu g a w ę z łó w w A P I S c e n e G ra p h . ja v a fx .sc e n e .im a g e W c z y ty w a n ie i w y ś w ie tla n ie o b ra z ó w . ja v a fx .s c e n e .in p u t O b s łu g a z d a r z e ń d a n y c h w e jś c io w y c h m y s z y i k la w ia tu ry . ja v a fx .s c e n e .la y o u t K la s y u k ła d u in te rfe jsu . ja v a fx .sc e n e .m e d ia K la s y a u d io i w id e o . ja v a fx .s c e n e .p a in t O b słu g a k o lo ró w i g ra d ie n tó w (na p rz y k ła d w y p e łn ia n ie k sz ta łtó w i tła). ja v a fx .sc e n e .s h a p e K s z ta łty d w u w y m ia ro w e .
Najczęśc ej używane b bl otek AP Javy SE
|
99
ja v a f x .s c e n e .t e x t C z c io n k i i g e n e r o w a n ie w ę z łó w te k s to w y c h . ja v a fx .s c e n e .tr a n s fo rm T r a n s fo r m a c je , ro ta c ja , s k a lo w a n ie , p r z y c in a n ie i tra n s la c je ty p u a ffin e . ja v a fx .sce n e .w e b T r e ś ć s ie c io w a : w c z y ty w a n ie i w y ś w ie tla n ie tre ś c i s ie c io w y c h . ja v a f x .s ta g e K la sa Stage: k o n te n e r n a jw y ż s z e g o p o z io m u . ja v a f x .u t i l N a r z ę d z ia i k la s y p o m o c n ic z e . ja v a f x .u t i l.c o n v e r t e r K o n w e rte ry c ią g ó w te k s to w y c h .
Biblioteki RMI i CORBA O to lis ta n a jc z ę ś c ie j u ż y w a n y c h b ib lio te k z d a ln e g o w y w o ły w a n ia m e to d (a n g . R e m o te M e th o d In v o ca tio n , R M I) i o b s łu g i a r c h ite k tu r y C O R B A (a n g . C o m m o n O bject R eq u est B ro k er A r c h it e c tu r e ):
jav a.rm i B ib lio te k a z d a ln e g o w y w o ły w a n ia m e to d : w y w o ła n ie o b ie k tó w w z d a l n y c h w ir tu a ln y c h m a s z y n a c h Ja v y . ja v a .r m i.a c t iv a t io n A k ty w acja o b iek tu R M I: akty w acja trw ały ch o d n iesień z d a ln y ch o biek tó w . ja v a .rm i.d g c R M I D G C (an g . distributed ga rb a ge collection ): m o n ito ro w a n ie z p o z io m u k lie n ta z d a ln y c h o b ie k tó w . ja v a .r m i.r e g is t r y R e je s tr R M I: z d a ln y o b ie k t m a p u ją c y n a z w y n a z d a ln e o b ie k ty . ja v a .r m i.s e r v e r B ib lio te k a z d a ln e g o w y w o ły w a n ia m e to d p o s tro n ie s e rw e ra : p ro to k ó ł tra n sp o rto w y R M I, tu n e lo w a n ie p ro to k o łu H T T P (an g . H y p ertext T ra n sfer P ro to co l ).
jav ax.rm i B ib lio te k a z d a ln e g o w y w o ły w a n ia m e to d : R M I, R M I-IIO P (a n g . R em o te M eth od Invocation In tern et In terO R B Protocol), JR M P (ang. Java R em ote M e t hod P ro to co l ).
100
|
Rozdz ał 9. Java SE
javax.rmi.CORBA O b s łu g a a r c h it e k t u r y C O R B A : p r z e n o ś n e A P I d la R M I -II O P i O R B (a n g . O bject R eq u est B ro k ers). ja v a x .r m i.s s l O b słu g a S S L (an g . S ecu re d Sockets L ayer): o b słu g a k lie n ta i serw e ra R M I. org.omg.CORBA O b słu g a a rc h ite k tu ry O M G C O R B A : m a p o w a n ie C O R B A n a Ja v ę , O R B . org.omg.CORBA_2_3 D o d a tk i d la a rc h ite k tu ry O M G C O R B A : z a p e w n ie n ie d a lsz e j z g o d n o ś ci z JC K (a n g . Java C om p a tibility K it).
Biblioteki związane z bezpieczeństwem O to lis ta n a jc z ę ś c ie j u ż y w a n y c h b ib lio t e k z w ią z a n y c h z z a p e w n ie n ie m b e z p ie c z e ń s tw a : ja v a .s e c u r it y B e z p ie c z e ń s tw o : a lg o ry tm y , m e c h a n iz m y i p ro to k o ły . ja v a .s e c u r i t y .c e r t C e rty fik aty : p rz e tw a rz a n ie list u n ie w a ż n io n y c h ce rty fik a tó w (an g . C erti fica te R evocation L ists, C R L ) o ra z ś c ie ż e k c e rty fik a c ji i z a rz ą d z a n ie n im i.
ja v a .s e c u r i t y .in t e r f a c e s In te r fe js y b e z p ie c z e ń s tw a : g e n e r o w a n ie R S A (a n g . R iv e s t, S h a m ir, a n d A d e lm a n ) i D S A (a n g . D igita l S ig n a t u re A lg o rith m ).
ja v a .s e c u r ity .s p e c S p e c y fik a c je : k lu c z e b e z p ie c z e ń s tw a i p a r a m e tr y a lg o ry tm ó w . ja v a x .c r y p to O p e ra c je k ry p to g r a fic z n e : s z y fro w a n ie , k lu c z e , g e n e r a to r y M A C . ja v a x .c r y p to .in t e r fa c e s K lu c z e D iffie -H e llm a n z d e fin io w a n e w R S A L a b o r a to r ie s ' P K C S #3. ja v a x .c r y p to .s p e c S p e cy fik a cje d o ty cz ą ce k lu cz y b e z p iecz e ń stw a i p a ra m e tró w alg o ry tm ó w . ja v a x .s e c u r ity .a u th U w ie r z y te ln ia n ie i a u to r y z a c ja : s p e c y fik a c je k o n tro li d o s tę p u . ja v a x .s e c u r ity .a u t h .c a llb a c k O b s łu g a w y w o ła ń z w r o tn y c h u w ie r z y te ln ia n ia : w s p ó łd z ia ła n ie u s łu g z a p lik a c ja m i.
Najczęśc ej używane b bl otek AP Javy SE
|
101
ja v a x .s e c u r ity .a u th .k e r b e r o s P ro to k ó ł K e rb e ro s d o u w ie r z y te ln ia n ia s ie c io w e g o i p o w ią z a n e z n im k la s y n a r z ę d z io w e . ja v a x .s e c u r it y .a u t h .lo g in L o g o w a n ie i k o n fig u ra c ja , fra m e w o r k P A M . ja v a x .s e c u r ity .a u th .x 5 0 0 O b s łu g a s ta n d a r d ó w X .5 0 0 : o p e ra c je d o ty c z ą c e p a m ię c i m a s o w e j. ja v a x .s e c u r it y .s a s l O b słu g a S A S L (an g . S im p le A u th en tica tio n a n d S ecu rity L a y er): u w ie rz y te ln ia n ie S A S L . o r g . i e t f . jg s s O b s łu g a J G S S (a n g . Ja v a G e n e r ic S e c u r i t y S e r v i c e ) : u w ie r z y t e ln i a n i e i s p ó jn o ś ć d a n y c h .
Biblioteki XML O to lis ta n a jc z ę ś c ie j u ż y w a n y c h b ib lio te k d o o b słu g i X M L : javax.xm l O b s łu g a ję z y k a X M L (a n g . E x ten sib le M a rk u p L a n g u a g e ): sta łe . jav ax .x m l.b in d W ią z a n ia ś ro d o w is k a u ru c h o m ie n io w e g o X M L : m a rsh a llin g 1, u n m a rs h a llin g 2 i w e ry fik a c ja . ja v a x .x m l.cry p to K ry p to g ra fia X M L : g e n e r o w a n ie s y g n a tu r i s z y fr o w a n ie d a n y c h . jav ax.xm l.cryp to.d om X M L i m o d e l D O M (ang . D o cu m e n t O bject M o d el ): im p le m e n ta c je k ry p to g raficzn e . ja v a x .x m l.c r y p to .d s ig S y g n a tu r y c y fro w e X M L : g e n e r o w a n ie i w e ry fik a c ja . jav ax .x m l.d ataty p e X M L i ty p y d a n y c h Ja v y : m a p o w a n ie . javax.xm l.nam espace P rz e s trz e n ie n a z w X M L : p rz e tw a r z a n ie .
1 Proces zmiany obiektu na prostszy format — przyp. tłum. 2 Proces odwrotny do marshallingu — przyp. tłum.
102
|
Rozdz ał 9. Java SE
ja v a x .x m l.p a rs e rs P r z e t w a r z a n ie X M L : S A X (a n g . S im p le A P I f o r X M L ) i p r z e tw a r z a n ie DOM. jav ax.xm l.so ap X M L : k o m u n ik a ty S O A P — tw o r z e n ie i b u d o w a n ie . ja v a x .x m l.tra n sfo rm P rz e tw a rz a n ie tr a n s fo rm a c ji X M L : b r a k z a le ż n o ś c i o d D O M lu b S A X . javax.xm l.transform .dom P r z e tw a r z a n ie tr a n s fo r m a c ji X M L : A P I c h a r a k te r y s ty c z n e d la m o d e lu DOM. ja v a x .x m l.tra n s fo rm .sa x P rz e tw a rz a n ie tr a n s fo rm a c ji X M L : A P I c h a ra k te r y s ty c z n e d la S A X . ja v a x .x m l.tra n s fo rm .sta x P r z e t w a r z a n ie t r a n s f o r m a c ji X M L : A P I c h a r a k te r y s t y c z n e d la S tA X (a n g . S tr e a m in g A P I f o r X M L ). ja v a x .x m l.v a lid a tio n W e r y fik a c ja X M L w z g lę d e m s c h e m a tu X M L . javax.xm l.w s A P I Ja v y d la u s łu g s ie c io w y c h X M L (JA X -W S ): p o d s ta w o w e A P I. jav ax.xm l.w s.h an d ler JA X -W S — o b s łu g a k o m u n ik a tó w : k o n te k s t k o m u n ik a tó w i o b s łu g a in te r fe js ó w . jav ax.xm l.w s.h an d ler.so ap JA X -W S : o b słu g a k o m u n ik a tó w S O A P . ja v a x .x m l.w s.h ttp JA X -W S : w ią z a n ia H T T P . jav ax.xm l.w s.soap JA X -W S : w ią z a n ia S O A P . jav ax.xm l.xp ath W y r a ż e n ia X P a th : o b lic z a n ie i d o stę p . org.w3c.dom M o d e l W 3 C D O M : d o s tę p i u a k tu a ln ia n ie tre ś ci o ra z s tr u k tu r y p lik u . o rg .x m l.sax X M L .o r g S A X : d o s tę p i u a k tu a ln ia n ie tre ś c i o ra z s tru k tu ry p lik u .
Najczęśc ej używane b bl otek AP Javy SE
\ 103
104
I
Rozdz ał 9. Java SE
ROZDZIAŁ 10.
Podstawy programowania
Ś ro d o w isk o JR E (an g . Java R u n tim e E n v iro n m en t) z a p e w n ia m o ż liw o ść u ru c h a m ia n ia a p lik a c ji Ja v y . Z k o le i J D K (a n g . Java D ev elo p m en t K it) d o s ta rc z a w sz y stk ie k o m p o n e n ty i z a so b y n ie z b ę d n e d o o p ra c o w y w a n ia ap lik acji Jav y .
JRE JR E to k o le k c ja o p r o g ra m o w a n ia p o z w a la ją c e g o s y s te m o w i o p e ra c y jn e m u n a u r u c h a m ia n ie a p lik a c ji Ja v y . W s p o m n ia n a k o le k c ja s k ła d a s ię z w irtu a ln e j m a s z y n y Ja v y (a n g . Java V irtu a l M a c h in e ) in te rp re tu ją c e j k o d b a jto w y Ja v y i z a m ie n ia ją c e j g o n a k o d m a s z y n o w y , a ta k ż e z b ib lio te k k la s s ta n d a r d o w y c h , z e s ta w ó w n a r z ę d z io w y c h in te r fe js u u ż y tk o w n ik a o r a z w ie lu ró ż n y c h n a r z ę d z i.
JDK JD K to ś ro d o w is k o p ro g ra m is ty c z n e p rz e z n a c z o n e d o k o m p ila c ji, d eb u g o w a n ia i u ru c h a m ia n ia a p lik acji Ja v y , Ja v a B e a n s o raz a p le tó w Ja v y . N a JD K s k ła d a s ię ś ro d o w is k o JR E w r a z z ję z y k ie m p ro g ra m o w a n ia Ja v a , d o d a t k o w y m i n a r z ę d z ia m i p ro g r a m is ty c z n y m i i A P I n a r z ę d z i. JD K d o s ta rc z a n e p r z e z firm ę O ra c le o b s łu g u je s y s te m y O S X , S o la r is , L in u x (O ra c le , S u se , R e d H a t, U b u n tu i D e b ia n — ta k ż e n a A R M ), M ic r o s o ft W in d o w s (S e rv e r 2 0 0 8 R 2, S e rv e r 2 0 1 2 , V ista , W in d o w s 7 i W in d o w s 8). S p e cja ln e g o p rz e z n a czen ia w irtu a ln e m a sz y n y Jav y , JD K i JR E d la in n y ch sy ste m ó w o p eracy jn y ch , s ą d o s tę p n e b e z p ła tn ie n a s tro n ie h ttp ://ja v a -v irtu a l-m a ch in e.n et/o th er.h tm l. O b słu g iw a n e p rz e g lą d a rk i in te rn e to w e to In te rn e t E x p lo re r 9+ , M o z illa F irefo x, C h r o m e (W in d o w s ) i S a fa ri 5 + .
105
W ta b e li 10.1 w y m ie n io n o w e rs je JD K d o sta rc z a n e p rz e z O ra c le . N a jn o w s z ą w e rs ję JD K m o ż n a p o b r a ć n a s tro n ie h ttp ://w w w .o ra cle.co m /tech n etw o rk /ja v a / ja v a se/d o w n lo a d s/in d ex.h tm l, n a to m ia s t sta rsz e w y d a n ia są d o stę p n e n a stro
n ie h ttp ://w w w .o ra cle.co m /tech n etw o rk /ja v a /a rch iv e-1 3 9 2 1 0 .h tm l. Tabela 1 0 .1 . W ersje JD K dostarczane przez Oracle
JDK
Nazwa kodowa
Java SE 8 i JDK 1 8 0 Java SE 7 i JDK 170
Dolphin
Rok wydan a
L czba pak etów
L czba klas
2014
217
4240
2011
209
4024
Java SE 6 iJDK 1 60
Mustang
2006
203
3793
Java 2 SE 5 0 i JDK 150
Tige
2004
166
3279
Java 2 SE i JDK 140
Me lin
2002
135
2991
Java 2 SE i JDK 13
Kest el
2000
76
1842
Java 2 i SDK 1 2
Playg ound
1998
59
1520
1997
23
504
1996
8
212
Development Kit 11 Development Kit 1 0
Oak
W m a rc u 2 0 1 3 firm a O ra c le z a p rz e s ta ła w y d a w a n ia u a k tu a ln ie ń d la Ja v y SE w w e rs ji 6.
Struktura program u w Javie P lik i k o d u ź ró d ło w e g o Ja v y są tw o rz o n e z a p o m o c ą e d y to ra te k stó w , ta k ie g o ja k jE d it, T e x tP a d , V im , N o te p a d + + lu b d o s ta rc z a n e g o p rz e z z in te g ro w a n e śro d o w is k o p ro g ra m is ty c z n e (an g . In tegra ted D ev elo p m en t E n v iro n m en t, ID E ) Ja v y . P lik i k o d u ź ró d ło w e g o m u s z ą m ie ć r o z s z e rz e n ia .java i ta k ą s a m ą n a z w ę , ja k n a z w a k la s y p u b lic z n e j w d a n y m p lik u . Je ż e li k la s a m a u p r a w n ie n ia d o s tę p u p a ck a g e-p riv a te , w ó w c z a s n a z w a k la s y m o ż e b y ć in n a n iż n a z w a p lik u . D la te g o te ż p lik k o d u ź r ó d ło w e g o o n a z w ie H ello W o rld .ja v a b ę d z ie o d p o w ia d a ł k la s ie p u b lic z n e j o n a z w ie HelloWorld, ja k p r z e d s ta w io n o w p o n iż s z y m p r z y k ła d z ie (w ie lk o ś ć lite r w n a z e w n ic tw ie Ja v y m a z n a c z e n ie ): 1 2 3 4 5 6
106
I
package com .oreilly .tu torial; import jav a.tim e.*; // importjava.time.ZoneId; // importjava.time.Clock;
public class HelloWorld
Rozdz ał 10. Podstawy programowan a
7 { 8 public s ta tic void main(String[] args) 9 { 10 ZoneId zi = ZoneId.systemDefault(); 11 Clock c = Clock.system(zi); 12 System.out.print("Z: " + c.getZ on e().getId()); 13 System .out.println(", \"Witaj, św iecie!\ ""); 14 } 15 } W w ie rsz u 1. w id z im y , ż e k la sa HelloWorld z n a jd u je się w p a k ie c ie o n a z w ie c o m .o r e i l ly .t u t o r ia l . W y m ie n io n a n a z w a p a k ie tu s u g e r u je d o s tę p n o ś ć d la k o m p ila to ra i śro d o w isk a u ru ch o m ie n io w e g o stru k tu ry k a ta lo g ó w com /oreilly/ tutorial. S to so w a n ie te g o ro d z a ju p a k ie tó w d la p lik ó w ź ró d ło w y ch je s t o p cjo
n aln e , a le z a le c a n e w celu u n ik n ię c ia k o n flik tó w z in n y m i p a k ie ta m i o p ro g r a m o w a n ia . D ek laracja import w w ie rsz u 2. p o z w a la w irtu aln ej m a sz y n ie Ja v y n a w y sz u k iw an ie k las p o c h o d z ą c y c h z in n y ch p a k ie tó w . U ż y ta tu taj g w ia z d k a o zn acza w s z y s tk ie k la s y w p a k ie c ie ja v a .tim e . Z a w s z e w a r to p o d a w a ć d o k ła d n e n a z w y d o łą c z a n y c h k la s , a b y w te n s p o s ó b d o k u m e n t o w a ć z a le ż n o ś c i. W o m a w ia n y m p r z y k ła d z ie o z n a c z a to u ż y c ie p o le c e ń import ja v a .tim e . ^ Z o n e Id ; i import ja v a .t i m e .C l o c k ;. W y m ie n io n e p o le c e n ia u m ie s z c z o n o w k o m e n ta rz u i s ta n o w ią le p s z e ro z w ią z a n ie n iż p o p ro s tu import ja v a . ^ t i m e . * ; . T rz e b a w ty m m ie js c u w s p o m n ie ć , ż e n ie m a k o n ie c z n o ś c i u ż y w a n ia p o le ce ń import, p o n ie w a ż p e łn ą n a z w ę p a k ie tu m o ż n a p o d a w a ć p rz e d n a z w ą k a ż d e j k la s y . T o je d n a k n ie je s t id e a ln y s p o s ó b tw o r z e n ia k o d u ź ró d ło w e g o . a
P akiet java.lang to jed y n y p ak iet Jav y, który je st d om yślnie
W w ie r s z u 6. w id z im y je d y n ą k la s ę p u b lic z n ą n a jw y ż s z e g o p o z io m u z d e fin io w a n ą w p lik u k o d u ź ró d ło w e g o . W p lik u m o ż e b y ć z d e fin io w a n a ty lk o je d n a k la s a te g o ro d z a ju . P o z a n ią w p lik u m o ż n a z d e fin io w a ć w ie le n a j w y ż s z e g o p o z io m u k la s o u p r a w n ie n ia c h d o s tę p u p a ck a ge-p riv a te. P a trz ą c n a w ie rsz 8., z a u w a ż y sz , ż e ap lik a cja Ja v y m u si m ie ć m e to d ę main(). W y m ie n io n a m e to d a je s t p u n k te m p o c z ą tk o w y m d la p r o g r a m u Ja v y , a je j z d e fin io w a n ie je s t k o n ie c z n e . M o d y fik a to r e m d o s tę p u m e to d y m ain() m u si b y ć pu blic s t a t i c void. P a ra m e tr args d o sta rc z a ta b lic ę a rg u m e n tó w w ie rsz a p o le c e ń .
Struktura programu w Ja ve
| 107
Aplikacje oparte na wielowarstwowej architekturze komponen towej (na przykład Spring i Java EE) nie m ają m etody main().
W w ie rsz a c h 12. i 13. m a m y p o le ce n ia w y w o łu ją ce m e to d y S y ste m .o u t.p rin t() i S y s te m .o u t.p r in tln () o d p o w ie d z ia ln e z a w y ś w ie tle n ie w s k a z a n e g o te k s tu w o k n ie k o n so li.
N arzędzia w ie rsza poleceń JD K d o sta rc z a w ie le d z ia ła ją c y c h z p o z io m u w ie rsz a p o le ce ń n a rz ęd z i, k tó re m a ją p o m ó c w tw o r z e n iu o p r o g r a m o w a n ia . D o w s p o m n ia n y c h n a r z ę d z i z a lic z a m y m ię d z y in n y m i k o m p ila to r, in te rp re te r, a rc h iw iz a to r i n a r z ę d z ie p rz e z n a cz o n e d o g e n ero w a n ia d o k u m e n ta cji. P ełn ą listę d o stę p n y ch n a rz ęd z i p rz e d s ta w io n o n a s tro n ie h ttp ://d o cs.o m d e.co m /ja v a se /8 /d o c s/tec h n o tes/to o ls/.
Kompilator Javy K o m p ila to r Ja v y p o w o d u je p r z e k s z ta łc e n ie p lik ó w k o d u ź ró d ło w e g o Ja v y n a k o d b a jto w y Ja v y . K o m p ila to r tw o rz y p lik k o d u b a jto w e g o o tak iej sam ej n a z w ie , ja k p lik k o d u ź ró d ło w e g o , a le z ro z s z e rz e n ie m .class. O to lista n a j c z ę ś c ie j u ż y w a n y c h o p c ji k o m p ila to ra : ja v a c [-o p c je ]
[p lik i kodu źródłowego]
K o m p ila c ja p lik ó w k o d u ź ró d ło w e g o Ja v y . ja v a c H elloW orld.java K o m p ila c ja p r o g ra m u i w y g e n e r o w a n ie p lik u H ello W o rld .cla ss . ja v a c -cp /dir/C lasses/ H elloW orld.java O p c je -cp i -c la s sp a th m a ją ta k ie s a m o z n a c z e n ie i w s k a z u ją k a ta lo g i, k tó re b ę d ą w y k o r z y s ty w a n e p o d c z a s k o m p ila c ji. ja v a c -d /opt/hwapp/classes H elloW orld.java O p c ja -d p o w o d u je u m ie s z c z e n ie p lik ó w w y g e n e r o w a n y c h k la s w e w s k a z a n y m k a ta lo g u , k tó ry m u s i b y ć w c z e ś n ie j u tw o r z o n y . Je ż e li ist n ie je d e fin ic ja p a k ie tu , je g o ście ż k a d o stę p u b ę d z ie d o łą c z o n a (n a p rz y k ła d /o p t/h w a p p /cla sses/co m /o reilly /tu to ria l/ ).
108
|
Rozdz ał 10. Podstawy programowan a
ja v a c - s /opt/hwapp/src H elloW orld.java O p c ja - s p o w o d u je u m ie s z c z e n ie p lik ó w w y g e n e r o w a n y c h k la s w e w s k a z a n y m k a ta lo g u , k tó ry m u si b y ć w c z e śn ie j u tw o rz o n y . Je ż e li istn ieje d efin icja p a k ie tu , je g o ścieżk a d o stę p u b ę d z ie d alej ro z sz e rz o n a (n a p rz y k ła d /o p t/h w a p p /src/co m /o reilly /tu to ria l/). ja v a c -so u rc e 1 .4 H elloW orld.java O p c ja -s o u rc e z a p e w n ia z g o d n o ś ć k o d u ź r ó d ło w e g o z e w s k a z a n y m w y d a n ie m Ja v y i p o z w a la n a u ż y c ie ja k o id e n ty fik a to ró w n ie o b s łu g iw a n y c h s łó w k lu c z o w y c h . ja v a c -X O p c ja -X w y ś w ie tla o p is o p c ji n ie s ta n d a r d o w y c h . N a p r z y k ła d - X l in t : ^ u n ch ecked w łą c z a z a le c a n e o s t r z e ż e n ia , c o p o w o d u je w y ś w ie tle n ie d o k ła d n ie jsz y c h in fo rm a cji o n ie sp ra w d z o n y c h lu b n ie b e z p ie c z n y ch o p e racjach .
Choć -Xlint i inne opcje -X są często spotykane w kom pilato rach Javy, ale nie są standaryzow ane. Dlatego też nie należy przyjm ow ać założenia, że będą dostępne we w szystkich JDK. ja v a c -v e rsio n O p c ja -v e rsio n p o w o d u je w y ś w ie tle n ie in fo rm a c ji o w e rs ji n a r z ę d z ia ja v a c. ja v a c -h e lp O p c ja -h e lp lu b b r a k a r g u m e n tó w p o w o d u je w y ś w ie tle n ie in fo r m a c ji p o m o c y d o ty c z ą c y c h n a r z ę d z ia ja v a c.
Interpreter Javy In te rp re te r Ja v y z a jm u je się o b słu g ą w y k o n y w a n ia p ro g ra m u , m ię d z y in n y m i u r u c h o m ie n ie m a p lik a c ji. P o n iż e j p r z e d s ta w io n o lis tę n a jc z ę ś c ie j s to s o w a n y c h o p c ji in te rp re te ra : ja v a [-o p c je ]
klasa [arg u m en ty ...]
U r u c h o m ie n ie in te rp re te ra . ja v a [-o p c je ] - j a r p lik _ ja r [arg u m en ty ...] U r u c h o m ie n ie p lik u JA R . ja v a HelloWorld U r u c h o m ie n ie ś ro d o w is k a JR E , w c z y ta n ie k la s y HelloWorld i w y k o n a n ie m e to d y main() k la s y .
Narzędz a w ersza poleceń
| 109
ja v a c o m .o r e illy .tu to r ia l.H e llo W o rld U r u c h o m ie n ie ś ro d o w is k a JR E , w c z y ta n ie k la s y HelloWorld z k a ta lo g u co m /o reilly /tu to ria l/ i w y k o n a n ie m e to d y main() k la s y .
ja v a -cp /tmp/Classes HelloWorld O p c je -cp i -c la s s p a th w s k a z u ją k a ta lo g i u ż y w a n e w tr a k c ie d z ia ła n ia in te rp re te ra . ja v a -D su n .jav a2d .d d scale= tru e HelloWorld O p cja -D p o w o d u je u staw ien ie w arto ści w łaściw o ści sy stem o w ej. W o m a w ia n y m p rz y k ła d z ie w łą c z o n o s p r z ę to w y a k c e le r a to r s k a lo w a n ia . ja v a -e a HelloWorld O p c je -ea i -en ab le asse rtio n s p o w o d u je w łą cz e n ie asercji w Jav ie. W s p o m n ia n e a se rcje to k o d d ia g n o sty cz n y , k tó ry m o ż n a u m ie śc ić w ap lik acji. W ię c e j in fo rm a c ji o a s e r c ja c h z n a jd z ie s z w r o z d z ia le 6. ja v a -da HelloWorld O p c je -da i -d is a b le a s s e r tio n s w y łą c z a ją a s e r c je w Ja v ie . ja v a - c l i e n t HelloWorld O p cja - c li e n t p o z w a la n a w y b ó r klien ta w irtu a ln e j m a sz y n y Ja v y w celu u s p r a w n ie n ia s p o s o b u d z ia ła n ia a p lik a c ji in te r a k ty w n y c h , ta k ic h ja k w y p o s a ż o n e w g r a fic z n y in te rfe js u ż y tk o w n ik a . ja v a -s e r v e r HelloWorld O p cja -se rv e r p o z w a la n a w y b ó r serw e ra w irtu a ln e j m a s z y n y Jav y , a b y w te n s p o s ó b p o p r a w ić o g ó ln ą w y d a jn o ś ć s y s te m u . ja v a -sp la sh :im a g e s/ w o rld .g if HelloWorld O p c ja -sp lash a k c e p tu je a rg u m e n t w s k a z u ją c y w in ie tę w y św ie tla n ą tu ż p r z e d u r u c h o m ie n ie m a p lik a c ji. ja v a -v e rsio n O p c ja -v e rsio n w y ś w ie tla in fo rm a c je o w e r s ji in te rp re te ra Ja v y , ś ro d o w is k a JR E o ra z m a s z y n y w irtu a ln e j. ja v a [-d32 | -d64] O p c je [-d32] i [-d64] p o w o d u ją u ż y c ie (o d p o w ie d n io ) 3 2 - lu b 6 4 -b ito w e g o m o d e lu d a n y c h , o ile to m o ż liw e . ja v a -h e lp O p c ja -h e lp lu b b r a k a r g u m e n tó w p o w o d u je w y ś w ie tle n ie in fo r m a c ji p o m o c y d o ty c z ą c y c h in te rp re te ra ja v a .
110
|
Rozdz ał 10. Podstawy programowan a
javaw W s y s te m ie o p e ra c y jn y m W in d o w s javaw je s t o d p o w ie d n ik ie m p o le ce n ia ja v a , a le b e z w y ś w ie t la n ia o k n a k o n s o li. W s y s te m ie L in u x te n s a m e fe k t m o ż n a u z y s k a ć p rz e z u r u c h o m ie n ie in te rp re te ra ja v a w tle: ja v a &.
Archiwizacja programu Javy N a rz ę d z ie j a r je s t p rz e z n a cz o n e d o a rc h iw iz a cji i k o m p re sji, z w y k le stoso w a n e w c e lu p o łą c z e n ia w ie lu p lik ó w w p o je d y n c z y , n a z y w a n y p lik ie m JA R (a n g . Java A r c h iv e ). P lik JA R s k ła d a s ię z a r c h iw u m Z IP z a w ie ra ją c e g o p lik m a n ife s tu (o p is u ją c y z a w a r to ś ć p lik u JA R ) o ra z o p c jo n a ln y c h p lik ó w s y g n a tu r (ze w z g lę d ó w b e z p iecz e ń stw a ). P on iżej w y m ie n io n o listę n ajczęściej u ż y w a n y c h o p c ji n a r z ę d z ia j a r w ra z z p rz y k ła d a m i: j a r [o p cje ] ^ p lik i...
[ p l i k - ja r ]
[p lik -m a n ife stu ]
[punkt-początkowy]
[-C katalog]
T o p o le c e n ie p rz e d s ta w ia o g ó ln y s p o s ó b u ż y c ia n a r z ę d z ia ja r . j a r c f f i l e s . j a r H elloW orld.java com / o reilly / tu to rial/ H ello W o rld .class O p c ja c p o z w a la n a u tw o rz e n ie p lik u JA R , n a to m ia s t o p cja f u m o ż liw ia p o d a n ie je g o n a z w y . W o m a w ia n y m p r z y k ła d z ie w p lik u JA R z o s ta n ą u m ie s z c z o n e p lik i H ello W o rld .ja v a i co m /o reilly /tu to ria l/H ello W o rld .cla ss. ja r tfv f i l e s .ja r O p c ja t p o z w a la n a w y św ie tle n ie z a w a rto ś c i p lik u JA R , n a to m ia s t o p cja f u m o ż liw ia p o d a n ie n a z w y p lik u . Z k o le i o p cja v o z n a cz a , ż e w y św ie tlo n e z o s ta n ą s z c z e g ó ło w e in fo rm a c je o z a w a r to ś c i p lik u JA R . ja r x f f i l e s .ja r O p cja x p o z w a la n a w y o d rę b n ie n ie z a w a rto ści p lik u JA R , n a to m ia s t o p cja f u m o ż liw ia p o d a n ie n a z w y p lik u . _**r'
Kilka innych narzęd zi przeznaczonych do pracy z archiw am i Z IP (na przykład 7-Zip, W inZip i W inrar) obsługuje pliki JAR.
Uruchomienie pliku JAR P lik i JA R są tw o rz o n e , a b y m o ż n a je b y ło u ru c h a m ia ć p rz e z p o d a n ie n a z w y p lik u JA R z a w ie ra ją c e g o k la sę „ g łó w n ą ". D z ię k i te m u in te rp re te r Ja v y w ie , k tó ra m e to d a main() p o w in n a z o sta ć w y k o n a n a . P on iżej p rz e d sta w io n o p e łn ą p r o c e d u r ę u tw o r z e n ia w y k o n y w a ln e g o p lik u JA R :
Narzędz a w ersza poleceń
|
111
1. U tw ó rz p lik H elloW orld.java z a w ie ra ją c y k la s ę Hel loWorld p rz e d sta w io n ą n a p o c z ą tk u r o z d z ia łu . 2 . U tw ó rz s tru k tu rę k a ta lo g ó w co m /o reilly /tu to ria l. 3 . W y d a j p o le c e n ie ja v a c HelloWorld. W y m ie n io n e p o le c e n ie p o w o d u je k o m p ila c ję p r o g ra m u i u m ie s z c z e n ie p lik u H ello W o rld .cla ss w k a ta lo g u co m /o reilly /tu to ria l. 4 . W k a t a lo g u z a w ie r a ją c y m p a k ie t u m ie ś ć p l ik o n a z w ie M a n if e s t .t x t . W w y m ie n io n y m p lik u p o w in ie n z n a le ź ć s ię n a s tę p u ją c y w ie rsz w s k a z u ją c y m ie js c e p o ło ż e n ia k la s y g łó w n e j: Main-Class: com.oreilly.tutorial.HelloWorld 5 . W y d a j p o le ce n ie j a r cmf M a n ife st.tx t h elloW orld .jar com / o reilly/ tu to rial. P o w y ż s z e p o le c e n ie p o w o d u je u tw o r z e n ie p lik u JA R i d o d a n ie z a w a r to ści M a n ifest.tx t d o p lik u m a n ife s tu o n a z w ie M A N I F E S T .M F . P lik m a n ife s tu je s t u ż y w a n y ta k ż e d o d e fin io w a n ia r o z s z e r z e ń i r ó ż n y c h d a n y c h z w ią z a n y c h z p a k ie ta m i: Manifest-Version: 1.0 Created-By: 1.7.0 (Oracle Corporation) Main-Class: com.oreilly.tutorial.HelloWorld 6 . W y d a j p o le c e n ie j a r t f H elloW orld .jar. P o w y ż s z e p o le c e n ie p o w o d u je w y ś w ie tle n ie z a w a r to ś c i p lik u JA R : META-INF/ META-INF/MANIFEST.MF com/ com/oreilly/ com/oreilly/tutorial com/oreilly/tutorial/Hel loWorld.cl ass 7. W y d a j p o le c e n ie ja v a - j a r H elloW orld .jar. O sta tn ie p o le ce n ie w o m a w ia n e j p ro ce d u rz e u ru c h a m ia u tw o rz o n y w c z e śn iej p lik JA R .
Narzędzie Javy do generowania dokumentacji D z ia ła ją c e z p o z io m u w ie r s z a p o le c e ń n a r z ę d z ie javadoc je s t p rz e z n a c z o n e d o g e n e r o w a n ia d o k u m e n ta c ji w p lik a c h k o d u ź ró d ło w e g o . D o k u m e n ta c ja b ę d z ie z n a c z n ie d o k ła d n ie js z a , g d y w k o d z ie ź r ó d ło w y m z o s ta n ą u m ie s z czo n e o d p o w ie d n ie k o m e n ta rz e Ja v a d o c (w ięcej in fo rm a cji n a te n te m a t zn aj d z ie sz w ro z d z ia le 2.). P o n iż e j w y m ie n io n o listę n a jc z ę śc ie j u ż y w a n y c h o p cji n a r z ę d z ia javadoc w ra z z p rz y k ła d a m i:
112
I
Rozdz ał 10. Podstawy programowan a
javadoc [o p cje ]
[nazwy_pakietów] [pliki_kodu_źródłowego]
T o p o le c e n ie p rz e d sta w ia o g ó ln y s p o só b u ż y cia n a rz ę d z ia g e n e ru ją c e g o d o k u m e n ta c ję k o d u ź ró d ło w e g o w Ja v ie . javadoc H elloW orld.java N a r z ę d z ie jav ad oc g e n e r u je d o k u m e n ta c ję w p lik a c h H T M L : H ello W orld.htm l, in d ex .h tm l, allclasses-fram e.htm l, constant-values.htm l, deprecatedlist.h tm l , o v erv iew - tree.h tm l , p a ck a g e-su m m a ry .h tm l itd .
javadoc -v erb o se H elloW orld.java O p cja -verbose w y św ie tla w ięcej in fo rm acji sz cz e g ó ło w y c h p o d cz a s d z ia łan ia n a r z ę d z ia javadoc. javadoc -d /tmp/ H elloW orld.java O p cja -d w sk a z u je k atalo g , w k tó ry m m a ją z o sta ć u m iesz cz o n e w y g e n e ro w a n e p lik i H T M L . W p rz y p a d k u b ra k u o m a w ia n e j o p cji p lik i z o sta n ą u m ie s z c z o n e w k a ta lo g u b ie ż ą c y m . javadoc -so u rcesp ath /Classes/ T e s t.ja v a O p c ja -so u rcep ath w s k a z u je p o ło ż e n ie p lik ó w k o d u ź r ó d ło w e g o .java p r z y g o to w a n y c h p rz e z u ż y tk o w n ik a . javadoc -exclu d e T e s t.ja v a O p cja -exclude p o z w a la n a w sk a z a n ie p a k ie tó w , k tó re m a ją z o sta ć w y k lu c z o n e p o d c z a s g e n e r o w a n ia d o k u m e n ta c ji. javadoc -p u b lic T e s t.ja v a O p c ja -p u b lic p o w o d u je w y g e n e r o w a n ie d o k u m e n ta c ji d la p u b lic z n y c h k la s i e le m e n tó w s k ła d o w y c h . javadoc -p ro te c te d T e s t.ja v a O p c ja -p ro tected p o w o d u je w y g e n e ro w a n ie d o k u m e n ta c ji d la c h ro n io n y c h k la s i e le m e n tó w s k ła d o w y c h . T o je s t u s ta w ie n ie d o m y ś ln e . javadoc -package T e s t.ja v a O p c ja -package p o w o d u je w y g e n e r o w a n ie d o k u m e n ta c ji d la p a k ie tu , p u b lic z n y c h o ra z c h r o n io n y c h k la s i e le m e n tó w s k ła d o w y c h . javadoc -p r iv a te T e s t.ja v a O p c ja -p riv a te p o w o d u je w y g e n e ro w a n ie d o k u m e n ta c ji d la w s z y s tk ic h k la s i e le m e n tó w s k ła d o w y c h . javadoc -h e lp O p c ja -h e lp lu b b r a k a r g u m e n tó w p o w o d u je w y ś w ie tle n ie in fo r m a c ji p o m o c y d o ty c z ą c y c h n a r z ę d z ia javadoc.
Narzędz a w ersza poleceń
|
113
Classpath T y tu ło w y cla ssp a th to a r g u m e n t u s ta w ia n y p rz e z w ie le n a r z ę d z i d z ia ła ją cy ch n a p o z io m ie w ie rsz a p o le ce ń . W a rto ś ć o m a w ia n e g o a rg u m e n tu w s k a z u je w irtu a ln e j m a s z y n ie Ja v y lo k a liz a c ję , w k tó re j z n a jd u ją s ię z d e fin io w a n e p rz e z u ż y tk o w n ik a k la s y i p a k ie ty . K o n w e n c je d o ty c z ą c e a rg u m e n tu cla ssp a th ró ż n ią s ię w p o s z c z e g ó ln y c h s y s te m a c h o p e ra c y jn y c h . W s y s te m a c h M ic r o s o ft W in d o w s k a ta lo g i p o d a n e w ś c ie ż c e d o s tę p u są ro z d z ie lo n e le w y m i u k o ś n ik a m i, n a to m ia s t ś r e d n ik s łu ż y d o r o z d z ie le n ia p o s z c z e g ó ln y c h ście ż e k : -classpath \home\XClasses\;dir\YClasses\;. Z k o le i w s y s te m a c h o p e ra c y jn y c h z g o d n y c h z P O S IX (n a p rz y k ła d S o la ris, L in u x i O S X ) k a ta lo g i p o d a n e w ś cie ż ce d o stę p u są ro z d z ie lo n e u k o śn ik a m i, n a to m ia s t d w u k r o p e k s łu ż y d o ro z d z ie le n ia p o s z c z e g ó ln y c h ś cie ż e k : -classpath /home/XClasses/:dir/YClasses/:. K ropka oznacza katalog bieżący.
M o ż n a u s ta w ić z m ie n n ą ś r o d o w is k o w ą CLASSPATH i ty m s a m y m w s k a z a ć k o m p ila to r o w i Ja v a lo k a liz a c ję p lik ó w k la s i p a k ie tó w : rem Windows set CLASSPATH=classpath1;classpath2 # Linux, S o laris, Mac OS X # (mogą występować pewne różnice ze względu na specyfikę powłoki). setenv CLASSPATH classpath1:classpath2
114
I
Rozdz ał 10. Podstawy programowan a
ROZDZIAŁ 11.
Zarządzanie pamięcią
Ja v a o fe r u je a u to m a ty c z n e z a r z ą d z a n ie p a m ię c ią z a p o m o c ą ta k z w a n e g o m e c h a n iz m u u su w a n ia nieużytków (an g . ga rb a ge collection, G C ). P o d s ta w o w e z a d a n ia m e c h a n iz m u to a lo k a c ja p a m ię c i, o b s łu g a w s k a z a n y c h o b ie k tó w w p a m ię c i o ra z o d z y s k iw a n ie p a m ię c i z o b ie k tó w , d o k tó r y c h n ie is tn ie ją ju ż ż a d n e o d n ie s ie n ia .
Rodzaje m echanizm ów usuw ania nieużytków P o c z ą w s z y o d w y d a n ia J2 S E 5 .0 , w ir t u a ln a m a s z y n a Ja v y p r z e p r o w a d z a a u to m a ty c z n e d o stra ja n ie k o n fig u ra c ji. T e n p ro c e s o b e jm u je ró w n ie ż p rz e p ro w a d z a n ą p o d c z a s u r u c h a m ia n ia a p lik a c ji p r ó b ę d o p a s o w a n ia n a jle p sz y ch u s ta w ie ń d la m e c h a n iz m u u su w a n ia n ie u ż y tk ó w n a p o d sta w ie in fo r m a c ji p la tfo rm y , a ta k ż e n ie u s ta n n e d o s tr a ja n ie m e c h a n iz m u G C . W p ra w d z ie u s ta w ie n ia p o c z ą tk o w e m e c h a n iz m u u s u w a n ia n ie u ż y tk ó w są, o g ó ln ie r z e c z b io r ą c , w y s ta r c z a ją c e , a le je d n a k z d a r z a ją s ię s y tu a c je , g d y trz e b a je z m ie n ić n a p o d s ta w ie w y m ie n io n y c h p o n iż e j c eló w : M a k sy m a ln y okres p rz erw y
O z n a c z a m a k s y m a ln ą ilo ś ć c z a su , n a k tó ry m e c h a n iz m G C w s trz y m a d z ia ła n ie a p lik a c ji, a b y p r z e p r o w a d z ić o p e r a c ję o d z y s k a n ia z a a lo k o w a n e j p rz e z n ią p a m ię c i. P rz ep u sto w o ść
O z n a c z a p ro c e n to w ą ilo ść cz a su d z ia ła n ia a p lik acji, k tó ry n ie je s t p rz e z n a c z o n y n a d z ia ła n ie m e c h a n iz m u u s u w a n ia n ie u ż y tk ó w .
115
W p o n iż sz y ch p u n k ta c h z o sta n ie p rz e d sta w io n e o g ó ln e o m ó w ie n ie p o sz cz e g ó ln y ch ro d z a jó w m e c h a n iz m ó w u s u w a n ia n ie u ż y tk ó w , ic h p rz e z n a c z e n ie i sy tu acje , w k tó ry ch p o w in n y b y ć u ż y w a n e . In fo rm a c je d o ty cz ą c e s p o so b ó w r ę c z n e g o w y b o r u m e c h a n iz m u G C z n a jd z ie s z w d a ls z e j c z ę śc i ro z d z ia łu .
Mechanizm Serial U su w a n ie n ie u ż y tk ó w je s t p rz e p ro w a d z a n e p rz e z p o je d y n c z y w ą te k w je d n y m p ro c e so rz e . P o u ru c h o m ie n iu te g o m e c h a n iz m u u su w a n ia n ie u ż y tk ó w d z ia ła n ie a p lik a cji z o sta je w s trz y m a n e aż d o ch w ili z a k o ń cz e n ia p ra c y p rze z m e c h a n iz m G C . O m a w ia n y m e c h a n iz m s p ra w d z a się n a jle p ie j w p rz y p a d k a c h , g d y a p lik a cja o p e r u je n a n ie w ie lk im z b io r z e d a n y c h o w ie lk o ś c i d o o k o ło 1 0 0 M B i n ie w y m a g a , a b y w s p o m n ia n e w c z e ś n ie j p r z e r w y w d z ia ła n iu b y ły k r ó tk ie .
Mechanizm Parallel T en m e c h a n iz m je s t n a z y w a n y ró w n ie ż m e c h a n iz m e m T h ro u g h p u t. U su w a n ie n ie u ż y tk ó w m o ż e b y ć p r z e p r o w a d z a n e p r z e z w ie le w ą tk ó w d z ia ła ją c y c h w ró ż n y c h p r o c e s o r a c h . Z a s to s o w a n ie w ię k s z e j lic z b y w ą tk ó w z n a c z ą c o z w ię k s z a s z y b k o ś ć p r a c y m e c h a n iz m u G C . O m a w ia n y m e c h a n iz m s p ra w d z a s ię n a jle p ie j w p r z y p a d k a c h , g d y n ie m a o g ra n icz e ń c z a so w y ch d o ty c z ą c y c h d łu g o ś c i p rz e r w y w d z ia ła n iu a p lik a cji, a je j w y d a jn o ś ć p o z o s ta je n a jw a ż n ie js z y m a s p e k te m p ro g ra m u .
Mechanizm Parallel Compacting T e n m e c h a n iz m je s t p o d o b n y d o p o p rz e d n ie g o z a w y ją tk ie m fa k tu , ż e ch a ra k tery z u je s ię b a rd z ie j d o p ra c o w a n y m i a lg o ry tm a m i, co s k ra c a c z a s p r z e rw y p o trz e b n e j n a p r z e p r o w a d z e n ie o p e ra c ji u s u w a n ia n ie u ż y tk ó w . O m a w ia n y m e c h a n iz m sp ra w d z a się n ajle p ie j w p rz y p a d k a c h , g d y w a p lik a cji is tn ie ją o g r a n ic z e n ia c z a su d o z w o lo n e j p r z e r w y w d z ia ła n iu a p lik a c ji.
O m aw iany m echanizm GC jest dostępny, począw szy od w yda nia J2SE 5.0 U pdate 6.
116
|
Rozdz ał 11. Zarządzan e pam ęcą
Mechanizm CMS M e ch a n iz m C M S (ang. C o n cu rren t M ark-Sw eep) je s t n a z y w a n y ró w n ież m e ch a n iz m e m o n ie w ie lk im o p ó ź n ie n iu . Im p le m e n tu je a lg o ry tm y p o z w a la ją ce n a o b s łu g ę o g r o m n y c h k o le k c ji, k tó r e m o g ły b y u z a s a d n ia ć p o w s ta w a n ie d łu g ic h p r z e r w w d z ia ła n iu a p lik a c ji. O m a w ia n y m e c h a n iz m s p r a w d z a s ię n a jle p ie j w p r z y p a d k a c h , g d y c z a s u d zie le n ia o d p o w ie d z i p rz e z a p lik a cję m a d u ż o w ię k s z e z n a c z e n ie n iż p rz e p u sto w o ś ć lu b p rz e rw a w d z ia ła n iu a p lik acji p o d cz a s p rz e p ro w a d z a n ia o p e racji u s u w a n ia n ie u ż y tk ó w .
Mechanizm G1 T e n m e c h a n iz m je s t n a z y w a n y ró w n ie ż G a r b a g e -F ir s t i s to s o w a n y w w ie lo p ro c e s o ro w y c h k o m p u te ra c h w y p o s a ż o n y c h w o g r o m n e ilo ś c i p a m ię c i. S e r w e r o w y s ty l m e c h a n iz m u u s u w a n ia n ie u ż y tk ó w o z n a c z a d u ż o w ię k s z e p r a w d o p o d o b ie ń s t w o s p e łn ie n ia c e lu w p o s ta c i d łu g o ś c i c z a s u p r z e r w y i je d n o c z e ś n ie z a p e w n ia w y s o k ą p rz e p u s to w o ś ć . O p e ra c je n a c a ły m s to s ie (n a p r z y k ła d z n a c z n ik i g lo b a ln e ) są w y k o n y w a n e ró w n o le g le w ra z z w ą t k a m i a p lik a cji. T a k ie ro z w ią z a n ie c h ro n i p rz e d z a k łó c e n ia m i p ro p o rc jo n a l n ie d o w ie lk o ś c i s to s u lu b d a n y c h ro b o c z y c h .
M echanizm G1 jest dostępny, począw szy od w ydania Java SE 7 U pdate 4. Celem jego w prow adzenia jest zastąpienie m echani zm u CMS.
N arzędzia przeznaczone do za rzą d za n ia pam ięcią W p ra w d z ie o p e ra c ja d o stro je n ia s p o s o b u d z ia ła n ia m e c h a n iz m u u s u w a n ia n ie u ż y tk ó w m o ż e z a k o ń c z y ć s ię s u k c e s e m , a le tr z e b a p a m ię ta ć , ż e G C n ie d a je ż a d n y c h g w a ra n cji, a je d y n ie w s k a z u je cele. P o p ra w a u z y sk a n a n a je d n ej p la tfo r m ie n ie k o n ie c z n ie m u s i w y s tą p ić n a in n e j. N a jle p s z y m ro z w ią za n ie m je s t z n a le z ie n ie ź ró d ła p ro b le m u za p o m o c ą n a rz ęd z i p rz e z n a cz o n y ch d o za rz ą d z a n ia p a m ię cią , n a p rz y k ła d p o z w a la ją cy ch n a p ro filo w a n ie u ży cia zasobów .
Narzędz a przeznaczone do zarządzań a pam ęc ą
|
117
W ta b e li 11.1 w y m ie n io n o te g o ro d z a ju n a r z ę d z ia . P o z a H P R O F (a n g . H e a p / C P U P ro filin g Tool) w s z y s tk ie d z ia ła ją z p o z io m u w ie r s z a p o le c e ń . H P R O F
je s t w c z y ty w a n e d y n a m ic z n ie p o u ż y c iu o d p o w ie d n ie j o p c ji w w ie r s z u p o le c e ń . P o n iż s z e p o le c e n ie w y ś w ie tla p e łn ą lis tę o p c ji, k tó re m o ż n a p r z e kazać H PR O F: java -agentlib:hprof=help Tabela 1 1 .1 . O ferowane przez JD K narzędzia przeznaczone do zarządzania pamięcią
Narzędz e
Ops
jvisualvm
Na zędzie typu „wszystko w jednym” więcej info macji na jego temat znajdziesz na st onie http://visualvm java net/
jconsole
Na zędzie monito owania zgodne z JMX (ang Java Management Extensions)
jin fo
Na zędzie wyświetlające info macje konfigu acyjne
jmap
Na zędzie p zeznaczone do mapowania pamięci
jstack
Na zędzie do monito owania stosu
js t a t
Na zędzie do monito owania danych statystycznych wi tualnej maszyny Javy
jhat
Na zędzie analizy stosu
hprof
P ofilowanie użycia p oceso a danych statystycznych dotyczących stosu o az monito owania ywalizacji
jdb
Na zędzie p zeznaczone do debugowania
Rozw aż poznanie produktu O racle Java SE A dvanced, który zaw iera narzędzia Java M ission Control i Java Flight Recorder. To są narzęd zia klasy przem ysłow ej przeznaczone do diagno styki i m onitorow ania. N adają się do zastosow ania w środowi skach produkcyjnych.
Opcje w w ierszu poleceń W y m ie n io n e p o n iże j o p cje w ie rsza p o le ce ń p o w ią z a n e z m e c h a n iz m e m u s u w a n ia n ie u ż y tk ó w m o g ą b y ć p rz e k a z a n e in te rp re te ro w i Ja v y w celu w s p ó ł p ra c y z Ja v a H o tS p o t V irtu a l M a c h in e (p e łn ą listę o p cji z n a jd z ie sz n a stro n ie h ttp ://w w w .o ra cle.co m /tech n etw o rk /ja v a /ja v a se/tech /v m o p tio n s-jsp -1 4 0 1 0 2 .h tm l):
-X X :+P rintG C lub -v e rb o se :g c W y ś w ie tle n ie o g ó ln y c h in f o r m a c ji o s to s ie i m e c h a n iz m ie u s u w a n ia n ie u ż y t k ó w w tra k c ie k a ż d e g o je g o u r u c h o m ie n ia .
118
|
Rozdz ał 11. Zarządzan e pam ęc ą
-XX:+PrintCommandLineFlags -v e rsio n W y ś w ie t le n ie u s t a w ie ń s to s u , o z a s t o s o w a n y c h w a r t o ś c ia c h -XX o ra z o w e r s ji. -XX:+PrintG CD etails W y ś w ie tle n ie s z c z e g ó ło w y c h in fo r m a c ji o s to s ie i m e c h a n iz m ie u s u w a n ia n ie u ż y tk ó w w tra k c ie k a ż d e g o je g o u r u c h o m ie n ia . -XX:+PrintGCTimeStamps D o d a n ie z n a c z n ik ó w c z a su d o d a n y c h w y jś c io w y c h PrintGC lu b P rin t ^ G C D etails. -XX:+UseSerialGC W łą c z e n ie m e c h a n iz m u G C S e ria l. -XX:+UseParallelGC W łą c z e n ie m e c h a n iz m u G C P a ra lle l. -XX:+UseParallelOldGC W łą c z e n ie m e c h a n iz m u G C P a ra lle l C o m p a c tin g . W tej o p c ji Old o d n o si s ię d o fa k tu , ż e n o w e a lg o ry tm y s ą u ż y w a n e d la „ s ta re j" (a n g . old) g e n e ra cji m e c h a n iz m u G C . -XX:+UseParNewGC W łą cz e n ie m e c h a n iz m u G C P a ra lle l n o w e j g e n era cji. M o ż e b y ć u ż y w a n y w r a z z m e c h a n iz m e m C M S . -XX:+UseConcMarkSweepGC W łą c z e n ie m e c h a n iz m u G C C M S . M o ż e b y ć u ż y w a n y w r a z z m e c h a n iz m e m P a ra lle l n o w e j g e n e r a c ji. -XX:+UseG1GC W łą c z e n ie m e c h a n iz m u G C G a r b a g e -F irs t. -X X :+D isableExplicitG C W y łą c z e n ie m e to d m e c h a n iz m u G C (S y stem .g c()). -XX:ParallelG CThreads=[w ęt^i] O k r e ś le n ie lic z b y w ą t k ó w m e c h a n iz m u G C . W a r to ś ć d o m y ś ln a je s t p o w ią z a n a z lic z b ą p r o c e s o r ó w . O m a w ia n a o p c ja m a z a s t o s o w a n ie w p rz y p a d k u m e c h a n iz m ó w G C C M S i P a ra lle l. -XX:MaxGCPauseMillis=[miZźseA™ay] O p c ja w s k a z u je m e c h a n iz m o w i G C o c z e k iw a n y m a k sy m a ln y czas p rz e r w y (w y r a ż o n y w m ilis e k u n d a c h ). O m a w ia n a o p c ja m a z a s to s o w a n ie w p rz y p a d k u m e c h a n iz m u G C P a ra lle l.
Opcje w w erszu poleceń
| 119
-XX:+GCTimeRatio=[
w artość
]
O p c ja w s k a z u je m e c h a n iz m o w i G C o c z e k iw a n ą w a r to ś ć w s p ó łc z y n n ik a c z a s u d z ia ła n ia m e c h a n iz m u G C d o c z a s u d z ia ła n ia a p lik a c ji (1 / (1 + [w a rto ś ć ])) d la o k re ślo n e g o celu w y ra ż a ją ce g o p rz e p u sto w o ść. W arto ść d om yślna w y n o si 99. O znacza to, ż e aplikacja będ zie działała przez 9 9 % c z a su , n a to m ia s t d la m e c h a n iz m u G C p o z o s ta n ie 1% c z a su . O m a w ia n a o p c ja m a z a s to s o w a n ie w p rz y p a d k u m e c h a n iz m u G C P a ra lle l. -XX:+CMSIncrementalMode W łą c z e n ie try b u p r z y r o s to w e g o d la m e c h a n iz m u G C C M S . U ż y w a n a je d y n ie w k o m p u te ra c h w y p o s a ż o n y c h w je d e n lu b d w a p ro c e s o ry . -XX:+CMSIncrementalPacing W łą c z e n ie a u to m a ty c z n e g o p a k o w a n ia d la m e c h a n iz m u G C C M S . -XX:MinHeapFreeRatio=[procent] U sta w ie n ie m in im a ln e j p ro c e n to w e j w a rto ś ci w s k a z u ją c e j ilo ś ć w o ln e g o m ie js c a w z g lę d e m
c a łk o w ite j w ie lk o ś c i s to s u . W a r t o ś ć d o m y ś ln a
w y n o si 40% . -XX:MaxHeapFreeRatio=[procent] U s ta w ie n ie m a k s y m a ln e j p ro c e n to w e j w a rto ś c i w s k a z u ją c e j ilo ś ć w o l n e g o m ie js c a w z g lę d e m c a łk o w ite j w ie lk o ś c i s to s u . W a r to ś ć d o m y ś ln a w y n o si 70% . -Xm s[óajty] N a d p is u je m in im a ln ą w ie lk o ś ć s to s u w y r a ż o n ą w b a jta c h . D o m y ś ln ie to 1 / 6 4 ilo ś c i p a m ię c i fiz y c z n e j, m a k s y m a ln ie 1 G B . P o c z ą tk o w a w ie l k o ś ć s to s u w y n o s i 4 M B d la k o m p u te r ó w , k tó r e n ie z a lic z a ją s ię d o k la s y s e r w e ro w e j. -Xm x[óajty] N a d p is u je m a k sy m a ln ą w ie lk o ść stosu w y ra ż o n ą w b a jta ch . D o m y śln ie to m n ie j n iż 1/ 4 ilo ści p a m ię c i fiz y cz n e j lu b 1 G B . M a k s y m a ln a w ie lk o ść s to s u w y n o s i 6 4 M B d la k o m p u te r ó w , k tó r e n ie z a lic z a ją s ię d o k la s y s e r w e ro w e j. -Xm n[óajty] W ie lk o ś ć s to s u d la m e c h a n iz m u G C n o w e j g e n e r a c ji. -XX:OnError=[command_line_tool [
o p c je
]]
O p cja p o z w a la n a w s k a z a n ie s k ry p tó w u ż y tk o w n ik a lu b p o le ce ń w y k o n y w a n y c h p o w y s tą p ie n iu b łę d u o z n a c z e n iu k r y ty c z n y m .
120
|
Rozdz ał 11. Zarządzan e pam ęc ą
-XX+AggressiveOpts O p c ja p o w o d u je w łą cz e n ie o p ty m alizacji w y d a jn o ści, k tó re w p rz y sz ły ch w y d a n ia c h Ja v y p ra w d o p o d o b n ie b ę d ą w łą c z o n e d o m y ś ln ie .
W a rto p a m ię ta ć, ż e n ie m a g w a ra n cji stab iln o ści o p cji -XX. W s p o m n ia n e op cje n ie są częścią sp ecy fik acji ję z y k a Ja v a (ang. Java L a n gu a ge Specification). Istnieje w ię c m a łe p ra w d o p o d o b ie ń s tw o , a b y b y ły w d o k ła d n ie ta k ie j s a m e j p o s ta c i i o id e n ty c z n y m s p o s o b ie d z ia ła n ia w w ir tu a ln y c h m a s z y n a c h Ja v y firm trz e c ic h (o ile w o g ó le b ę d ą ta m d o s tę p n e ).
Zm iana w ielkości stosu w irtualnej m aszyny Javy S to s je s t o b s z a r e m w p a m ię c i p r z e c h o w u ją c y m w s z y s t k ie o b ie k ty , k tó r e z o sta ły u tw o rz o n e p rz e z u r u c h o m io n y p ro g ra m Ja v y . W ie lk o ś ć sto su n a le ż y z m ie n ić ty lk o w te d y , g d y sto s m a b y ć w ię k s z y n iż d o m y śln y . Je ż e li n a p o ty k a s z p r o b le m y z w y d a jn o ś c ią lu b o t r z y m u je s z k o m u n ik a t b łę d u PermGen (an g . P erm a n en t G en eratio n ) java.lang.OutOfMemoryError, w te d y w ie lk o ść stosu m o ż e b y ć m a ła .
Przestrzeń M etaspace P a m ię ć ro d z im a je s t u ż y w a n a d o p rz e d sta w ie n ia m e ta d a n y c h k lasy , tw o rz ą c w te n s p o s ó b p r z e s t r z e ń w p a m ię c i n a z w a n ą M e ta s p a c e . M e ta s p a c e je s t n a s tę p c ą m o d e lu PermGen. Z te g o p o w o d u w w irtu a ln e j m a s z y n ie Ja v y JD K 8 n ie sp o tk asz w ię ce j b łęd ó w PermGen OutOfMemory. JV isu a lV M z a p e w n ia m o ż liw o ść a n a liz y M e ta s p a c e , je ś li w y s tę p u je ja k ik o lw ie k w y c ie k p a m ię c i.
W spółpraca z m echanizm em GC W s p ó łp r a c ę z m e c h a n iz m e m u s u w a n ia n ie u ż y tk ó w m o ż n a p ro w a d z ić p rz e z w y r a ź n e w y w o ła n ie G C lu b te ż p rz e z n a d p is a n ie m e to d y f i n a l i z e ( ) .
Współpraca z mechan zmem GC
|
121
Wyraźne wywołanie mechanizmu GC M e ch a n iz m u su w a n ia n ie u ż y tk ó w m o ż e b y ć w y ra ź n ie w y w o ła n y z a p o m o c ą m e to d System .gc() lu b Runtime.getRuntime() .g c (). Je d n a k n a le ż y u n ik a ć w y ra ź n e g o w y w o ła n ia m e c h a n iz m u G C , p o n ie w a ż m o ż e to w y m u s ić p rz e p ro w a d zen ie p e łn e g o o d zy sk u p am ięci (g d y w y starczające b ę d z ie je d y n ie częściow e) i ty m s a m y m n ie p o t r z e b n ie z w ię k s z y ć p r z e r w ę w d z ia ła n iu a p lik a c ji. W y w o ła n ie System .gc() n ie z a w s z e b ę d z ie z re a liz o w a n e , w irtu a ln a m a sz y n a J a v y m o ż e c z a s a m i je z ig n o r o w a ć .
Metoda finalize() K a ż d y o b ie k t m a m e to d ę f i n a l i z e ( ) d z ie d z ic z o n ą p o k la s ie O b je ct. P rz e d u s u n ię c ie m o b ie k tu m e c h a n iz m G C m o ż e w y w o ła ć tę m e to d ę , c h o ć n ie m a tutaj żad n ej g w aran cji. D o m y śln a im p lem en tacja m e to d y fin a liz e ( ) n ie w y k o n u je ż a d n e g o z a d a n ia . W p ra w d z ie to n ie je s t z a le ca n e , ale m e to d ę fin a l iz e () m o ż n a n a d p is a ć : public class TempClass extends SuperClass { / / Operacje wykonywane, gdy działa mechanizm GC.
protected void fin a liz e () throws Throwable { try { /* Miejsce na implementację żądanej funkcjonalności. */
} fin a lly { // Opcjonalnie można wywołać metodę //finalize() klasy nadrzędnej. super.final iz e (); // Z klasy nadrzędnej.
} } } P o n iż s z y fra g m e n t k o d u p o w o d u je u s u n ię c ie o b ie k tu : public class MainClass { public s ta tic void main(String[] args) { TempClass t = new TempClass(); //Odniesienia do obiektu zostały usunięte. t = nu ll; // Wywołanie mechanizmu GC.
System.gc(); } }
122
|
Rozdz ał 11. Zarządzan e pam ęc ą
ROZDZIAŁ 12.
Podstawowe wejście i wyjście
Ja v a o fe ru je w ie le k las p o d sta w o w e g o w e jś cia i w y jścia , a k ilk a z n ic h b ę d z ie o m ó w io n y c h w ty m r o z d z ia le . P o d s ta w o w e k la s y m o ż n a w y k o r z y s ta ć d o p rz e p ro w a d z a n ia o p eracji o d czy tu i zap isu w p lik ach , g n iazd ach o raz kon soli. W s p o m n ia n e k la s y z a p e w n ia ją ta k ż e m o ż liw o ś ć p r a c y z p lik a m i i k a ta lo g a m i, a ta k ż e s e r ia liz a c ję d a n y c h . K la s y w e jś c ia -w y jś c ia w J a v ie z g ła s z a ją w y ją tk i (ró w n ie ż IOException), k tó re m u s z ą b y ć o b słu ż o n e . K la s y w e jś c ia -w y jś c ia w Ja v ie z a p e w n ia ją o b s łu g ę f o r m a to w a n ia d a n y c h , k o m p r e s ji i d e k o m p r e s ji s tr u m ie n i, s z y fr o w a n ia i d e s z y fr o w a n ia , a ta k ż e k o m u n ik a c ji m ię d z y w ą tk a m i z a p o m o c ą p o to k o w a n y c h s tru m ie n i. W p r o w a d z o n e w Ja v ie 1.4 n o w e A P I w e jś c ia -w y jś c ia (ta k z w a n e N IO ) ofe ru je d o d a tk o w e m o ż liw o śc i w z a k re sie w e jścia -w y jśc ia , m ię d z y in n y m i b u fo ro w a n ie , b lo k o w a n ie p lik ó w , d o p a so w a n ie d o w y ra ż e ń re g u la rn y ch , o b słu g ę s k a lo w a n e j s ie c i i z a r z ą d z a n ie b u fo r e m . N I O .2 w p r o w a d z o n o w r a z z J a v ą S E 7 i to A P I b ę d z ie p r z e d s t a w io n e w n a s tę p n y m ro z d z ia le . A P I N IO .2 ro z b u d o w u je N IO i d o sta rc z a n o w e A P I d o o b s łu g i s y s te m u p lik ó w .
Standardow e strum ienie in, out i err W Ja v ie są u ż y w a n e trz y s ta n d a r d o w e s tru m ie n ie : in, out i e rr. System .in to s ta n d a rd o w y stru m ie ń d a n y c h w e jścio w y c h , k tó ry je s t u ż y w a n y w celu p o b ran ia d a n y ch o d u ży tk o w n ik a, a n astęp n ie u ż y cia ich w p rog ram ie: byte teamName[] = new byte[200]; int size = System.in.read(teamName); System.out.write(teamName,0,size);
123
System .out to s ta n d a r d o w y s tr u m ie ń d a n y c h w y jś c io w y c h , k tó r y je s t u ż y w a n y w celu w y św ie tle n ia u ż y tk o w n ik o w i d a n y c h w y g e n e ro w a n y c h p r z e z p ro g r a m : System.out.print("Drużyna skompletowana"); S y ste m .e rr to s ta n d a r d o w y s tr u m ie ń b łę d ó w , k tó r y je s t u ż y w a n y w c e lu w y św ie tle n ia u ż y tk o w n ik o w i k o m u n ik a tó w b łę d ó w w y g e n e ro w a n y ch p rze z p ro g ra m : System.err.println("Brak wystarczającej liczby graczy"); K a ż d a z w y m ie n io n y c h m e to d m o ż e z g ło s ić w y ją te k IOException.
W prow adzona w w ydaniu Java SE 6 klasa Console zapew nia alternatyw ę dla standardow ych strum ieni podczas interakcji ze środow iskiem w iersza poleceń.
Hierarchia klas dla podstaw ow ego w ejścia i w yjścia N a ry su n k u 12.1 p o k a z a n o h ie ra rc h ię k la s d la n a jc z ę śc ie j u ż y w a n y c h stru m ie n i o d c z y tu , z a p is u , d a n y c h w e jś c io w y c h i w y jś c io w y c h . W a rto p a m ię ta ć o m o ż liw o ś c i łą c z e n ia k la s w e jś c ia -w y jś c ia , co p o z w a la n a o s ią g n ię c ie w ie lu e fe k tó w . K la s y Reader i W rite r s ą s t o s o w a n e d o o d c z y tu i z a p is u z n a k ó w (te k s tu ). Z k o le i k la s y InputStream i OutputStream s ą z w y k le u ż y w a n e p o d c z a s o d cz y tu i z a p is u d a n y c h b in a rn y c h .
O dczyt i zapis pliku Ja v a o fe ru je m o ż liw o ś ć ła tw e g o o d c z y tu i z a p is u d a n y c h w p lik a c h .
Odczyt znaków z pliku W c e lu o d c z y tu z n a k ó w z p lik u n a le ż y u ż y ć k la s y BufferedReader. Is tn ie je r ó w n ie ż m o ż liw o ś ć u ż y c ia k la s y F ile R e a d e r, a le to n ie b ę d z ie e fe k ty w n e r o z w ią z a n ie w p r z y p a d k u o g r o m n e j ilo ś c i d a n y c h . W y w o ła n ie read L in e() o d c z y tu je w ie r s z te k s tu z p lik u . P o z a k o ń c z e n iu o d c z y tu tr z e b a w y w o ła ć m e to d ę c lo s e () w e g z e m p la r z u k la s y BufferedReader:
124
|
R o zd zał 12. Podstawowe wejśce wyjśce
R y su n ek 1 2 .1 . N ajczęściej używ ane stru m ien ie odczytu, zapisu, danych wejściowych i wyjściowych
BufferedReader bReader = new BufferedReader (new FileReader("M aster.txt")); String lineContents; while ((lineContents = bReader.readLine()) != null) { ...} bReader.close(); A b y u n ik n ą ć im p lik a c ji z w ią z a n y c h z k o d o w a n ie m p lik u , w a r to r o z w a ż y ć u ż y c ie w y w o ła n ia Files.new BufferedReader(<ścieżka_dostępu>, ); d o s tę p n e g o w A P I N IO 2.0 .
Odczyt danych binarnych z pliku W celu o d cz y tu d a n y ch b in a rn y ch n a le ż y u ż y ć k la sy DatalnputStream. W y w o ła n ie m e to d y read() o d cz y tu je d a n e z e s tru m ie n ia d a n y c h w e jś cio w y c h . Je że li o d cz y ta n a m a z o sta ć je d y n ie ta b lic a b a jtó w , w ó w c z a s w a rto u ż y ć k la sy Input ^ S tre am : DatalnputStream inStream = new DatalnputStream (new FileInputStream("Team.bin") ) ; inStream.read();
Odczyt zap s pl ku
| 125
W p r z y p a d k u k o n ie c z n o ś c i o d c z y tu o g r o m n y c h ilo ś c i d a n y c h w a r to r o z w a ż y ć u ż y c ie k la s y BufferedInputStream , a b y o p e ra c ja o d c z y tu d a n y c h b y ła z n a c z n ie e fe k ty w n ie js z a : DataInputStream inStream = new DataInputStream (new BufferedInputStream(new FilelnputStream(team))); O d c z y ta n e d a n e b in a r n e m o ż n a z p o w r o t e m u m ie ś c ić w s t r u m ie n iu z a p o m o c ą m e to d o fe r o w a n y c h p rz e z k la s ę PushbackInputStream: unread (int i ) ; // Umieszczenie w strumieniu pojedynczego bajta. unread(byte[] b ); // Umieszczenie w strumieniu tablicy bajtów.
Zapis znaków w pliku W celu z a p is u z n a k ó w w p lik u n a le ż y u ż y ć k la s y P rin tW riter. P o z a k o ń c z e n iu z a p is u s tru m ie n ia d a n y c h w y jś c io w y c h trz e b a w y w o ła ć m e to d ę c lo s e () k la s y P rin tW riter: String in = "Ogromny wiersz tekstu"; PrintWriter pWriter = new PrintWriter (new FileW riter("C oachList.txt")); pW riter.println(in); pW riter.close(); Je ż e li d o z a p is a n ia w p lik u je s t n ie w ie lk a ilo ś ć te k s tu , w te d y m o ż n a u ż y ć ró w n ie ż k la s y F ile W rite r. W a rto p a m ię ta ć , ż e je ś li p lik w s k a z a n y k la s ie F ile ^ W r it e r n ie is tn ie je , to z o s ta n ie a u to m a ty c z n ie u tw o r z o n y : FileWriter fWriter = new FileW riter("CoachList.txt"); fw riter.w rite("To je s t lis t a trenerów."); fw rite r.clo se ();
Zapis danych binarnych w pliku W c e lu z a p is a n ia d a n y c h b in a r n y c h w p lik u n a le ż y u ż y ć k la s y DataOutput ^ S tream . W y w o ła n ie m e to d y w r ite In t() p o w o d u je z a p is ta b lic y licz b c a łk o w ity c h w s tru m ie n iu d a n y c h w y jś c io w y c h : File positions = new F ile("P o sitio n s.b in "); Int[] pos = {0, 1, 2, 3, 4 }; DataOutputStream outStream = new DataOutputStream (new FileOutputStream(positions)); for (int i = 0; i < pos.length; i++) outStream .writeInt(pos[i]); Je ż e li d o z a p is a n ia je s t o g r o m n a ilo ś ć d a n y c h , w te d y m o ż n a u ż y ć ró w n ie ż k la s y BufferedOutputStream: DataOutputStream outStream = new DataOutputStream (new BufferedOutputStream(positions));
126
|
Rozdz ał 12. Podstawowe wejśc e wyjśc e
O dczyt i zapis gn iazd a Ja v a o fe ru je m o ż liw o ść ła tw e g o o d cz y tu i z a p isu d a n y c h w g n ia z d a c h sys te m o w y ch .
Odczyt znaków z gniazda W celu o d cz y tu z n a k u z g n iazd a n a le ż y n a w ią z a ć z n im p o łącze n ie , a n a stę p n ie u ż y ć k la s y BufferedReader d o o d c z y tu d a n y c h : Socket socket = new S o ck et("127.0.0.1", 64783); InputStreamReader reader = new InputStreamReader (socket.getInputStream()); BufferedReader bReader = new BufferedReader(reader); String msg = bReader.readline(); W Ja v ie S E 8 w k la s ie BufferedReader z n a jd u je s ię m e to d a l in e s ( ) n a le ż ą c a d o n o w e g o A P I stru m ien i. W arto ścią z w ro tn ą w y m ien io n ej m e to d y je st Stream, k tó re g o e le m e n ty są w ie rs z a m i „ le n iw ie " w c z y ty w a n y m i z k o n te k s to w e g o BufferedReader.
Odczyt danych binarnych z gniazda W celu o d cz y tu d a n y ch b in a rn y ch n a le ż y u ż y ć k la sy DataInputStream. W y w o łan ie m e to d y read() o d czy tu je d an e z e stru m ien ia d an y ch w ejścio w y ch . T rzeb a w ty m m ie js c u w s p o m n ie ć , ż e k la sa Socket z n a jd u je s ię w p a k ie c ie ja v a .n e t: Socket socket = new S o ck et("127.0.0.1", 64783); DataInputStream inStream = new DataInputStream (socket.getInputStream()); inStream.read(); W p rz y p a d k u k o n ie c z n o ś c i o d c z y tu o g r o m n y c h ilo ś c i d a n y c h w a r to ro z w a ż y ć u ż y c ie k la s y BufferedInputStream , a b y o p e ra c ja o d c z y tu d a n y c h b y ła z n a c z n ie e fe k ty w n ie js z a : DataInputStream inStream = new DataInputStream (new BufferedInputStream(socket.getInputStream()));
Zapis znaków do gniazda W c e lu z a p is u z n a k ó w d o g n ia z d a n a le ż y n a w ią z a ć z n im p o łą c z e n ie , a n a s tę p n ie u tw o r z y ć e g z e m p la r z k la s y P rin tW riter, u ż y ć g o i p r z e p r o w a d z ić w ła ś c iw y z a p is z n a k ó w d o g n ia z d a : Socket socket = new S o ck et("127.0.0.1", 64783); PrintWriter pWriter = new PrintWriter (socket.getOutputStream()); pWriter.println("Tato! Wygraliśmy m ecz!.");
Odczyt zap s gn azda
I
127
Zapis danych binarnych do gniazda W c e lu z a p is a n ia d a n y c h b in a r n y c h n a le ż y u ż y ć k la s y DataOutputStream. W y w o ła n ie m e to d y w r ite () p o w o d u je z a p is d a n y c h w s tr u m ie n iu d a n y c h w y jś c io w y c h : byte positions[] = new byte[10]; Socket socket = new S o ck et("127.0.0.1", 64783); DataOutputStream outStream = new DataOutputStream (socket.getOutputStream()); outStream.write(positions, 0, 10); Je ż e li d o z a p is a n ia je s t o g r o m n a ilo ś ć d a n y c h , w te d y m o ż n a u ż y ć ró w n ie ż k la sy BufferedOutputStream: DataOutputStream outStream = new DataOutputStream (new BufferedOutputStream(socket.getOutputStream()));
Serializacja A b y z a p isa ć o b ie k t (i w s z y s tk ie p o w ią z a n e z n im d a n e , k tó re p ó ź n ie j trz e b a p rz y w ró c ić ) w p o sta ci tab licy b a jtó w , k la sa te g o o b ie k tu m u si im p le m e n to w a ć in terfejs S e r ia liz a b le . D a n e s k ła d o w e z a d e k la ro w a n e w ra z z m o d y fik a to re m d o s tę p u tr a n s ie n t n ie b ę d ą u m ie s z c z o n e w s e r ia liz o w a n y m o b ie k c ie . Z a c h o w a j o s tr o ż n o ś ć p o d c z a s o p e ra c ji s e r ia liz a c ji i d e s e ria liz a c ji, p o n ie w a ż z m ia n y w k lasie m o g ą m ie ć w p ły w n a p rz y w ró c e n ie o b iek tu . D o w s p o m n ia n y c h z m ia n z a lic z a m y m ię d z y in n y m i p rz e n ie sie n ie k la sy w h ie ra rc h ii klas, u s u n ię c ie p o la , z m ia n ę m o d y fik a to r a p o la n a s t a t i c lu b in n y n iż tr a n s ie n t, a ta k ż e u ż y c ie in n e j w irtu a ln e j m a s z y n y Ja v y . D o s e r ia liz a c ji i d e s e ria liz a c ji o b ie k tó w m o ż n a u ż y ć k la s ObjectOutputStream i O bjectInputStream .
Serializacja obiektu W ce lu p rz e p r o w a d z e n ia s e ria liz a c ji o b ie k tu n a le ż y u ż y ć k la s y ObjectOutput ^ S tre am : ObjectOutputStream s = new ObjectOutputStream(new FileOutputStream("p.ser")); P o n iż e j p o k a z a n o p rz y k ła d s e ria liz a c ji: ObjectOutputStream oStream = new ObjectOutputStream(new FileOutputStream("PlayerDat.ser")); oStream.writeObject(player); oStream.close();
128
|
Rozdz ał 12. Podstawowe wejśc e wyjśc e
Deserializacja obiektu W celu p rz e p ro w a d z e n ia d e se ria liz a cji o b iek tu (n a p rz y k ła d z m ia n y z w e rsji je d n o ro d n e j o b iek tu n a o b iek t) n a le ż y u ż y ć k la sy ObjectlnputStream, a n a stę p n ie o d c z y ta ć p lik i rz u to w a ć d a n e n a o d p o w ie d n i o b ie k t: ObjectlnputStream d = new ObjectInputStream(new FileInputStream ("p.ser")); P o n iż e j p o k a z a n o p rz y k ła d d e s e ria liz a c ji: ObjectlnputStream iStream = new ObjectInputStream(new FileInputStream("PlayerDat.ser") ) ; Player p = (Player) iStream.readObject();
Tw orzenie archiw um ZIP i rozpakow yw anie plików Ja v a o feru je k lasy p rze zn aczo n e d o tw o rzen ia sk o m p re so w a n y ch p lik ó w G Z IP o raz a rc h iw ó w w fo rm a cie Z IP . A rc h iw u m Z IP z a w ie ra w ie le p lik ó w , p o d czas g d y G Z IP a rc h iw iz u je ty lk o p o je d y n c z y p lik . D o u tw o r z e n ia a rc h iw u m Z IP n a le ż y u ż y ć k la s y ZipOutputStream, n a to m ia s t r o z p a k o w a n ie a rc h iw u m u m o ż liw ia k la s a ZipInputSteam: ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream("out.zip")); String[] fNames = new String[] {" f1 ", " f2 "}; for (int i = 0; i < fNames.length; i++) { ZipEntry entry = new ZipEntry(fNames[i]); File InputStream fin = new FileInputStream(fNames[i]); try { zipOut.putNextEntry(entry); for (int a = fin .re a d (); a != -1; a = fin .read ()) { zipOut.write(a); } fin .c lo s e (); zipO ut.close(); } catch (IOException ioe) { . . . } } W celu ro z p a k o w a n ia p lik u u tw ó rz eg z e m p la rz k la sy ZipInputStream, w y w o ła j je g o m e to d ę g etN extE n try (), a n a s tę p n ie w c z y ta j z a w a r to ś ć p lik u d o Output ^ S tre a m .
Tw orzene archwum Z P rozpakowywane pl ków
| 129
Kompresja i dekompresja plików GZIP W celu u tw o rz en ia sk o m p re so w a n e g o p lik u G Z IP u tw ó rz n o w y eg zem p larz k la sy GZIPOutputStream, p rz e k a ż m u n a z w ę p lik u w ra z z ro z sz e rz e n iem .gzip, a n a s tę p n ie p r z e p r o w a d ź tr a n s fe r d a n y c h z GZIPOutputStream d o F ile ln p u t ^ S tre a m . A b y z d e k o m p r e s o w a ć p lik w fo rm a c ie G Z IP , n a le ż y u tw o r z y ć e g z e m p la r z k la s y GZipInputStream, u tw o r z y ć n o w y FileOutputStream, a n a s tę p n ie w c z y ta ć d o n ie g o d a n e .
130
|
R o zd zał 12. Podstawowe wejśce wyjśce
ROZDZIAŁ 13.
Nowe API wejścia-wyjścia (NIO.2)
A P I N IO .2 z o s ta ło w p r o w a d z o n e w ra z z JD K 7. M a n a c e lu z a p e w n ie n ie je s z c z e le p s z e j o b s łu g i p lik o w y c h o p e ra c ji w e jś c ia -w y jś c ia o ra z d o s tę p u d o d o m y ś ln e g o s y s te m u p lik ó w . A P I N IO .2 je s t o b s łu g iw a n e p r z e z p a k ie ty j a v a . n i o . f i l e i j a v a . n i o . f i l e . a t t r i b u t e . W a r to w ty m m ie js c u d o d a ć , ż e d o k ła d n y o p is A P I N IO .2 m o ż n a z n a le ź ć w sp e cy fik a cji z a ty tu ło w a n e j „ JS R 203: M o re N e w I/ O A P Is fo r th e Ja v a P la tfo rm ". D o p o p u la rn y c h in te rfe jsó w z n o w e g o A P I z a lic z a m y Path, PathMatcher, F ile V is ito r i WatchService. Z ko lei d o p o p u la r n y c h k la s z n o w e g o A P I n a le ż ą Paths i F ile s .
Interfejs Path In te rfe js Path m o ż e b y ć s to s o w a n y d o p rz e p r o w a d z a n ia o p e ra c ji n a ścież k a ch d o stę p u d o p lik ó w i k atalo g ó w . O m a w ia n a klasa je s t u ak tu aln io n ą w e r s ją k la s y ja v a .i o .F i l e . P r z e d s ta w io n y p o n iż e j fr a g m e n t k o d u d e m o n s tru je , ja k m o ż n a u ży ć w y b ra n y c h m e to d in terfejsu Path i k la sy Path d o p o b ie ra n ia n ie z b ę d n y c h in fo rm a c ji: Path p = Paths.get("\\opt\\jpgTools\\README.txt"); System.out .p rin tln (p .g etP aren t()); / / \opt\jpgTools System .out.println(p.getRoot()); // \ System.out.println(p.getNameCount ( ) ) ; // 3 System.out.println(p.getName(0)); // opt System.out .println(p.getName (1 )); //jpgTools System.out .println(p.getFi leName()); //README.txt System.out .p rin tln (p .to S trin g ()); / / Pełna ścieżka dostępu.
131
K lasa Path u d o stę p n ia tak że in n e u ż y te cz n e m e to d y ; n ie k tó re z n ic h z o sta ły w y m ie n io n e w ta b e li 13.1. Tabela 1 3 .1 . W ybrane m etody klasy Path
Metoda
Op s
path.toUri()
Konwe sja ścieżki dostępu na obiekt UR
path.resolve(ścieżko dostępu)
Połączenie dwóch ścieżek dostępu
path.relativize(ścieżko dostępu)
Utwo zenie ścieżki dostępu p owadzącej z jednej lokalizacji do d ugiej
path.compareTo(ścieżko dostępu)
Po ównanie dwóch ścieżek dostępu względem siebie
Klasa Files K la sę F ile s m o ż n a w y k o rz y sta ć d o u tw o rzen ia, sp ra w d ze n ia, u su n ięcia, sk o p io w a n ia lu b p rz e n ie s ie n ia p lik u b ą d ź k a ta lo g u . W p o n iż s z y m fra g m e n c ie k o d u p rz e d s ta w io n o p e w n e n a jc z ę ś c ie j u ż y w a n e m e to d y k la s y F ile s : // Utworzenie katalogu.
Fi les.createDirectories("\\opt\\jpg"); // Utworzenie obiektów ścieżki dostępu.
Path Path Path Path
targ etl = Paths.get("\\opt\\jpg\\README1.txt"); pl = F ile s.cre a te F ile (ta rg e tl); target2 = Paths.get("\\opt\\jpg\\README2.txt"); p2 = F ile s.cre a te F ile (ta rg e t2 );
// Sprawdzenie atrybutów pliku.
System.out.println(Files.isReadabl e (p l)); System .out.println(Files.isReadable(p2)); System .out.println(Files.isExecutable(pl)); System .out.println(Files.isSym bolicLink(pl)); System .out.println(Files.isW ritable(pl)); System.out.println(Files.isHidden (p l)); System .out.println(Files.isSam eFile(pl, p2)); / / Przykład operacji usunięcia, przeniesienia i kopiowania pliku.
Files.d elete(p 2); System.out.println(Files.move(pl, p2)); System.out.println(Files.copy(p2, p l)); F ile s.d e le te(p l); Files.d elete(p 2); M e to d a move() a k ce p tu je ty p w y licz e n io w y z a w ie ra ją cy n a s tę p u ją c e elem en ty: REPLACE_EXISTING i ATOMIC_MOVE. E le m e n t REPLACE_EXISTING p o w o d u je p rz e n ie sie n ie p lik u , n a w e t je śli ju ż istn ieje. Z k o lei ATOMIC_MOVE g w aran tu je, ż e k ażd y p ro c e s m o n ito ru ją c y k a ta lo g b ę d z ie m ia ł d o stę p d o p lik u , g d y z a k o ń c z y się p rz e p r o w a d z a n a n a n im o p e ra c ja . M e to d a copy() a k ce p tu je ty p w y licz e n io w y z a w ie ra ją cy n a s tę p u ją c e elem en ty: REPLACE_EXISTING, COPY_ATTRIBUTES i NOFOLLOW_LINKS. E le m e n t REPLACE_EXISTING
132
|
Rozdz ał 13. Nowe AP wejśc a-wyjśc a (N O.2)
p o w o d u je s k o p io w a n ie p lik u , n a w e t je śli ju ż istn ieje. Z k o lei COPY_ATTRI BUTES k o p iu je atry b u ty p lik u . N a to m ia st NOFOLLOW_LINKS k o p iu je łącza, ale n ie ele m e n ty , d o k tó r y c h o n e p ro w a d z ą . M e to d y l i n e s ( ) , l i s t ( ) , w alk() i fin d () z o s ta ły d o d a n e d o k la s y F ile s i są p o w ią z a n e z A P I stru m ie n i. M e to d a lin e s ( ) p rz e p ro w a d z a „ le n iw e " w c z y ty w a n ie s tru m ie n ia w ie rs z y . Z k o le i m e to d a l i s t ( ) je s t o d p o w ie d z ia ln a za „ le n iw e " w y ś w ie tla n ie z a w a r to ś c i k a ta lo g u , n a to m ia s t w alk() p o z w a la n a re k u re n c y jn e p o ru sz a n ie s ię p o e le m e n ta c h k a ta lo g u . M e to d a fin d () „ le n i w ie " z a p e w n ia m o ż liw o ś ć w y sz u k iw a n ia p lik ó w w d rz e w ie p lik ó w w y w o d z ą c y m s ię z e w s k a z a n e g o w ę z ła p lik u .
Funkcje dodatkow e A P I N IO 2 .0 o fe ru je ta k ż e w y m ie n io n e p o n iż e j fu n k cje , k tó re w a rto p o z n a ć. P y ta n ia d o ty c z ą c e w y m ie n io n y c h tu ta j f u n k c ji p o ja w ia ją s ię r ó w n ie ż n a e g z a m in ie O ra cle C ertified P ro fessio n a l Java S E 7 P r o g ra m m e r . W y m ie n io n e fu n k c je n ie z o sta ły o m ó w io n e , p o n ie w a ż z a słu g u ją n a d o k ła d n ie js z ą p re z e n tację, n a p r z y k ła d w p o s ta c i s a m o u c z k a : • M o ż liw o ś ć m o n ito r o w a n ia k a ta lo g u z a p o m o c ą in te rfe js u W atchService. • M o ż liw o ś ć r e k u r e n c y jn e g o u z y s k a n ia d o s tę p u d o d rz e w k a ta lo g u z a p o m o c ą in te rfe js u F ile V is it o r . • M o ż liw o ś ć w y s z u k iw a n ia p lik ó w z a p o m o c ą in te rfe js u fu n k c jo n a ln e g o PathMatcher. P o n ie w a ż PathM atcher je s t in te r fe js e m fu n k c jo n a ln y m , m o ż e b y ć u ż y w a n y w r a z z w y r a ż e n ie m la m b d a . PathMatcher matcher = (Path p) -> { // Wartością zwrotnąjest boolean.
return (p.toStri ng().contains("W orld"));
Path path = FileSystems.getDefault().getPath( "\\opt\\jpg\\HelloWorld.java"); System.out.print("Dopasowanie: " + matcher.matches(path)); D a n e w y jśc io w e : $ Dopasowanie: true
Funkcje dodatkowe
| 133
134
I
Rozdz ał 13. Nowe AP wejśc a-wyjśc a (N O.2)
ROZDZIAŁ 14.
Współbieżność
W ą tk i w Ja v ie p o z w a la ją n a z n a cz n ie e fe k ty w n ie jsze u ż y c ie w ie lu p ro ce so ró w lu b w ie lu rd z e n i w p o je d y n c z y m p r o c e s o r z e . W p r z y p a d k u p o je d y n c z e g o p ro ce so ra w ą tk i z a p e w n ia ją m o ż liw o ść ró w n o le g łe g o w y k o n y w a n ia o p eracji, n a p r z y k ła d w e jś c ia -w y jś c ia i p r z e tw a r z a n ia . P r o g r a m o w a n ie w ie lo w ą tk o w e w Ja v ie je s t o b s łu g iw a n e d z ię k i fu n k c jo m o fe ro w a n y m p rz e z k la s ę Thread i in te rfe js Runnable.
Tw orzenie w ątków W ą tk i m o g ą b y ć tw o rz o n e n a d w a s p o s o b y : p rz e z ro z s z e r z e n ie k la s y ja v a . ^ la n g .T h re a d lu b p rz e z im p le m e n ta c ję in te rfe js u jav a.lan g .R u n n ab le.
Rozszerzenie klasy Thread R o z s z e rz e n ie k la s y Thread i n a d p is a n ie m e to d y run() p o w o d u je u tw o r z e n ie k la sy o b słu g u ją ce j w ą tk i. U ru c h o m ie n ie n o w e g o w ą tk u je s t b a rd z o ła tw y m z a d a n ie m : class Comet extends Thread { public void run() { System.out.println("Orbitowanie"); o rb it(); } } Comet halley = new Comet(); halley.run();
135
P a m ię ta j, ż e ty lk o je d n a s u p e rk la s a m o ż e b y ć ro z s z e rz o n a . D la te g o też k la sa r o z s z e rz a ją c a Thread n ie m o ż e r o z s z e rz a ć ju ż ż a d n y c h in n y c h s u p e rk la s .
Implementacja interfejsu Runnable Im p le m e n ta cja in terfejsu fu n k cjo n a ln e g o Runnable i z d efin io w a n ie je g o m e to d y run() ró w n ie ż p o z w a la n a u tw o r z e n ie k la s y o b s łu g u ją c e j w ą tk i. class Asteroid implements Runnable { public void run() { System.out.println("Orbitowanie"); o rb it(); } } Asteroid majaAsteroid = new Asteroid(); Thread majaThread = new Thread(majaAsteroid); majaThread.run(); P o je d y n c z y m o ż liw y d o u r u c h o m ie n ia e g z e m p la r z m o ż e b y ć p r z e k a z a n y w ie lu o b iek to m w ą tk ó w . K a ż d y w ą te k w y k o n u je to sa m o z a d a n ie , ja k p o k a z a n o w p o n iż s z y m fra g m e n c ie k o d u tu ż p o u ż y c iu w y r a ż e n ia la m b d a : Runnable asteroid = () -> { System.out.println("Orbitowanie"); o rb it(); }; Thread asteroidThreadl = new Thread(asteroid); Thread asteroidThread2 = new Thread(asteroid); asteroidThread1.run(); asteroidThread2.run();
Stany w ątku W y licz e n ie T h read .state z a w ie ra sz eść s ta n ó w w ą tk ó w , k tó re z o sta ły w y m ie n io n e w ta b e li 14.1.
Priorytety w ątku P ra w id ło w y z a k re s w a rto ści p rio ry te tu w ą tk u to z w y k le o d 1 d o 10, a w a rto ścią d o m y śln ą je s t 5. P rio ry tety w ą tk u to je d e n z a sp e k tó w Ja v y ch arak tery zu ją c y się n ajm n ie jsz ą p rzen o śn o ścią, p o n ie w a ż zak res i w a rto ść d o m y śln a m o g ą się ró żn ić w p o sz cz e g ó ln y ch w irtu aln y ch m a sz y n a ch Jav y . W arto ści p rio ry te tó w m o ż n a p o b r a ć z a p o m o c ą MIN_PRIORITY, NORM_PRIORITY i MAX_PRIORITY.
136
|
Rozdz ał 14. Współb eżność
Tabela 14.1. Stany wątku Stan wątku
Ops
NEW
Wątek któ y został utwo zony ale jeszcze nie jest u uchomiony
RUNNABLE
Wątek któ y jest gotowy do u uchomienia
BLOCKED
„Żywy” wątek któ y jest zablokowany i oczekuje na blokadę monito a
WAITING
„Żywy” wątek któ y wywołuje własną metodę w ait() lub jo in () w t akcie oczekiwania na inny wątek
TIMED_WAITING
„Żywy” wątek któ y oczekuje na inny wątek p zez ok eślony czas Wątek uśpiony
TERMINATED
Wątek któ y zakończył działanie
System.out.print(Thread.MAX PRIORITY); W ą tk i o n iż s z y m p rio r y te c ie o fe ru ją m n ie js z ą w y d a jn o ś ć n iż w ą tk i o w y ż s z y m p rio ry te c ie .
Najczęściej używ ane metody dotyczące w ątków W ta b e li 1 4.2 w y m ie n io n o n a jc z ę ś c ie j u ż y w a n e m e to d y d o ty c z ą c e w ą tk ó w i p o c h o d z ą c e z k la s y Thread. Tabela 1 4 .2 . N ajczęściej używ ane m etody klasy Thread dotyczące wątków
Metoda
Op s
getPriority()
Wa tością zw otną metody jest p io ytet wątku
getState()
Wa tością zw otną metody jest stan wątku
interrupt()
P ze wanie p acy wątku
isAl ive()
Wa tością zw otną metody jest stan „życia” wątku
isInterrupted()
Metoda sp awdza czy nastąpiło p ze wanie p acy wątku
jo in ()
Wątek wywołujący tę metodę musi poczekać na zakończenie działania p zez wątek któ yjest ep ezentowany p zez dany obiekt
setP rio rity (in t)
Ustawienie p io ytetu wątku
sta rt()
Umieszczenie wątku w stanie gotowości do u uchomienia
W ta b e li 1 4.3 w y m ie n io n o n a jc z ę ś c ie j u ż y w a n e m e to d y d o ty c z ą c e w ą tk ó w i p o c h o d z ą c e z k la s y O b ject.
Najczęśc ej używane metody dotyczące wątków
|
137
Tabela 14.3. Najczęściej używane metody klasy Object dotyczące wątków Metoda
Op s
notify()
Metoda nakazuje obudzenie wątku ijego u uchomienie
noti fyAl l ( )
Metoda nakazuje obudzenie wszystkich wątków oczekujących na inne wątki lub zasoby następnie algo ytm sze egowania wybie ze jeden wątek i u uchomi go
wait()
Wst zymanie wątku w stanie oczekiwania aż do chwili gdy inny wątek wywoła metodę notify() lub notifyAl l()
W yw ołanie m etody wait() lub n o tify () spow odu je zgłoszen ie w yjątku InterruptedException, jeśli w yw ołanie m etody nastąpi w zględem w ątku, który m a ustaw ioną w artość true dla opcji w skazującej na przerw anie jego pracy. W tab e li 14.4 w y m ie n io n o n a jcz ę ściej u ż y w a n e m e to d y s ta ty cz n e k la sy Thread d o ty c z ą c e w ą tk ó w , n a p rz y k ła d T h re a d .sle ep (1 0 0 0 ). Tabela 1 4 .4 . M eto dy statyczne dotyczące wątków
Metoda
Op s
activeCount()
Wa tością zw otną metody jest liczba wątków znajdujących się w bieżącej g upie wątków
currentThread()
Metoda zw aca odniesienie do aktualnie działającego wątku
interrupted()
Metoda sp awdza czy nastąpiło p ze wanie aktualnie działającego wątku
sleep(Zong)
Zablokowanie na podaną w pa amet ze liczbę milisekund aktualnie działającego wątku
yield()
Wst zymanie aktualnego wątku aby pozwolić innym wątkom na działanie
Synchronizacja S ło w o k lu cz o w e synchronize je s t p rz e z n a cz o n e d o n a k ła d a n ia b lo k a d n a b lo k i i m e to d y . B lo k a d a p o w in n a z o sta ć n a ło ż o n a n a b lo k k o d u lu b m e to d ę , k tó ra p ró b u je u z y sk a ć d o stę p d o z a so b u w sp ó łd z ielo n e g o o zn a cz e n iu k ry ty czn y m . T e g o ro d z a ju b lo k a d a m o n ito ra je s t d e fin io w a n a w n a w ia s ie k la m r o w y m . P on iżej p rze d staw io n o kilka p rzy k ład ó w sy n ch ro n izo w an y ch b lo k ó w i m eto d . E g z e m p la rz o b ie k tu t w r a z z s y n c h r o n iz o w a n ą b lo k a d ą : synchronized (t) { / / Polecenia bloku.
} E g z e m p la rz o b ie k tu t h i s w r a z z s y n c h r o n iz o w a n ą b lo k a d ą :
138
|
Rozdz ał 14. Współb eżność
synchronized (this) { / / Polecenia bloku.
} M e to d a r a i s e ( ) w r a z z s y n c h ro n iz o w a n ą b lo k a d ą : //Pierwszy segment kodu. synchronized void raise() { // Polecenia metody.
} // Drugi segment kodu.
void raise() { synchronized (this) { // Polecenia metody.
} } M e to d a s ta ty c z n a c a li b r a t e ( ) w ra z z s y n c h ro n iz o w a n ą b lo k a d ą : class Telescope { synchronized s ta tic void calib rate() { // Polecenia metody.
} } Inna nazw a blokad y to monitor lub m utex (ang. m utually exclu sive lock).
N a rz ę d z ia w s p ó łb ie ż n o ś c i to k o le jn y s p o s ó b n a s to s o w a n ie w s p ó łb ie ż n o ś c i i z a r z ą d z a n ie n ią .
N arzędzia w spółbieżności W Ja v ie S E 5.0 w p r o w a d z o n o k la s ę n a r z ę d z io w ą p rz e z n a c z o n ą d o p ro g ra m o w a n ia w s p ó łb ie ż n e g o . W s p o m n ia n e n a r z ę d z ia z n a jd u ją s ię w p a k ie c ie ja v a .u t il.c o n c u r r e n t i o b e jm u ją w y k o n a w c ó w , w s p ó łb ie ż n e k o le k c je , s y n c h ro n iz a to ry i n a r z ę d z ia p r z e z n a c z o n e d o o d m ie r z a n ia c z a su .
Wykonawcy K lasa ThreadPoolExecutor o raz je j p o d k la sa ScheduledThreadPoolExecutor im p le m e n tu ją in te r fe js Execu tor z a p e w n ia ją c y k o n fig u r o w a n ą i e la s ty c z n ą p u lę w ą tk ó w . W s p o m n ia n a p u la w ą tk ó w p o z w a la k o m p o n e n to m serw e ra n a w y k o rz y sta n ie z a le t w y n ik a ją c y c h z m o ż liw o śc i w ie lo k ro tn e g o u ż y cia w ą tk ó w .
Narzędz a współbeżnośc
| 139
K la sa Executors d o sta rc z a m e to d y fa b ry c z n e (tw o rz ą c e o b ie k ty ) o ra z n a rz ę d z io w e . S p o ś r ó d n ic h w y m ie n io n e p o n iż e j s ą p r z e z n a c z o n e d o tw o rz e n ia p u l w ą tk ó w : newCachedThreadPool() U tw o r z e n ie n ie o g ra n ic z o n e j p u li w ą tk ó w , k tó ra a u to m a ty c z n ie w ie lo k r o tn ie u ż y w a w ą tk ó w . new FixedThreadPool(int n T h rea d s) U tw o r z e n ie p u li w ą tk ó w o s ta łe j w ie lk o ś c i, k tó ra a u to m a ty c z n ie w ie lo k ro tn ie u ż y w a w ą tk ó w z e w s p ó łd z ie lo n e j, n ie o g ra n ic z o n e j k o le jk i. newScheduledThreadPool(int c o re P o o lS iz e ) U tw o r z e n ie p u li w ą tk ó w , d la k tó re j z d e fin io w a n o p o le c e n ia w y k o n y w a n e o k r e s o w o lu b p o u p ły w ie o k r e ś lo n e g o c z a su . new SingleThreadExecutor() U tw o r z e n ie w y k o n a w c y d z ia ła ją c e g o w p o je d y n c z y m w ą tk u i o p e ru ją c e g o n a n ie o g ra n ic z o n e j k o le jc e . newSingleThreadScheduledExecutor() U tw o rz e n ie w y k o n a w c y d z ia ła ją c e g o w p o je d y n c z y m w ą tk u i p o s ia d a ją c e g o z d e fin io w a n e p o le c e n ia w y k o n y w a n e o k r e s o w o lu b p o u p ły w ie o k r e ś lo n e g o c z a su . P o n iże j p rz e d sta w io n o fra g m e n t k o d u d e m o n stru ją cy u ż y cie m e to d y newFixed ^ThreadPool (): import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; public class ThreadPoolExample { public s ta tic void main() { // Utworzenie zadań // (klasa RTask implementuje interfejs Runnable).
RTask t1 = new RTask("thread1"); RTask t2 = new RTask("thread2"); // Utworzenie menedżera wątków.
ExecutorService threadExecutor = Executors.newFixedThreadPool(2); / / Przygotowanie wątków do uruchomienia.
threadExecutor.execute(t1); threadExecutor.execute(t2); / / Zamknięcie wątków.
threadExecutor.shutdown(); } }
140
|
Rozdz ał 14. Współb eżność
Współbieżne kolekcje N a w e t je ś li ty p k o le k cji m o ż e b y ć sy n c h ro n iz o w a n y , n a jle p sz y m ro z w ią z a n ie m je s t u ż y c ie k la s w s p ó łb ie ż n o ś c i z a p e w n ia ją c y c h b e z p ie c z e ń s tw o w ą t k ó w i o fe ru ją cy ch ta k ą sa m ą fu n k cjo n aln o ść, ja k z w y k łe k lasy . W sp o m n ia n e k lasy k o lek cji i ich o d p o w ie d n ik i w sp ó łb ie ż n o ści w y m ie n io n o w tab eli 14.5. Tabela 1 4 .5 . Klasy kolekcji i ich odpow iedniki zapewniające bezpieczeństw o wątków
Klasa kolekcj
Odpow edn k zapewn ający bezp eczeństwo wątków
HashMap
ConcurrentHashMap
TreeMap
ConcurrentSkipListMap
TreeSet
ConcurrentSkipListSet
podtypy Map
ConcurrentMap
podtypy List
CopyOnWriteArrayLi st
podtypy Set
CopyOnWriteArraySet
PriorityQueue
PriorityBlockingQueue
Deque
BlockingDeque
Queue
BlockingQueue
Synchronizatory S y n c h r o n iz a t o r y to s p e c ja ln e g o p r z e z n a c z e n ia n a r z ę d z ia s y n c h r o n iz a c ji. D o s tę p n e s y n c h r o n iz a to r y z o s ta ły w y m ie n io n e w ta b e li 14.6. Tabela 1 4 .6 . Synchronizatory
Synchron zator
Ops
Semaphore
Obsługuje zestaw zezwoleń
CountDownLatch
mplementuje oczekiwanie aż do zakończenia wykonywania zestawu ope acji
CyclicBarrer
mplementuje oczekiwanie aż do usunięcia najczęściej występujących ba ie
Exchanger
mplementuje punkt synch onizacji w któ ym wątki mogą wymieniać elementy
Narzędzia odmierzania czasu W y licz e n ie TimeUnit je s t n ajczę ściej sto so w a n e d o in fo rm o w a n ia m e to d o p ar ty ch n a o d m ie rz a n iu czasu , ja k p o w in ie n b y ć o b licz o n y d an y p a ra m e tr z w ią z a n y z c z a s e m . P r z y k ła d p r z e d s ta w io n o w p o n iż s z y m fr a g m e n c ie k o d u . D o s tę p n e s ta łe w y lic z e n ia TimeUnit z o s ta ły w y m ie n io n e w ta b e li 14.7.
Narzędz a współbeżnośc
|
141
// tryLock (czas podanyjako typ long ijednostka TimeUnit). i f (lock.tryLock(15L, TimeUnit.DAYS)) { . . . } //15 dni. Tabela 1 4 .7 . Stałe wyliczenia T im eU nit
Stała
Def n cja jednostk
Jednostka (s)
NANOSECONDS
1/1000 ps
000000001
ns
MICROSECONDS
1/1000 ms
000001
Us
MILLISECONDS
1/1000 s
001
ms
SECONDS
s
1
sec
MINUTES
60 s
60
min
HOURS
60 min
3600
h
DAYS
24 godziny
86400
d
142
|
Rozdz ał 14. Współb eżność
Skrót
ROZDZIAŁ 15.
Framework Collections
F r a m e w o r k C o lle c tio n s w Ja v ie z o s ta ł z a p r o je k to w a n y w c e lu z a p e w n ie n ia o b s łu g i w h ie r a r c h ic z n y s p o s ó b w ie lu k o le k c ji. T a k n a p r a w d ę s k ła d a s ię z in te rfe js ó w , im p le m e n ta c ji i a lg o ry tm ó w .
Interfejs Collection Kolekcje to o b iek ty , k tó re g ru p u ją w ie le e lem e n tó w , p rz e c h o w u ją je , p o b ie ra ją
i o p e ru ją n a n ic h . In te rfe js C o lle c tio n m o ż n a o k r e ś lić m ia n e m k o r z e n ia h ie ra r c h ii k o le k c ji. P o d in te rfe js y C o lle c tio n to m ię d z y in n y m i L is t, Queue i S et. W ta b e li 15.1 w y m ie n io n o in te rfe js y , p o d a n o in fo r m a c je o ic h u p o r z ą d k o w a n iu o ra z o b s łu d z e d u p lik a tó w . In te rfe js Map ró w n ie ż z n a la z ł s ię w ta b e li, p o n ie w a ż n a le ż y d o o m a w ia n e g o fra m e w o r k a . Tabela 1 5 .1 . N ajczęściej używ ane kolekcje
nterfejs
Uporządkowany
Obsługa dupl katów
Li st
Tak
Tak
Dostęp pozycyjny kont ola wstawiania elementów
Map
Może być
Nie
Unikatowe klucze maksymalnie mapowanie jednej wa tości dla każdego klucza
Queue
Tak
Tak
P zechowuje elementy zwykle działa jako F FO
Set
Może być
Nie
Unikatowość ma znaczenie
Uwag
1 Pierwszy na wejściu, pierwszy na wyjściu — przyp. tłum.
143
Implementacje W tab eli 15.2 w y m ien io n o n ajczęściej u ż y w a n e im p le m e n tacje ty p ó w kolekcji, ich in te rfe jsy , p o d a n o in fo rm a c je o u p o rz ą d k o w a n iu , so rto w a n iu i o b słu d z e d u p lik a tó w . Tabela 1 5 .2 . N ajczęściej spotykane im plem entacje typów kolekcji
nterfejs
Uporząd kowań e
Sortowan e
Dupl katy
Uwag
ArrayList
List
ndeks
Nie
Tak
Szybka tablica o zmiennej wielkości
LinkedList
List
ndeks
Nie
Tak
Podwójnie połączona lista
Vector
List
ndeks
Nie
Tak
Spuścizna synch onizowany
HashMap
Map
Nie
Nie
Nie
Pa y klucz wa tość
Hashtable
Map
Nie
Nie
Nie
Spuścizna synch onizowany
Li nkedHashMap
Map
Wstawianie ostatni dostęp
Nie
Nie
Połączona lista tabela hash
TreeMap
Map
Z ównoważony
Tak
Nie
Mapa d zewa cze wono cza nego2
PriorityQueue
Queue
P io ytet
Tak
Tak
mplementacja stosu
HashSet
Set
Nie
Nie
Nie
Zbió o szybkim dostępie
Li nkedHashSet
Set
Wstawianie
Nie
Nie
Połączona lista zbió hash
TreeSet
Set
So towanie
Tak
Nie
Zbió d zewa cze wono cza nego
mplementacja
M etody fram ew orka Collection P o d in te rfe js y in te rfe js u C o lle c tio n o fe ru ją w ie le c e n n y c h s y g n a tu r m e to d , k tó r e w y m ie n io n o w ta b e li 15.3.
2 Więcej informacji znajdziesz na stronie http://pl.wikipedia.org/wiki/Drzewo_czerwono-czarne — przyp. tłum.
144
|
R o zd zał 15. Framework Collect ons
Tabela 15.3. Cenne metody podinterfejsu L sta parametrów
Zbór parametrów
Mapa parametrów
Wartość zwrotna
add()
indeks element
element
n/d
boolean
contains()
obiekt
obiekt
n/d
boolean
cotainsKey()
n/d
n/d
klucz
boolean
containsValue()
n/d
n/d
wa tość
boolean
get()
indeks
n/d
klucz
Object
indexOf()
obiekt
n/d
n/d
int
iterator()
b ak
b ak
n/d
Iterator
Metoda
keySet()
n/d
n/d
b ak
Set
put()
n/d
n/d
klucz wa tość
void
remove()
indeks lub obiekt
obiekt
klucz
void
size()
b ak
b ak
b ak
int
W a rto ścią z w ro tn ą C o llection .stream () je s t se k w e n c y jn y Stream w ra z z e źró d łe m w p o s ta c i k o n te k s tu k o le k c ji. Z k o le i w a r to ś c ią z w r o tn ą C o lle c tio n . ^ p a r a lle lS tr e a m O je s t r ó w n o le g ły Stream w ra z z e ź ró d łe m w p o s ta c i k o n te k s tu k o le k c ji.
A lgorytm y klasy Collections K la sa C o lle c tio n s , k tó re j n ie n a le ż y m y lić z in te rfe js e m C o lle c tio n , z a w ie ra w ie le c e n n y c h m e to d s ta ty c z n y c h , n a p rz y k ła d a lg o ry tm ó w . W s p o m n ia n e m e to d y m o g ą b y ć w y w o ły w a n e w z g lę d e m w ie lu ró ż n y c h ty p ó w k o le k c ji. W tab e li 15.4 w y m ie n io n o n a jc z ę śc ie j u ż y w a n e m e to d y k la sy C o llectio n s, ich p a r a m e tr y i w a rto ś c i z w ro tn e . W r o z d z ia le 16. z n a jd z ie s z w ię c e j in fo rm a c ji n a te m a t ty p o w a n y c h p a r a m e tró w , n a p r z y k ła d .
Efektyw ność algorytm u A lg o r y tm y i s tr u k tu r y d a n y c h s ą z o p ty m a liz o w a n e p o d r ó ż n y m i w z g lę d am i — n ie k tó re w celu efek ty w n e g o u zy sk iw an ia d o stę p u d o lo so w o w y b ra n y c h e le m e n tó w lu b ic h w s ta w ia n ia b ą d ź u s u w a n ia , z k o le i in n e w ce lu z a c h o w a n ia u p o r z ą d k o w a n y c h e le m e n tó w . W z a le ż n o ś c i o d p o tr z e b m o ż e w y s tę p o w a ć k o n ie c z n o ś ć z m ia n y a lg o r y tm ó w lu b s tr u k tu r d a n y c h .
Efektywność algorytmu
| 145
Tabela 15.4. A lgorytm y klasy Collections Metoda
Parametry
Wartość zwrotna
addAll()
Collection , T ...
boolean
max()
Collection [Comparator]
min()
Collection [Comparator]
d isjoi nt ()
Collection Collection
boolean
frequency()
Collection Object
int
asLifoQueue()
Deque
Queue
reverse()
List
void
shuffl e()
List
void
copy()
List cel List źródło
void
rotate()
List int wartość
void
swap()
List int położenie int położenie
void
binarySearch()
List Object
int
f i l l ()
List Object
void
sort()
List Object [Comparator]
void
repl aceAll ()
List Object staraWartość Object nowaWartość
boolean
newSetFromMap
Map
Set
N a jc z ę ś c ie j u ż y w a n e a lg o r y tm y k o le k c ji, ic h ty p y i ś r e d n ią e fe k ty w n o ś ć w y m ie n io n o w ta b e li 15.5. N o ta c ja d u ż e O je s t u ż y w a n a d o w s k a z a n ia e fe k ty w n o ś c i c z a su , p o d c z a s g d y n o z n a c z a lis tę e le m e n tó w (p a trz ta b e la 1 5.6).
Interfejs funkcjonalny Com parator W w ie lu m e to d a c h k la s y C o lle c tio n s p r z y ję to z a ło ż e n ie , ż e o b ie k ty k o le k c ji m o g ą b y ć p o ró w n y w a n e . Je ż e li n ie m a n a tu ra ln e j k o le jn o ś c i, w te d y k la s a p o m o c n ic z a m o ż e im p le m e n t o w a ć in te r f e js f u n k c jo n a ln y Comparator, co p o z w a la n a w s k a z a n ie s p o s o b u u p o r z ą d k o w a n ia o b ie k tó w : public class Crayon { private String color; public Crayon(String color) { th is.co lo r = color; } public String getColor() { return color; }
146
|
R o zd zał 15. Framework Collect ons
Tabela 15.5. Efektywność algorytmu Algorytmy
Konkretny typ
Czas
get set
ArrayList
0 (1)
add remove
ArrayList
0 (n)
contains indexof
ArrayList
0 (n)
get put remove containsKey
HashMap
0 (1)
add remove contains
HashSet
0 (1)
add remove contains
LinkedHashSet
0 (1)
get set add remove (z dowolnej st ony)
LinkedList
0 (1)
get set add remove (z indeksu)
LinkedList
0 (n)
contains indexOf
LinkedList
0 (n)
peek
Priori tyQueue
0 (1)
add remove
Priori tyQueue
0 (log n)
remove get put containsKey
TreeMap
0 (log n)
add remove contains
TreeSet
0 (log n)
Tabela 1 5 .6 . Notacja d u że O
Notacja
Op s
0 (1)
Czas jest stały niezależnie od liczby elementów
0 (n)
Czas jest liniowy względem liczby elementów
0 (log n)
Czas jest loga ytmiczny względem liczby elementów
0 (n log n )
Czas jest liniowy i loga ytmiczny względem liczby elementów
public void setColor(String color) { th is.co lo r = color; } public String toString() { return th is.co lo r; } } import java.util.Comparator; public class CrayonSort implements Comparator { @Override public int compare (Crayon c1, Crayon c2) { return c1.getColor().compareTo(c2.getColor()); } } import jav a.u til.A rrayL ist; import jav a.u til.C o lle ctio n s; public class CrayonApp {
nterfejs funkcjonalny Comparator
| 147
public s ta tic void main(String[] args) { Crayon crayonl = new Crayon("żółty"); Crayon crayon2 = new Crayon("zielony"); Crayon crayon3 = new Crayon("czerwony"); Crayon crayon4 = new Crayon("niebieski"); Crayon crayon5 = new Crayon("fioletowy"); ArrayList cList = new ArrayList <>(); cList.add(crayonl); cList.add(crayon2); cList.add(crayon3); cList.add(crayon4); cList.add(crayon5); System.out.println("Nieposortowane: " + cList ) ; CrayonSort cSort = new CrayonSort(); // Here C o llection s.so rt(cL ist, cSort); System.out.println("Posortowane: " + cList ) ; } } D a n e w y jśc io w e : $ Nieposortowane: [żółty, zielony, czerwony, niebieski, fioletowy] $ Posortowane: [czerwony, fioletowy, niebieski, zielony, żółty] K la sa CrayonSet im p le m e n tu je in te rfe js Comparator, k tó ry z o s ta ł u ż y ty p rz e z e g z e m p la r z c S o r t. O p c jo n a ln ie , m o ż n a u t w o r z y ć a n o n im o w ą k la s ę w e w n ę trz n ą , ab y u n ik n ą ć w ten sp o só b k o n ie cz n o ści tw o rz e n ia o d d zieln ej k lasy CrayonSort: Comparator cSort = new Comparator () { public int compare(Crayon c l, Crayon c2) { return c1.getColor().compareTo(c2.getColor()); } }; P o n ie w a ż Comparator je s t in te r fe js e m fu n k c jo n a ln y m , to u ż y c ie w y r a ż e n ia la m b d a m o ż e z w ię k s z y ć c z y te ln o ś ć k o d u : Comparator cSort = (Crayon c l , Crayon c2) -> c1.getColor().compareTo(c2.getColor()); N a z w y k la s n ie m u s z ą b y ć w y r a ź n ie w y m ie n io n e n a liś c ie a rg u m e n tó w , p o n ie w a ż w y r a ż e n ie la m b d a z n a ty p y c e ló w . Z w r ó ć w ię c u w a g ę n a z a p is ( c l , c2) k o n tra (Crayon c l , Crayon c2 ): // Przykład 1.
Comparator cSort = (c l, c2) -> cl.getColor().compareTo(c2.getColor()) ; C o llection s.so rt(cL ist, cSort); // Przykład 2.
C o llection s.so rt(cL ist, (c l, c2) -> cl.getColor().com pareTo(c2.getColor()));
148
|
R o zd zał 15. Framework Collectons
ROZDZIAŁ 16.
Framework Generics
F r a m e w o rk G e n e ric s, w p r o w a d z o n y w Ja v ie S E 5 .0 i u a k tu a ln io n y w w y d a n ia c h Ja v a S E 7 i 8, z a p e w n ia o b s łu g ę p a r a m e tr y z a c ji ty p ó w . Z a le tą sto so w a n ia ty p ó w g e n ery cz n y ch je s t z n a c z n e z m n ie jsz e n ie ilo ści k o d u , k tó r y tr z e b a u tw o r z y ć p o d c z a s o p r a c o w y w a n ia b ib lio te k i. K o le jn ą z a le tą je s t m o ż liw o ś ć e lim in a c ji rz u to w a n ia w w ie lu p rz y p a d k a c h . K la sy fr a m e w o r k a C o lle c tio n s , k la s a C lass o ra z in n e b ib lio te k i Ja v y z o s ta ły u a k tu a ln io n e i p r z y s to s o w a n e d o u ż y c ia ty p ó w g e n e r y c z n y c h . W k s ią ż c e Ja v a G e n e r ic s a n d C o lle c tio n s ( h t t p ://s h o p .o r e i ll y .c o m / p r o d u c t / 9 7 8 0 5 9 6 5 2 7 7 5 4 . d o ) n a p is a n e j p rz e z M a u r ic e 'a N a fta lin a i P h ilip a W a d le ra
(O 'R e illy , 2 0 0 6 ) z n a jd z ie s z s z c z e g ó ło w e o m ó w ie n ie fr a m e w o r k a G e n e r ic s .
Klasy i interfejsy fram ew orka Generics K la sy i in te rfe js y fra m e w o r k a G e n e r ic s p a r a m e tr y z u ją ty p p rz e z d o d a n ie ty p u p a r a m e tr u w n a w ia s ie o s tr y m , n a p r z y k ła d . W s k a z a n y ty p je s t u s ta n a w ia n y w m ie js c u n a w ia s u . P o u s ta n o w ie n iu ty p u p a ra m e tru b ę d z ie o n s to s o w a n y w m e to d a c h k la s y , k tó re m a ją p o d a n y te n s a m ty p . W p r z e d s ta w io n y m p o n iż e j fra g m e n c ie k o d u m e to d y ad d () i g e t ( ) u ż y w a ją ty p u p a r a m e tr y z o w a n e g o ja k o o d p o w ie d n io a rg u m e n tu i w a r to ś c i z w ro tn e j: public interface List extends Collection{ public boolean add(E e); E get(int index); }
149
P o zad ek laro w an iu z m ie n n ej o ty p ie p aram e try zo w an y m k o n k re tn y ty p (na p rz y k ła d ) b ę d z ie u ż y ty w m ie jscu ty p u p aram e tru (na p rz y k ła d ). E fe k te m je s t m o ż liw o ś ć e lim in a cji rz u to w a n ia p o d c z a s p o b ie ra n ia e le m e n tó w z k o le k c ji: / / Kolekcja List/ArrayList wraz z typem generycznym.
List iL ist = new ArrayList(); iList.add(1000); // Wyraźne rzutowanie jest zbędne.
Integer i = iL is t.g e t(0 ); / / Kolekcja List/ArrayList bez typu generycznego.
List iL ist = new ArrayList(); iList.add(1000); // Wyraźne rzutowanie jest konieczne.
Integer i = (In te g e r)iL ist.g e t(0 ); O p e r a to r <> z o s ta ł w p r o w a d z o n y w Ja v ie S E 7 w c e lu u p r o s z c z e n ia tw o r z e n ia ty p ó w g e n e r y c z n y c h p r z e z e lim in a c ję k o n ie c z n o ś c i d o d a tk o w e g o p o d a w a n ia ty p u : / / Bez użycia operatora <>.
List iLi st1 = new ArrayList(); //Z użyciem operatora <>. List iLi st2 = new ArrayList<>();
Konstruktory w ykorzystujące fram ew ork Generics K o n stru k to ry klas fram ew o rk a G en erics n ie w y m a g a ją a rg u m en tó w w p ostaci p a ra m e tró w o ty p a c h g e n e r y c z n y c h : //Klasa frameworka Generics. public class SpecialList { //Konstruktor bez argumentów. public SpecialList() { . . . } public SpecialList(String s) { . . . } } O b ie k t ty p u g e n e r y c z n e g o te g o ro d z a ju k la sy b ę d z ie u tw o r z o n y w p o n iż szy s p o s ó b : SpecialList b = new SpecialList(); J e ż e li k o n s tr u k t o r w k la s ie fr a m e w o r k a G e n e r ic s z a w ie r a ty p p a r a m e t r u , n a p r z y k ła d S trin g , w te d y o b ie k t ty p u g e n e r y c z n e g o m o ż n a u tw o r z y ć n a s tę p u ją c o : SpecialList b = new SpecialList("Anna Maria");
150
|
R o zd zał 16. Framework Generes
Zasada zastępowania Jak wspomniano w książce Java Generics and Collections (O'Reilly, 2006), zasada zastępomvania pozwala na użycie pod typów, gdy ich typy nadrzędne są parametryzowane: • Zmiennej danego typu może być przypisana wartość dowolnego podtypu danego typu. • Metoda wraz z parametrem danego typu może być wywołana wraz z argumentem dowolnego podtypu danego typu. B yte, Short, In te g e r, Long, F lo a t, Double, Big In te g e r i BigDecimal
są p o d t y p a m i
klasy Number: / / Lista zadeklarowana wraz typem generycznym Number. List n L is t = new ArrayList(); n Li s t . add ( ( by te) 27 ) ; // Typ Byte (automatycznepakowanie). n L i s t . add ( ( s h o r t ) 30000); //T y p Short. n L i s t . add (1234567890); / / Typ Integer. n L i s t . ad d( ( l o n g ) 2 e 6 2 ) ; //T y p Long. n L i s t . add ( ( f l o a t ) 3 . 4 ) ; //T y p Float. n L i s t . add ( 4 0 0 0 .8 ) ; //T y p Double. n L i s t . add(new Bi g l n t e g e r ( “9223372036854775810")); n L i s t . add(new BigDecimal( " 2 . I e 3 0 9 " ) ) ;
// Wyświetlenie listy wartości podtypów Number. f o r ( Number n : n L i s t ) S y ste m .o u t.p rin tln (n );
Parametry typu, znaki wieloznaczne i granice Najprostsza deklaracja klasy frameworka Generics zawiera nieograniczony parametr typu, taki jak T: p u b lic c l a s s Gener icClass { . . . }
Granice (ograniczenia) i znaki wieloznaczne mogą być stosowane w para metrach typu, jak przedstawiono w tabeli 16.1.
Parametry typu, znak w eloznaczne granee
|
151
Tabela 16.1. Parametry typu, znaki wieloznaczne i granice Parametry typu
Op s
Typ nieog aniczony takisamjak
Typy nieog aniczone i< P extends 0 b je ct>
Typ og aniczony od gó y ok eślony typ T jest podtypem P
Typ og aniczony od gó y ok eślony typ T jest podtypem P i implementuje typ S
Typ og aniczony od dołu ok eślony typ T jest typem nad zędnym P
Nieog aniczony znak wieloznaczny obiekt dowolnego typu tak samo jak
Og aniczony znak wieloznaczny pewien nieznany typ jest podtypem P
Og aniczony znak wieloznaczny pewien nieznany typ jest podtypem P i implementuje typ S
Znak wieloznaczny og aniczony od dołu pewien nieznany typ jest typem nad zędnym P
Zasada get i put W książce Java Geneńcs and Collections (O'Reilly, 2006) podano ró\wnież szcze góły zasad get i put, a także szczegółowe informacje o najlepszych sposobach użycia znaków wieloznacznych extends i super: • Znak wieloznaczny extends stosuj, gdy ze struktury pobierasz jedynie wartości. • Znak wieloznaczny super stosuj, gdy w strukturze umieszczasz jedynie wartości. • Nie używaj znaku wieloznacznego, gdy w strukturze umieszczasz i pobierasz wartości. Znak wieloznaczny extends został użyty w deklaracji metody addAll () kolekcji L i s t , ponieważ ta metoda pobiera (ang. get) wartości z kolekcji: p u b lic in t e r fa c e L i s t extends C o lle c tio n < E > { boolean addALL(C o lle c t io n c)
} L is t < In t e g e r > s r c L i s t = new A r r a y L is t < In t e g e r > (); s r c L is t .a d d ( O ) ; s r c L is t .a d d ( l) ; s r c L is t . a d d ( 2 ) ; // Użycie metody addAlK) zawierającej znak wieloznaczny extends. L is t < In t e g e r > d e s t L is t = new A r r a y L is t < In t e g e r > (); d e s t L is t . a d d A ll ( s r c L is t ) ;
152
|
Rozdz ał 16. Framework Gener cs
Znak wieloznaczny super został użyty w deklaracji metody addAll () klasy Collections, ponieważ ta metoda umieszcza (ang. put) wartości w kolekcji: p u b lic c la s s C o lle c tio n s { p u b lic s t a t ic boolean addAll (C o lle c tio n < ? super T> c , T . . . e le m e n ts){ . . . }
} // Użycie metody addAUO zawierającej znak wieloznaczny’ super. Li st s L i s t = new A rray Li st(); s L is t .a d d ( O ) ; C o lle c t io n s .a d d A ll( s L is t , ( b y t e ) l, (s h o r t )2 );
Specjalizacja typów generycznych Typy geneiyczne można rozszerzyć na wiele różnych sposobów. Mając parametryzowaną klasę abstrakcyjną AbstractSet : class SpecialSet extends AbstractSet { . . . } Klasa Special Set rozszerza AbstractSet zawierającą parametryzowany typ E. To jest typowy sposób deklarowania we framework u Generics. class Special Set extends AbstractSet { . . . } Klasa Special Set rozszerza AbstractSet zawierającą parametryzowany typ String. class SpecialSet extends AbstractSet { . . . } Klasa Special Set rozszerza AbstractSet zawierającą parametryzowany typ E. Typ P jest unikatowy w klasie Special Set. class SpecialSet extends AbstractSet { . . . } Klasa Special Set jest klasą frameworka Generics parametryzującą typ generyczny klasy AbstractSet. Ponieważ niezmodyfikowany typ klasy AbstractSet został rozszerzony (przeciwieństwo typu geneiycznego), parametryzacja nie wystąpi. W trakcie próby wywołania metody kom pilator wy generuje komunikat ostrzeżenia. class Special Set extends AbstractSet { . . . } Klasa Special Set rozszerza niezmodyfikowany typ klasy AbstractSet. Ponieważ oczekiwano geneiycznej wersji klasy AbstractSet, w trakcie próby wywołania metody kompilator wygeneruje komunikat ostrzeżenia.
Specjał zaeja typów generycznych
| 153
M etody fram ew orka Generics w niezm odyfikow anych typach Metody statyczne, niestatyczne i konstruktory są częścią niegenerycznych lub niezmodyfikowanych typów klas, które mogą być zadeklarowane jako generyczne. Niezmodyfikowany typ klasy jest niegeneiycznym odpowiedni kiem klasy geneiycznej. W przypadku metod geneiycznych klas niegenerycznych wartość zwrotna metody musi być poprzedzona parametrem typu geneiycznego, na przy kład . Jednak nie istnieje funkcjonalne powiązanie między typami para metru i wartości zwrotnej, o ile typ wartości zwrotnej jest geneiyczny: p u b lic c la s s S p e cia l Queue { p u b lic s t a t ic boolean add(E e) { . . . } p u b lic s t a t ic E peekQ { . . . }
}
Podczas wywoływania metody geneiycznej typ parametru jest umieszczany przed nazwą metody. W poniższym przykładzie typ został użyty w celu określenia argumentu typu geneiycznego: S p e c ia l Queue.< S trin g > a d d (" B ia ła k a r n a c ja " );
154
|
Rozdz ał 16. Framework Gener cs
ROZDZIAŁ 17.
API skryptowe Javy
Wprowadzone w Javie SE 6 API skiyptow e umożliwia aplikacjom Javy i językom skryptowym współpracę za pomocą interfejsu standardowego. Wspomniane API zostało dokładnie przedstawione w specyfikacji JSR 223 „Scripting for the Java Platform" i znajduje się w pakiecie javax.script.
Języki skryptow e Kilka języków skryptowych posiada implementacje silnika skryptów zgodne ze wspomnianą wcześniej specyfikacją JSR 223. Listę wybranych obsługiwa nych języków\r przedstawiono w dodatku B.
Im plem entacje silnika skryptów Interfejs ScriptEngine dostarcza podstawowe metody API skryptowego. Klasa Scri ptEngi neManager działa w połączeniu z wymienionym interfejsem i pozwala na wykorzystanie w programie wybranych silników skryptowych.
Osadzanie skryptów w Javie API skryptowe oferuje możliwość osadzania w7 aplikacjach Javy skryptów7 i/lub komponentów7 skryptów7. Przedstawiony poniżej fragment kodu pokazuje dwa sposoby osadzenia komponentów7 skryptowych w7 aplikacji Javy. Pienvszy, metoda eval () silnika skryptowego, bezpośrednio odczytuje składnię języka skryptowego. Drugi, metoda eval () silnika skryptowego, odczytuje składnię z pliku.
155
import import import import import
j a v a . i o . F i l eReader; j a v a . n i o . f i l e . Path; j a v a . n i o . f i l e . Path s; ja v a x . s c r i p t . S e ri ptEngi ne; j a v a x .s c r i p t . S c r i ptEngi neManager;
p u b lic c la s s HelloW orld { p u b lic s t a t i c void m a in (S trin g D a rg s ) throws Exceptio n { ScriptEngineM anager m = new Scrip tEn gineM anager( ) ; // Wybór silnika JavaScript Nashom. S c rip tE n g in e e = m .g e tE n g in e B y E x te n s io n ("js "); //Składnia silnika JavaScript Nashom. e .e v a l( " p r in t ( 'W it a j, ' ) " ) ; // Zawartość pliku world.js print('świecie!\n); Path p i = P a t h s .g e t (" / o p t / jp g 2 / w o r ld .js " ); e .e v a l (new F i l eReader ( p i. t o S t r i n g O ) ) ;
} }
Dane wyjściowe: $ W ita j, św ie cie !
W yw oływ anie metod języka skryptow ego Silniki skryptowe implementujące opcjonalny interfejs Invocable zapewmiają możliwość wywoływania (wykonywania) metod języka skryptowego, które zostały już przez ten silnik zinterpretowane. W przedstawionym poniżej fragmencie kodu znajduje się oparta na Javie metoda invokeFunction() wyw7ołująca zinterpretowaną przez silnik Nashom funkcję języka skryptowego greet (), która została wcześniej utw7orzona: ScriptEngineM anager m = new Scrip tEn gineM anager( ) ; S c r i ptEngi ne e = m .getEngi n e B y E x te n s io n C 'js " ); e.eval("function greet(message) + "{" + "println(message)" + "}");
In vo ca b le i = (In v o c a b le ) e; i . in v o k e F u n c tio n ("g re e t", "Pozdrow ienia z M arsa!");
Dane wyjściowe: $ Pozdrow ienia z Marsa!
Uzyskanie dostępu i kontrola zasobów Javy z poziomu skryptów API skryptowe zapewmia możliwość uzyskania dostępu i kontroli zasobów7 Javy (obiektów7) z poziomu przetwarzanego kodu języka skryptowego. Silnik skryptowy wykorzystuje w7iązania klucz-w7artość; to jedno z możliwych rozwiązań.
156
|
Rozdz ał 17. AP skryptowe Javy
W poniższym fragmencie kodu silnik JavaScript Nashom wykorzystuje wią zanie nameKey-worl d w celu odczytania (i wyświetlenia) danych składowych obiektu Javy z poziomu przetwarzanego kodu języka skryptowego: ScriptEngineM anager m = new S c rip tE n gin e M a n a g e r(); S c rip tE n g in e e = m .g e tE n g in e B y E x te n s io n ("js "); S t r in g world = " G lie s e 581 c " ; e .p u t ( “nameKey“ , w o rld ); e .e v a l( " v a r w = nameKey" ) ; e .e v a l( " p r in t ln ( w ) " ) ;
Dane wyjściowe: $ G lie s e 581 c
Dzięki wykorzystaniu wiązań klucz-wrartość z poziomu przetwarzanego kodu języka skryptowego można modyfikowrać dane składowe obiektu Javy: ScriptEngineM anager m = new S c rip tE n gin e M a n a g e r(); S c rip tE n g in e e = m .g e tE n g in e B y E x te n s io n ("js "); L is t < S t r in g > w o r ld L is t = new A rra y L i s t < > ( ) ; w o rld L is t.a d d (" Z ie m ia " ); w o rld L is t.a d d ("M a rs"); e.put("nam eKey", w o r ld L is t ); e .e v a l( " v a r w = nameKey. to A rra y O ; " ) ; e .e v a l( " nameKey.add (\ " G lie s e 581 c \ " ) " ) ; S y s t e m .o u t .p r in t ln ( w o r ld L is t );
Dane wyjściowe: $ [Z ie m ia , G lie s e 581 c]
Konfiguracja języków skryptow ych i silników Przed użyciem API skryptowego konieczne jest pobranie i skonfigurowanie implementacji żądanego silnika skryptowego. Wiele języków skryptowych zawiera w dystrybucji silniki zgodne ze specyfikacją JSR 223. Z reguły tego rodzaju silnik znajduje się w7 oddzielnym pliku JAR lub głównym, jak w przypadku JRuby.
Konfiguracja języka skryptow ego Poniżej przedstawiono kroki niezbędne do przeprowadzenia konfiguracji języka skryptowego:
Konf guracja języków skryptowych s In ków
|
157
1. Konfiguracja języka skryptowego w systemie operacyjnym. W dodatku B znajdziesz listę obsługiwanych przez Javę języków skryptowych oraz adresy stron internetowych, z których można je pobrać. Na wspom nianych stronach najczęściej znajdziesz omówienie procedury instalacyjnej. 2. Wywołanie interpretera skryptowego w celu upewnienia się o jego pra widłowym działaniu. To najczęściej jest interpreter działający z poziomu wiersza poleceń, choć może być również wyposażony w graficzny inter fejs użytkownika. W przypadku (na przykład) JRuby wydanie poniższych poleceń pozwala na sprawdzenie, czy dysponujemy prawidłową konfiguracją: jr u b y [ f i l e . r b ] / / Plik wiersza poleceń. j ruby .b a t // Plik wsadowy Windows.
Konfiguracja silnika skryptow ego Oto kroki niezbędne do przeprowadzenia konfiguracji silnika skryptowego: 1. Ustalenie, czy dystrybucja języka skryptowego zawiera implementację silnika zgodną ze specyfikacją JSR 223. Jeżeli tak jest, wówczas kroki 2. i 3. są niepotrzebne. 2. Znajdź i pobierz plik silnika skryptowego z zewnętrznego źródła, takiego jak witryna internetowa. 3. Pobrany plik umieść w7katalogu i wyodrębnij niezbędny plik JAR. Warto w tym miejscu dodać, że jako katalog instalacyjny bardzo często jest używ7any katalog przeznaczony dla oprogramow7ania opcjonalnego, czyli /opt. W celu instalacji i konfiguracji pewnych języków7 skryptowych w systemie Windows konieczne może okazać się wcześniejsze zainstalow7ame pow7łoki zgodnej z POSLX, czyli na przykład MSYS lub Cygwin.
W eryfikacja silnika skryptow ego Weryfikację konfiguracji silnika skryptowego można przeprowadzić przez kompilację i/lub interpretację bibliotek języka i silnika skryptowego. Poniższy przykład dotyczy starszej wersji JRuby, w7 której silnik był dostępny zewnętrznie: ja v a c -cp c : \ o p t \ jr u b y - 1 .0 \ lib \ jr u b y .ja r ; c :\ o p t \ jr u b y - e n g in e .ja r ;. Engines
158
|
Rozdz ał 17. AP skryptowe Javy
Istnieje możliwość wykonania dodatkowych testów z użyciem niewielkich programów. Przedstawiona poniżej aplikacja pow7oduje wyświetlenie listy dostępnych silników skryptowych, numerów wersji języka i stosowanych rozszerzeń. Warto w tym miejscu dodać, że uaktualniona wersja JRuby zapewmia obsługę specyfikacji JSR 223 za pomocą podstawowego pliku JAR. Dlatego też silnik nie musi być wywoływany oddzielnie: $ ja v a -cp c : \ o p t \ j r u b y - l.6 .7 .2 \ 1 ib \ jr u b y .ja r ; . EngineReport
Kod źródłowy programu: import j a v a . u t i l . L i s t ; import j a va x. s c r i p t . S e ri ptEngi neManager; import j a v a x .s c r i p t . S c r i ptEngi n e F acto ry; p u b lic c la s s EngineReport { p u b lic s t a t i c void m a in (S trin g D a rg s ) { ScriptEngineM anager m = new Scrip tEn gineM anager( ) ; L is t< S c rip tE n g in e F a c to ry > s = m .g e tE n g in e F a c to rie s (); //Iteracja przez listą silników. f o r (S c rip tE n g in e F a c to ry f : s) { // Określenie nazwy i wersji silnika. S t r in g en = f.ge tEn gin e N am e (); S t r in g ev = f.g e t E n g in e V e r s io n (); S y s t e m .o u t .p r in t ln ( " S iln ik : " + en + u " + e v ) ; //N azw a języka i wersja. S t r in g ln = f.getLanguageN am e(); S t r in g l v = f.g e tL a n g u a g e V e rs io n (); S y s t e m .o u t.p r in t ln (" Ję z y k : u + ln + " " + l v ) ; // Rozszerzenie. L is t < S t r in g > 1 = f .g e t E x t e n s io n s ( ) ; f o r (S t r in g x : 1) { S y s t e m .o u t.p r in t ln (“R o zsze rze n ie : " + x ) ;
} } } }
Dane wyjściowa: $ S i l n i k : O racle Nashorn 1 .8 .0 $ Ję z y k : ECMAScript ECMA - 262 E d itio n 5.1 $ R o zsze rze n ie : j s $ S i l n i k : JSR 223 JRuby Engine 1 .6 .7 .2 $ Ję z y k : ruby jr u b y 1 .6 .7 .2 $ R o zsze rze n ie : rb
JavaScript Nashorn to pakiet skryptowego API dostarczany domyślnie wraz z Javą SE. Nashorn zastąpił API JavaScript Rhino, znajdujące się w7 poprzednich wersjach JDK.
Konf guracja języków skryptowych s In ków
| 159
160
I
Rozdz ał 17. AP skryptowe Javy
ROZDZIAŁ 18.
API daty i godziny
API daty i godziny (specyfikacja JSR 310) zapewnia obsługę obliczeń związa nych z datą, godziną i kalendarzem. Odniesieniem implementacji dla wymie nionej specyfikacji JSR jest projekt ThreeTen (http://zozvw.threeten.org/), któiy znajduje się w JDK 1.8. API daty i godziny jest po^viązane z pakietem java. '-►time oraz podpakietami java.time.chrono, java. time, format, java. time, temporai i java.time.zone. W specyfikacji JSR 310 osiągnięto wiele celów projektowych: • API Fluent: łatwe w odczycie, na przykład dzięki łączeniu metod. • Projekt zapewniający bezpieczeństwo wątków: klasy dostarczające nie zmienne wartości. • Rozszerzalne API: systemy kalendarzy, możliwość dostosowania i wyko nywania zapytań. • Zachowanie zgodne z oczekiwaniem. API daty i godziny używa modelu wymiany danych zgodnego ze standar dem ISO 8601. Oficjalna nazwa standardu ISO 8601 to „Data elements and interchange formats—Information interchange— Representation of dates and times". Wymieniony standard jest oparty na kalendarzu gregoriańskim. Oczywiście, obsługiwane są również kalendarze regionalne. Więcej informacji na temat API Fluent znajdziesz w dodatku A.
161
W steczna zgodność Specyfikacja JSR 310 zastępuje klasy java.util .Date, java.util .Calendar, java, '-►util.DateFormat, java.util.GregorianCalendar, java.util.TimeZone i java.sql. '-►Date, ale ich nie unieważnia. W JDK 8 znajdują się metody pozwalające wymienionym klasom na konwersję w7 obie strony danych zgodnych ze specyfikacją JSR 310 na star szy format. / / Stary -> nowy -> stary. Calendar c = C a le n d a r.g e tln s t a n c e ( ); In s ta n t i = c . t o ln s t a n t ( ) ; Date d = D ate .from ( i ) ; / / Nowy -> stary -> nowy. ZonedDateTime zd t = Z o n e d D a te Tim e .p arse ("2 0 1 4 -0 2 -2 4 Tll:17:00+01:00" + "[Europe/W arsaw]") G rego ria nC alend ar gc = G re g o ria n C a le n d a r.fro m (zd t); L o c a lDateTime ld t = gc.to Z o n e d D a te T im e ().to Lo calD ate T im e ();
Kalendarze regionalne Specyfikacja JSR 310 jest niezwykle elastyczna i pozwala na dodawanie kolejnych kalendarzy. Podczas tworzenia notv eg o kalendarza klasy muszą implementor vac interfejsy Era, Chronology i ChronoLocal Date. W ornatvianyrn API znajdziemy cztery kalendarze regionalne: • hidżra, • japoński, • chiński, • buddyjski. W przypadku kalendarzy regionalnych nie będziesz używać klas głównych kalendar za ISO.
Kalendarz ISO Pakiet podstawkowy java.time zatviera API dostarczające zgodny ze stan dardem ISO 8601 system kalendarza gregoriańskiego. Wymieniony pakiet i irme z nim potviązane oferują łatwy tv użyciu interfejs, o czym możesz się przekonać tv poniższym fragmencie kodu, w którym obliczamy różnicę tvieku między dwiema osobami:
162
|
Rozdz ał 18. AP daty godz ny
p u b lic f in a l s t a t i c S t r in g D IS N EY B IR TH YEA R = “ 1901"; p u b lic f in a l s t a t i c S t r in g TEM PLEBIRTH YEAR = "1928"; Year b ir t h Y e a r l = Y e a r.p a rse (D IS N E Y B IR T H Y E A R ); Year b irth Y e a r2 = Y e a r.p a rse (T E M P LE B IR T H Y E A R ); long d i f f = C h ro n o U n it.YE A R S.b etw e e n (b irth Ye arl, b irth Y e a r 2 ); System .o u t .p r in t ln (" R ó ż n ic a wieku wynosi “ + M a th .a b s (d iff) + " l a t . " ) ;
Dane wyjściowe: $ Różnica wieku wynosi 27 l a t .
Poniżej przedstawiono API klas podstawowych; opisy pochodzą z doku mentacji API dostępnej w intemecie. W dalszej części rozdziału znajdziesz omówienie kluczowych atrybutów7 oraz przykłady użycia wybranych klas. In s t a n t
Natychmiastowy punkt na osi czasu, mierzony od początku standar dowej epoki Javy, czyli w7zględem daty 1970-01-01T00:00:00Z. Lo c a lD a te
Niemodyfikow7alny obiekt data-godzina; t przedstawia datę wyświe tlaną w postaci rok-miesiąc-dzień. Lo calTim e
Niemodyfikow7alny obiekt data-godzina przedstawiający godzinę wy świetlaną w7postaci godzina-minuta-sekunda. Lo calD a te Tim e
Niemodyfikow7alny obiekt data-godzina przedstawiający datę i godzinę wyświetlaną w postaci rok-miesiąc-dzień-godzina-minuta-sekunda. O ffse tT im e
Niemodyfikow7alny obiekt data-godzina przedstawiający godzinę wy świetlaną w7postaci godzina-minuta-sekunda-różnica_czasu. O ffse tD a te T im e
Niemodyfiko^valny obiekt data-godzina przedstaw7iający datę i godzinę w7raz z różnicą czasu. P rz ech ó d \ 7ane są w7szystkie pola daty i godziny z dokładnością do nanosekund, a także różnica czasu wTzględem UTC/ Greenwich. ZonedDateTim e
Niemodyfiko^valny obiekt data-godzina przedstawiający datę i godzinę W T a z ze strefą czasow7ą. Przechowyw7ane są w7szystkie pola daty i godziny z dokładnością do nanosekund, a także strefa czasow7a i różnica czasu strefy, co pozw7ala na uniknięcie niejasności podczas podaw7ania lokal nej daty i godziny.
Kalendarz SO
| 163
Zo n e O ffse t
Różnica czasu dla danej strefy czasowej. Podaje różnicę czasu wzglę dem Greem vich /UTC . Zonedld
Identyfikacja strefy czasowej. Stosowana do identyfikacji reguł kon wersji między Instant i Local DateTime. Year
Niemodyfikowalny obiekt data-godzina przedstawiający rok. YearMonth
Niemodyfikowalny obiekt data-godzina przedstawiający połączenie roku i miesiąca. MonthDay
Niemodyfikowalny obiekt data-godzina przedstawiający połączenie mie siąca i dnia. DayOfWeek Wyliczenie dla dni tygodnia: poniedziałek, wtorek, środa, czwartek, piątek, sobota i niedziela. Month
Wyliczenie dla miesięcy roku: styczeń, luty, marzec, kwiecień, maj, czerwiec, lipiec, sierpień, wrzesień, październik, listopad i grudzień. D u ra tio n
Wyrażona w sekundach liczba oparta na czasie. P e ri od
Ilość czasu oparta na dacie. C lo c k
Dostęp do aktualnej daty, godziny i strefy czasowej. Użycie tego atry butu jest opcjonalne.
Interfejs m aszynow y Specyfikacja JSR 310 używa epoki systemu UNIX dla domyślnego kalen darza ISO 8601. Za wartość zerową jest uznawana data 1970-01-01T00:00Z. Od wymienionej daty czas płynie nieustannie; wartości ujemne wskazują datę i godzinę przed podaną datą początku epoki systemu UNIX. Aby pobrać egzemplarz bieżącego czasu, należy po prostu wywołać metodę In s t a n t.n o w ():
164
|
Rozdz ał 18. AP daty godz ny
In s ta n t i = In s ta n t.n o w (); System.out.printIn("Maszyna: " + i.toEpochMi11 i ());
Dane wyjściowe: $ Maszyna: 1392859358793 S y ste m .o u t.p rin tln ("C z? o w ie k : " + i ) ;
Dane wyjściowe: $ C zło w iek: 2014-02-20T01:20:41.402Z
Klasa Clock zapewnia dostęp do aktualnej daty, godziny i strefy czasowej: C lo ck c lo c k l = C lo ck.syste m U T C (); In s ta n t i l = In s t a n t .n o w (c lo c k l); Zoneld z id = Z o n e ld .of("Europe/W arsaw "); C lo ck clo ck 2 = C lo c k .s y s t e m (z id ); In s ta n t i2 = In s ta n t.n o w (c lo c k 2 );
API daty i godziny używa bazy danych stref czasowych dostępnej na stronie http://zvzvw.iana.org/time-zones.
Okresy i momenty Okres to oparta na czasie wartość składająca się z dni, godzin, minut, sekund i nanosekund. Okies wskazuje czas między dwoma punktami na osi czasu. W celu użycia w programie wartości okr esu trzeba przetworzyć ciąg tekstowy PnDTnHnMnS, gdzie P oznacza moment, T oznacza czas. Z kolei D, H, Mi S oznaczają odpowiednio dni, godziny, minuty i sekundy poprzedzone \wartościami (n): Duration d l = D u ra tio n .p a rse ("P2DT3H4M1.I S " ) ;
Wartość okr esu można utworzyć rówmież za pomocą metody of [typ]. Mogą być dodane godziny, minuty, sekundy i nanosekundy: Duration d2 = D u ra tio n .o f(41, ChronoU nit.YEA R S); Duration d3 = D u ra tio n .o fD a y s( 8 ) ; d3 = d 3 .p lu s H o u rs (3 ); d3 = d 3 .p lu sM in u te s(3 0 ); d3 = d 3 .plusSe co nd s(55).m inu sN an o s(3 00);
Metoda Duration.between() pozw7ala na utworzenie okresu na podstawie podanych dat początków7ej i końcowej: In s ta n t b ir t h = In s ta n t.p a rs e ("1 9 6 7 -0 9 -1 5 T 1 0 :3 0 :0 0 Z "); In s ta n t cu rre n t = In s ta n t.n o w (); Duration d4 = D u ra tio n .b e tw e e n (b irth , c u r re n t); S y s te m .o u t.p r in t(" L ic z b a dni ż y c ia : " + d 4 .t o D a y s ());
Kalendarz SO
| 165
Moment to oparta na dacie wartość składająca się z lat, miesięcy i dni. W celu użycia w programie wartości momentu trzeba przetworzyć ciąg tek stowy PnYnMnD, gdzie P oznacza moment, natomiast Y, Mi D oznaczają odpo wiednio lata, miesiące i dni poprzedzone wartościami (n): P e r i o d p l = P e r i o d . p a r s e ( " P10Y5M2D" ) ;
Wartość momentu można utworzyć również za pomocą metody of [typ]. Mogą być dodane lub odjęte lata, miesiące i dni: P e r i o d p2 = P e r i o d . o f ( 5 , 10, 4 0 ) ; p2 = p 2 . p l u s Y e a r s ( 1 0 0 ) ; p2 = p 2 . p l u s M o n t h s ( 5 ) . m i n u s D a y s ( 3 0 ) ;
JDBC i m apowanie XSD Współpraca między pakietami java.time i java.sql jest możliwa. W tabeli 18.1 przedstawiono wizualne mapowanie typów specyfikacji JSR 310 na SQL, a także na typy schematu XML (XSD). Tabela 18.1. Mapowanie JDBC i XSD Typ JSR 310
Typ SQL
Typ XSD
Local Date
DATE
xsrtim e
Local T i me
TIME
xsrtim e
LocalDateTim e
TIMESTAMP WITHOUT TIMEZ0NE
xsrdateTim e
O ffsetTim e
TIME WITH TIMEZ0NE
xsrtim e
O ffsetDateTim e
TIMESTAMP WITH TIMEZ0NE
xsrdateTim e
Period
INTERVAL
•
Form atowanie Klasa D ateTim eForm atter zapewnia możliwość wyświetlania i przetwarzania obiektów7 daty i godziny. W poniższym fragmencie kodu przedstawiono użycie wzorca liter wraz z metodą o f P a t t e r n ( ) omawianej klasy. Możliwe do użycia wzorce liter są identyfikowane w dokumentacji Javadoc dla klasy DateT i m eForm atter: LocalDateTim e in p u t = LocalD ateTim e.now (); DateTim eFormatter format = D ateTim eForm atter.ofP a tte rn ("yyyyMMddhhmmss"); S t r in g date = in p u t.fo rm a t(fo rm a t); S t r in g lo g F ile = "s im p le -lo g -" + date + " . t x t " ;
166
|
Rozdz ał 18. AP daty godz ny
W tabeli 18.2 wymieniono przykłady predefiniowanych formatów opartych na następującej strukturze: System.out.pri nt(LocalDateTi m e .now() .format(DateTimeFormatter.BASIC_IS0_DATE));
Tabela 18.2. Predefiniowane formaty Klasa
Format
Przykład
LocalDateTim e
B A S IC IS O D A T E
20140215
LocalDateTim e
IS0_L0CAL_DATE
2014 02 15
O ffsetDateTim e
ISO O FFSET D A TE
2014 02 15 05 00
LocalDateTim e
ISO DATE
2014 02 15
O ffsetDateTim e
ISO DATE
2014 02 15 05 00
LocalDateTim e
IS0_L0CAL_TIME
23 39 07 888
O ffsetTim e
IS O O FF SE T T IM E
23 39 07 888 05 00
LocalDateTim e
IS0_TIME
23 39 07 888
O ffsetDateTim e
IS0_TIME
23 39 07 888 05 00
LocalDateTim e
ISO_LOCAL_DATE_TIME
2014 02 15T23 39 07 888
O ffsetDateTim e
IS O O FF SE T D A T E T IM E
2014 02 15T23 39 07 888 05 00
ZonedDateTime
ISO_ZONED_DATE_TIME
2014 02 15T23 39 07 89 05 00 [Eu ope/Wa saw]
LocalDateTim e
IS O D A T E T IM E
2014 02 15T23 3907 891
ZonedDateTime
IS O D A T E T IM E
2014 02 15T23 39 07 891 05 00 [Eu ope/Wa saw]
LocalDateTim e
IS0_0RDINA L_DATE
2014 046
LocalD ate
ISOW EEKDATE
2014 W07 6
ZonedDateTime
RFC_1123_DATE_TIME
Sat 15 Feb 2014 23 39 07 0500
Kalendarz SO
| 167
168
I
Rozdz ał 18. AP daty godz ny
ROZDZIAŁ 19.
Wyrażenia lambda
Wyrażenia lambda (aE), nazywane również domknięciami, przedstawiają metody anonimowe. Obsługiwane przez Project Lambda (http://openjdk.java.net/ projects/lambda/), pozwalają na tworzenie i używanie klas z pojedynczymi metodami. Wspomniane metody charakteryzują się podstawową składnią pozbawioną modyfikatorów7, typu wartości zwrotnej oraz opcjonalnycli para metrów. Specyfikacja wyrażeń lambda jest zawarta w JSR 335; została podzie lona na siedem części: interfejsy funkcjonalne, wyrażenia lambda, referen cje do metod i konstruktorów, wyrażenia nazywane poly expressions, typy i obliczenia, ustalanie typu i metody domyślne. W tym rozdziale koncen trujemy się na dwóch pierwszych częściach.
Podstaw y w yrażeń lam bda Wyrażenie lambda musi miec interfejs funkcjonalny. Tego rodzaju interfejs posiada jedną metodę abstrakcyjną oraz zero lub więcej metod domyśl nych. Interfejs funkcjonalny zapewnia typy docelowe dla wyrażeń lambda i metod referencyjnych; w idealnej sytuacji powinien miec adnotację @Func '-► tio n a l In te r fa c e , aby pomóc programiście i kompilatorowi w prawidłowym odczycie jego przeznaczenia. ©Functional I n t e r f a c e p u b lic i n t e r f a c e Comparator {
//Dozwolona jest tylko jedna metoda abstrakcyjna. i n t compare(T o l , T o2);
//Nadpisywanie jest dozwolone. boolean e q u a ls (O b je c t o b j ) ;
//Dozwolone są opcjonalne metody domyślne. }
169
Składnia i przykład w yrażenia lambda Wyrażenie lambda zwykle zawiera listę parametrów7, typ wartości zwrot nej i polecenia: ( l i s t a parametrów) -> {p o le c e n ia ;}
Oto kilka przykładów7 wyrażeń lambda: () -> 66 (x ,y ) -> x + y (In te g e r x , In te g e r y ) -> x*y (S t r in g s) -> { S y s t e m .o u t .p r in t ln ( s ); }
Poniższa prosta aplikacja JavaFX GUI po naciśnięciu przycisku dodaje tekst do paska tytułu. Kod wykorzystuje interfejs funkcjonalny EventHandl e r wraz z jedną metodą abstrakcyjną handl e ( ) . import ja v a f x .a p p lic a t io n .A p p lic a t io n ; import ja v a fx .e v e n t.A c tio n E v e n t; import ja v a fx .e v e n t.E v e n tH a n d le r; import ja v a fx .s c e n e .S c e n e ; import ja v a fx .s c e n e .c o n tr o l.B u t t o n ; import j a v a fx . scene.1 ayo u t. StackPane; import ja v a f x .s t a g e .S t a g e ; p u b lic c la s s JavaFxApp extends A p p lic a tio n { ©Override p u b lic vo id s t a r t(S t a g e stag e ) { Button b = new B u tto n ( ) ; b .s e t T e x t (" N a c iś n ij p r z y c is k " ) ; // Użycie anonimowej klasy wewnętrznej. b.setO nAction(new EventHandle r< A ctio n Eve n t> () { ©Override p u b lic vo id h and le(A ctio n Event event) { s t a g e .s e tT itle (" W y r a ż e n ia lambda r z ą d z ą ! " );
} }); StackPane root = new S ta ck P a n e Q ; r o o t .g e t C h ild re n ( ) .a d d (b ); Scene scene = new Sce n e (ro o t, 200, 5 0 ); s ta g e .se tS c e n e (s c e n e ); sta g e .sh o w ();
} p u b lic s t a t ic void m ain (Strin gIU a rg s ) { la u n c h ( );
} }
170
|
Rozdz ał 19. Wyrażeń a lambda
Aby przeprowadzić refaktoring tej klasy anonimowej na wyrażenie lambda, typem parametru powinien być (A c tio n E v e n t e v e n t) lub po prostu (e v e n t ). Ponadto żądana funkcjonalność musi być dostarczona w postaci poleceń wyrażenia. //Sposób użycia wyrażenia lambda. b.setO nAction((ActionEvent ev ent) -> { s t a g e . se t T i t l e (" W y ra ż e n i a lambda r z ą d z ą ! “) ;
}); * 4 -r«*r----*%
Nowoczesne środowiska IDE mają funkcje przeznaczone do kon wersji anonimowych funkcji wewnętrznych na wyrażenia lambda.
l W rozdziale 15. przedstawiono inne przykłady wyrażeń lambda wraz z inter fejsem funkcjonalnym Comparator.
Referencje do metody i konstruktora Referencja do metody odnosi się do istniejącej metody bez jej wywoływania. Obejmuje to referencję do metody statycznej, egzemplarz metody określo nego obiektu, metodę super określonego obiektu i metodę egzemplarza dowolnego obiektu wskazanego typu. Referencje do metod obejmują rów nież referencje do konstruktora klasy i referencję do konstruktora tablicy. “dowol ny t e k s t " : : 1ength //Pobranie długości ciągu tekstowego. S t r i ng: : 1ength // Pobranie długości ciągu tekstowego. CheckAcct: : compareByBal ance //Referencja do metody statycznej. myComparator: : compareByName //Metoda egzemplarza określonego obiektu. s u p e r :: t o S t r i ng / / Metoda super określonego obiektu. S t r i ng: : compareToIgnoreCase //Metoda egzemplarza dowolnego obiektu. ArrayLi s t < S t r i ng>:: new // Konstruktor ArrayList. A r ra y s : : s o r t // Sortowanie elementów tablicy.
Interfejsy funkcjonalne specjalnego przeznaczenia Interfejsy funkcjonalne wymienione w tabeli 19.1 zostały opracowane do spe cjalnych celów7 związanych z API lub pakietem, w którym je umieszczono. Nie wszystkie interfejsy funkcjonalne w API Jawy SE posiadają adnotacje.
nterfejsy funkcjonalne specjalnego przeznaczeń a
|
171
Tabela 13.1. Interfejsy funkcjonalne specjalnego przeznaczenia AP
Klasa
Metoda
AWT
KeyEventDi sp a c te r
disp atch KeyEvent (KeyEvent e)
AWT
K eyEventPostProcessor
postProcessKeyEvent (KeyEvent e)
10
Fi le F i 1te r
a c c e p t (F ile pathname)
10
Fi lenameFi 1te r
a c c e p t (F ile d i r , S t r in g name)
LANG
Runnable
ru n ()
NIO
D irecto rStream
it e r a t o r ()
NIO
PathMatcher
matches (Path path)
TIME
Temporal Adj u ste r
a d ju s tln to (Temporal tem poral)
TIME
Temporal Query
queryFrom (Tem poralAccessor tem poral)
U TIL
Comparator
compare (T o l , T o2)
CONC
C a lla b le
c a l l ()
LOG
Fi le r
isL o g g a b le (LogRecord record )
PREF
PreferenceChangeLi sten e r
preferenceChange (PreferenceChangeEvent e vt)
Interfejsy funkcjonalne ogólnego przeznaczenia Pakiet j a v a . u t i l .f u n c t io n składa się z ogólnego przeznaczenia interfejsów funkcjonalnych dla podstawowych funkcji JDK. W tabeli 19.2 wymieniono te wszystkie interfejsy. Tabela 13.2. Interfejsy funkcjonalne ogólnego przeznaczenia Konsument
accept (T t)
Bi Consumer
accept (T t , U u)
Obj DoubleConsumer
accept (T t , double valu e)
ObjIntConsumer
accept (T t , in t v a lu e )
ObjLongConsumer
accept (T t , long valu e)
DoubleConsumer
accept (double valu e )
IntConsumer
accept ( in t valu e)
LongConsumer
accept (lo n g valu e )
Function
ap ply (T t )
Bi Function
ap ply (T t , U u)
DoubleFunction
ap ply (double valu e)
172
|
Rozdz ał 19. Wyrażeń a lambda
Tabela 13.2. Interfejsy funkcjonalne ogólnego pr zeznaczenia Konsument
accept (T t)
In tFu n ctio n
ap ply ( i n t valu e )
LongFunction
ap ply (lo n g valu e)
Bin aryO perato r
ap ply (O b je ct, O bject)
ToDoubleBi Fu ncti on
applyAsDouble (T t , U u)
ToDoubleFunction
applyAsDouble (T valu e )
IntToDoubleFunction
applyAsDouble ( in t valu e )
—
ciąg dalszy
LongToDoubleFunction
applyAsD ouble(long valu e )
DoubleBi naryOperator
applyAsDouble (double l e f t , double r ig h t )
T o In tB i Function
a p p ly A sIn t (T t , U u)
T o In tFu n ctio n
a p p ly A sIn t (T valu e)
Lo ngToIntFunction
a p p ly A sIn t (lo n g valu e )
D oubleToIntFunction
a p p ly A sIn t (double valu e)
In tB i naryOperator
a p p ly A sIn t ( in t l e f t , in t r ig h t )
ToLongBiFunction
applyAsLong (T t , U u)
ToLongFunction
applyAsLong (T valu e )
DoubleToLongFuncti on
applyAsLong (double valu e)
In tToLongFuncti on
applyAsLong ( i n t valu e )
LongBi naryOperator
applyAsLong (lo n g l e f t , long r ig h t )
Bi P re d ica te
t e s t (T t , U u)
P re d ica te
t e s t (T t )
D oublePredicate
t e s t (double valu e )
In tP re d ic a te
t e s t ( i n t valu e)
LongPredicate
t e s t (lo n g valu e )
S u p p lie r
g e t()
B o o le anSup plie r
getAsBoolean()
D o u bleSu pp lier
getAsD ouble()
In t S u p p lie r
g e tA s In t ()
Lo n gSu p p lie r
getA sLo ng()
UnaryOperator
id e n t it y O
DoubleUnaryOperator
id e n t it y O
IntU naryO perator
a p p ly A sIn t ( in t operand)
LongUnaryOperator
a p p ly A sIn t (lo n g valu e )
nterfejsy funkcjonalne ogólnego przeznaczeń a
|
173
Zasoby dotyczące w yrażeń lam bda W tym podrozdziale przedstawiono listę łączy prowadzących do samoucz ków oraz przygotowanych przez społeczność zasobów dotyczących wyra żeń lambda.
Sam ouczki Wyczerpujące samouczki zostały przygotowane przez Oracle i Maurice'a Naftalina. • The Java Tutorials: Lambda Expressions (http://docs.oracle.com/jauase/ tutorial/java/javaOO/lambdaexpr essions.html). • Maurice Naftalin's Lambda FAQ: „Your questions answered: all about Lambdas and friends" (jhttp://www.lambdafaq.org/).
Zasoby przygotow ane przez społeczność Fora, listy dyskusyjne i instruktażowe pliki wideo pomagają w poznaniu sposobu użycia wyrażeń lambda: • XEs Forum Board at CodeRanch: Online bulletin board (http://www. coderanch .com/forums/f-121/fSR). • XEs Mailing List: Technical discussions related to Project Lambda (http://mail.openjdk.java.net/mailmanAistinfo/lambda-dev). • Oracle Learning Library on YouTube (http://zvww.youtube.com/watch?v= 0if7Udc5ImM&list=PLKCk30yNwIzv6qi-Lu fkQ0tGjF7gZTpqo).
174
|
Rozdz at 19. Wyrażeń a lambda
Dodatki
DODATEK A
API Fluent
Fluent (ang. Fluent Interface) to zorientowane obiektowo API, którego celem jest dostarczanie kodu znacznie czytelniejszego, a tym samym łatwiejszego w użyciu. Powiązanie obiektów ze sobą za pomocą łączenia metod pomaga w osiągnięciu wspomnianej czytelności i użyteczności. W tego rodzaju pro jekcie łączone metody najczęściej mają ten sam typ. //A P I StringBuilder. S t r in g B u ild e r sb = new S tr in g B u iId e r (" p a lin d r o m !" ) ; //Łączenie metod. s b . d e l e t e (10, 11) . append( " y " ) . r e v e r s e ( ) ; System .o u t .p r in t I n ( “W artość: “ + s b ) ;
Dane wyjściowe: $ W artość: ym ordnilap
Oto nazw y kilku popularnych API Fluent utworzonych w Javie: API jOOQ (ang. Java Object Oriented Querying), API jMock, API Calculon Android, API Apache Camel, dostępne Ja\ie 8 API daty i godziny (specyfikacja JSR 310) oraz przeznaczone do umieszczenia w Javie 9 API Money and Currency (specyfikacja JSR 354). Każde z nich zawiera język specjalizosvany (ang. Domain Specific Language, DSL). Zewnętrzny język specjalizowany można bardzo łatwo mapować na wewnętrzny język specjalizowany Ja\y, wykorzystując w tym celu podejście oparte na API Fluent. Do najczęściej stosowanych prefiksów w metodach API Fluent przeznaczo nych do działania na obiektach zaliczamy at, format, from, get, to i wi th. Klasa Lo ca l DateTim e API daty i godziny została użyta w poniższym przy kładzie. Pierwszy fragment kodu nie stosuje łączenia metod, natomiast zasto sowano je w drugim: 177
//Samodzielna metoda statyczna. LocalDateTim e I d t l = LocalD ateTim e.n ow (); S y s t e m .o u t .p r in t ln ( ld t l) ;
Dane wyjściowe: $ 2014-02-26T09:33:25.676 //M etoda statyczna i łączenie metod. LocalDateTim e ld t2 = LocalDateTim e.now () . wi thDayOfMonth( 1 ) . wi th Y e a r (1878) .p lu sW e eks(2 ).m inu s(3 , ChronoUnit.HOURS); S y s t e m .o u t .p r in t ln ( ld t 2 );
Dane wyjściowe: $ 1878-02-15T06:33:25.724
Jeżeli chcesz dowiedzieć się więcej na temat języka specjalizowa nego, sięgnij po książkę Domain Specific Latiguages Martina Fowlera (Addison-Wesley, 2010).
178
|
Dodatek A AP Fluent
DODATEK B
Narzędzia firm trzecich
Szeroka gania narzędzi typu open source, komercyjnych opracowanych przez firmy trzecie oraz technologii może pomóc podczas tworzenia aplikacji w Ja vie. Przedstawiony tutaj zestaw zasobów jest efektywny i zarazem popularny. Pamiętaj o konieczności sprawdzenia warunków licencji narzędzi open source, jeśli mają być używane w środowiskach komercyjnych.
O pracow yw anie, CM i narzędzia testow ania Ant (http://ant.apache.org/) Apache Ant to oparte na XML narzędzie przeznaczone do tworzenia i wdrażania aplikacji Javy. Warto dodać, że jest bardzo podobne do doskonale znanego narzędzia make w systemie UNIX. Blood ho und (http://bloodhou nd.apache.org/) Apache Bloodhound to oparte na interfejsie przeglądarki internetowej oprogramowanie typu open source przeznaczone do zarządzania pro jektem i śledzenia błędów. Continuum (http:,//eontinuum.codehaus.org/) Apache Continuum to serwer ciągłej integracji pozwalający na regularne kompilowanie i testowanie kodu.
179
CruiseControl (http://cruisecontivl.sourceforge.net/) CruiseControl jest frameworkiem przeznaczonym do obsługi procesu ciągłej kompilacji. Enterprise Architect (http://www.sparxsystems.com/) Enterprise Architect to komercyjne narzędzie typu CASE (ang. Computer Aided Software Engineering), które pozwala na generowanie i analizę kodu Javy za pomocą języka UML. FindBugs (http://findbugs.sourceforge.net/) FindBugs to program wyszukujący błędy w kodzie Javy. Git (http://git-scm.com/) Git to rozproszony system kontroli wersji rozwijany jako projekt typu open source. Gradle (http://www.gradle.org/) Gradle to system przeprowadzania kompilacji, któiy wspomaga operacje testowrania, publikacji i wdrażania. I i u ds on (http://hudson -ci.org/) Hudson to oferujący duże możliwości rozbudowy sen ver ciągłej integracji. Ivy (https://ant.apache.org/ivy/) Apache Ivy to menedżer relacji zależności, któiy został zintegrowany z produktem Apache Ant. Jalopy (http://jalopy.sourceforge.net/) Jalopy to dostępny jako oprogramowanie typu source code formater dla Javy, któiy oferuje wtyczki między innymi dla Eclipse, jEdit, NetBeans i wielu innych narzędzi. JDocs (http://www.jdocs.com/) JDocs to repozytorium dokumentacji zapewniające sieciowy dostęp do dokumentacji API bibliotek Javy rozprowadzanych jako open source. j Clarity (http://www.jclarity.com/) jClaiity to narzędzie przeznaczone do przeprowadzania analizy wydaj ności i monitorowania, opracowane dla środowisk chmury. jEdit (http://www.jedit.org/) jEdit to edytor tekstów zaprojektowany dla programistów. Zawiera w7budowany menedżer wtyczek, za pomocą którego oferuje dostęp do wielu różnych w7tyczek.
180
|
Dodatek B Narzędz a f rm trzeć ch
JavaFX SceneBuilder (http://www.oracle.com/technetwork/java/javase/downloads/ javafxscenebuilder-info-2157684.html) JavaFX Scene Builder to narzędzie graficzne przeznaczone do projekto wania aplikacji JavaFX. Jenkins (http://jenkins-ci.org/) Jenkins Cl to dostępny jako oprogramowanie open source serwer ciągłej integracji, oficjalnie znany pod nazwą Hudson Labs. JIRA (https://www.atlassian.com/software/jira/) JIRA to komercyjne oprogramowanie służące do zgłaszania i śledzenia błędów, a także do zarządzania projektem. JUnit (http://junit.org/) JUnit to framework przeznaczony do przeprowadzania testów jednost kowych. Pozwala na tworzenie i uruchamianie powtarzalnych testów7. JM eter (http://jmeter .apache.org/) Apache JMeter to aplikacja sprawdzająca zachowranie systemu, takie jak zachow7anie funkcjonalne i wydajność. Ma ven (http://maven.apache.org/) Apache Maven to oprogramowanie przeznaczone do zarządzania pro jektem. Pomaga w7 zarządzaniu kompilacją, raportami i dokumentacją. Nemo (http://nemo.sonarqube.org/) Nemo to internetowa wersja platformy SonarQube dedykowana projek tom typu open source. PMD (http://pmd.sourceforge.net/) PMD skanuje kod źródłowy Javy pod kątem błędówv, nieoptymalnego kodu, a także przesadnie skomplikowanych wyrażeń. SonarQube (http://www.sonarqube.org/) SonarQube to platforma open source przeznaczona do zarządzania jakością. Subversion (http://subversion.apache.org/) Apache Subversion to scentralizowany system kontroli w7ersji, któiy śle dzi wszelkie modyfikacje w7prowradzane w7plikach.
Opracowywan e, CM narzędz a testowań a
|
181
Biblioteki ActiveMQ (http://activemci.apache.org/) Apache ActiveMQ to tak zwany message broker-, któiy potrafi obsługi wać wiele protokołów i klientów7 niezależnie od używanego języka pro gramowania. BIR T (http://www.eclipse.org/birt/) BIRT to oprogramowanie typu open source, oparty na Eclipse system raportowania przeznaczony do użycia wraz z aplikacjami Java EE. Camel (http://camel.apache.org/) Apache Camel to silnik kierowania komunikatów na podstawie zde finiowanych reguł w różnych językach programowania. Ili bernate (http:/lhibernate.org/) Hibemate to framework odpowiedzialny za realizację warstwy dostępu do danych oraz obsługę zapytań. Pozwala na opracowywanie klas prze znaczonych do trwałego przechowywania danych. iText (http://itextpdf.com/) iText to biblioteka Javy pozwalająca na tworzenie dokumentów w for macie PDF i operowanie nimi. Jakarta Commons (http://commons.apache.org/) Jakarta Commons to repozytorium możliwych do wielokrotnego użycia komponentów7 Jawy. Jackrabbit (http://jackrabbit.apache.org/) Apache Jackrabbit to system repozytorium treści pozw7alający na prze chowywanie i kontrolow7anie treści w7postaci hierarchicznej. JasperReports {http://community.jaspersoft.com/project/jasperreports-library) JasperReports to dostępny jako oprogramoivanie typu open source silnik raportow7ania dla Javy. Jasypt (http://www.jasypt.org/) Jasypt to biblioteka Javy pozw7alająca programiście na dodaw7anie pod stawvowych funkcji z zakresu szyfrow7ania. JFreeChart (http://www.jfree.org/jfreechart/) JFreeChart to biblioteka Javy przeznaczona do generow7ania wykresów7. JFXtras2 (http://jfxtras.org/) JFXtras2 to zestaw7kontrolek i dodatków dla JavaFX 2.0.
182
|
Dodatek B Narzędz a f rm trzeć ch
J Goodies (http://iounv.jgoodies.com/) JGoodies oferuje komponenty i rozwiązania przeznaczone do stosowania w najczęściej wykonywanych zadaniach związanych z interfejsem użyt kownika. JID E (http://zvzvw.jidesoft.com/) Oprogramowanie JIDE oferuje dostęp do różnych komponentów Java i Swing. J Monkey Engine (http://jmonkeyengine.org/) JMonkeyEngine to kolekcja bibliotek dostarczających Javie silnik gier 3D (OpenGL). JO G L (https://jogamp.org/jogl/zoww/) JOGL to API Javy przeznaczone do obsługi specyfikacji OpenGL i ES. jO O Q (http://zozvw.jooq.org/) jOOQ to API Fluent przeznaczone do przygotowania zapytań SQL cha rakteryzujących się bezpiecznym typem. API pozwala również na wyko nywanie wspomnianych zapytań. opencsv (http://opencsv.sourceforge.net/) opencsv to opracowana dla Javy biblioteka przeznaczona do przetwarzania danych w formacie CSV (ang. comma-separated mlues), czyli w7artości rozdzielonych przecinkami. POI (http://poi.apache.org/) Apache POI (ang. Poor Obfuscation Implementation) to biblioteka przezna czona do odczytu i zapisu danych w7 formatach Microsoft Office. RXTX (http://users frii.com/jarvi/rxtxD RXTX zapewTiia Ja vie rodzimą komunikację szeregową i równoległą. Framework Spring (http://spring.ioD Spring to obsługujący w7arstwy framework przeznaczony do tworzenia aplikacji Java i Java EE.
Środow iska IDE BlueJ (http://zvww.bluej.orgD BlueJ to środowisko IDE zaprojektowane z myślą o początkujących.
Środow ska DE
| 183
Eclipse IDE {http://www.eclipse.org/) Eclipse IDE to środowisko IDE typu open source przeznaczone do two rzenia aplikacji biurowych, mobilnych i sieciowych. Greenfoot (http://www.greenfoot.org/) Greenfoot to proste środowisko IDE zaprojektowrane z myślą o nauce programowania zorientowanego obiektomvo w Javie. IntelliJ IDEA (http://www.jetbrains.com/idea/) IntelliJ IDEA to komercyjne środowisko IDE przeznaczone do hv or że nią aplikacji biurowych, mobilnych i sieciowych. JBuilder (http://www.embarcadero.com/products/jbuilder) J Builder to komercyjne środowisko IDE przeznaczone do tworzenia aplikacji biurowych, mobilnych i sieciowych. JCreator (http://www.jcreator.com/) JCreator to komercyjne środowisko IDE przeznaczone do tworzenia aplikacji biurowych, mobilnych i sieciowych. JDeveloper (http://www.oracle.com/technetwork/developertools/jdev/overview/index h tml) JDeveloper to opracowane przez Oracle środowisko IDE przeznaczone do tworzenia aplikacji biurowych, mobilnych i sieciowych. NetBeans IDE (https://netbeans.org/) NetBeans to opracowane przez Oracle i udostępnione jako open source środowisko IDE przeznaczone do tworzenia aplikacji biurowych, mobil nych i sieciowych.
Platform y aplikacji sieciow ych G eronimo (http://geronimo.apache.org/) Apache Gerónimo to sen ver Java EE przeznaczony dla aplikacji, por tali i usług sieciowych. G lassfish (https://glassfiśh .java .net/) Glassfish to udostępniony jako oprogramowanie typu open source ser wer Java EE przeznaczony dla aplikacji, portali i usług sieciowych. IBM W ebSphere (http://www-01.ibm.com/software/websphere/) IBM WebSphere to komercyjny serwer Java EE przeznaczony dla aplika cji, portali i usług sieciowych.
184
|
Dodatek B Narzędz a f rm trzeć ch
JavaServer Faces (https://jcp.org/en/jsr/detail?id=314) Technologia JavaServer Faces ułatwia tworzenie interfejsu użytkownika dla aplikacji serwera Javy. Implementacje JSF i zestawy komponentów7 obejmują między innymi Apache MyFaces, ICEFaces, RichFaces i Primefaces. Jetty (http://www.eclipse.org/jetty/) Jetty to kontener sieciowy dla Java Servlets i JavaServer Pages. Oracle WebLogic Application Server (http://www.oracle.com/us/products/middleware/ cloud-app-foundation/weblogic/overview/index htm\) Oracle WebLogic Application Server to komercyjny serwer Java EE prze znaczony dla aplikacji, portali i usług sieciowych. Resin (http://caucho.com/) Resin to zapewniający wysoką wydajność i zoptymalizowany pod kątem chmury serwer aplikacji Javy. ServiceMix (http://xircles.codehaus.org/projects/servicemix) Apache ServiceMix to korporacyjna magistrala usług (ang. enterprise service bus) łącząca wTsobie funkcjonalność architektury zorientow7anej na usługi (ang. Service-Oriented Architecture, SO A) oraz archi tektmy opartej na zdarzeniach (ang. Event-Driven Architecture, EDA). Rozwiązanie Service Mix zostało zbudow7ane na bazie specyfikacji JBI (ang. Java Business Integration). Sling (http://sling.apache.org/) Sling to framework aplikacji sieciowych pozw7alający na wykorzystanie architektury oprogramowania w7 stylu REST (ang. Representational State Transfer). Struts (http://struts.apache.org/) Apache Struts to framework przeznaczony do tworzenia przygotowa nych pod kątem przedsiębiorstwv aplikacji sieciowych Jawy wvykorzystujących architekturę MVC (ang. model-view-controller). Tapestry (http://tapestry.apache.org/) Apache Tapestry to framework przeznaczony do tworzenia aplikacji sieciowvych opartych na API JawTa Serwdet. Tomcat (http://tomcat.apache.org/) Apache Tomcat to kontener siedowvy dla JawTa Servlets i Jaw7aSerw7er Pages.
Platformy apl kacj s ec owych
| 185
TomEE (http://tomee.apache.orgD Apache TomEE to certyfikowany stos Apache Java EE 6 Web Profile. WildFly (http://wzvw.wildfly.orgD WildFly to produkt oficjalnie znany pod nazwą JBoss Application Server, udostępniony jako oprogramowanie typu open source serwer Java EE, przeznaczony dla aplikacji, portali i usług sieciowych.
Języki skryptow e zgodne ze specyfikacją JSR 223 BeanShell (http://zmvw.beanshell.orgD BeanShell to osadzony interpreter kodu źródłowego Javy wraz z opar tymi na obiektach funkcjami języka skryptowego. Cloj ure (http://clojure.orgD Clojure to dynamiczny język programowania przeznaczony dla wirtu alnej maszyny Javy, środowiska uruchomieniowego wspólnego języka (ang. Common Language Runtime, CLR) oraz silników JavaScript. FreeMarker (http://freemarkei .orgD FreeMarker to ogólnego przeznaczenia silnik szablonów oparty na Javie. Groovy (http://gioovy.codehaus.orgD Groovy to język skryptowy oferujący wiele funkcji znanych z innych języków programowania (między innymi Pythona, Ruby i Smalltalk) udostępnianych w7postaci składni Javy. Jacl (http://tcljava.sourceforge.net/docs/website/index.html) Jacl to przygotow7ana całkowicie w Javie implementacja języka skryptowego Tcl. JEP (http://zvww.singularsys.com/jepD JEP (ang. Java Math Expression Parser) to biblioteka Ja^y przeznaczona do przetwarzania i obliczania wyrażeń matematycznych. Jawk (http://jawk.sourceforge.netD Jaw7k to przygotowrana całkowicie w Javie implementacja języka skryp towego AWK. Jelly (http://commons.apache.org/proper/commons-jellyD Jelly to narzędzie skryptowe przeznaczone do zamiany XML na kod wykonywalny.
186
|
Dodatek B Narzędz a f rm trzeć ch
JRuby (http://jruby.org/) JRuby to przygotowana całkowicie w Javie implementacja języka pro gramowania Ruby. Jython (http://jython .org/) Jython to przygotowana całkowicie w Javie implementacja języka pro gramowania Python. Nashorn (http://openjdk.java.net/projects/nashorn/) Nashorn to implementacja języka skryptowego JavaScript. To jest jedyny język skryptowy, którego silnik znajduje się domyślnie w API skryp towym Javy. Scala (http://zvzow.scala-lang.org/) Scala to ogólnego przeznaczenia język programomvania zaprojektow7any w celu wyrażania najczęściej używanych wzorców programistycznych w sposób spójny, elegancki i zapewmiający bezpieczeństwa typówv Sleep (http://sleep.dashnine.org/) Sleep to oparty na Perlu osadzony język skryptowy przeznaczony dla aplikacji Javy. Velocity (http://velocity.apache.org/) Apache Velociy to ogólnego przeznaczenia silnik szablonów7 oparty na Javie. Visage (https://code.google.eom/p/visage/) Visage to język specjalizowTany (ang. Domain Specific Language, DSL) opracow7any w7 celu tw7orzenia interfejsu użytkowrnika.
Język skryptowe zgodne ze specyf kacją JSR 223
|
187
188
|
Dodatek B Narzędz a f rm trzeć ch
DODATEK C
Podstawy UML
Zunifikowany język modelowania (ang. Unified Modeling Language, UML) ^\ykorzystuje notację graficzną do tworzenia abstrakcji modelu systemu. Omawiany tutaj język jest rozwijany przez grupę The Object Management Group (ihttp://wurw.uml.org/). Znajduje zastosowanie również w programach Javy i umożliwia przedstawienie w sposób graficzny na przykład relacji lub sekwencji klas. Najnowszą wersję specyfikacji UML można znaleźć na witrynie OMG (ihttp://www.omg.org/spec/UML/Cu7rent/). Warta uwagi książka poświęcona temu językowi to UML Distilled, Third Edition, napisana przez Martina Fowlera i wydana przez Addison-Wesley (2003).
Diagram klas Diagram klasy przedstawia statyczną strukturę systemu, wyświetla infor macje o klasach i relacjach zachodzących między nimi. Diagram klasy jest podzielony na trzy części: nazwa, atrybuty (opcjonalnie) i operacje (opcjo nalnie). Na rysunku C .l pokazano przykładowy diagram.
Orchestra
-
— Nazwa klasy
- orchName: String - instrCount: Integer [*] = 7
Atrybuty (zmienne składowe)
-ł- setOrchName (String) H- play (s: Score): Boolean
Operacje (funkcje składowe)
-
Rysunek C .l. Diagram klasy
189
// Odpowiedni segment kodu przedstawiony w diagramie. c la s s O rche stra { / / Nazwa klasy. / / Atrybuty. p riv a te S t r in g orchName; p riv a te In te g e r in strC o u n t = 7; // Operacje. p u b lic vo id setO rchNam e(String name) { . . . } p u b lic Boolean pi ay(Sco re s) { . . . }
}
N azw a Część zawierająca nazwę jest wymagana i zawiera zapisaną pogrubioną czcionką nazwę klasy lub interfejsu.
Atrybuty Część zawierająca atrybuty jest opcjonalna i zawiera zmienne składowe przedstaw ziające stan obiektu. Sposób użycia w UML jest następujący: widoczność nazwa : typ [ ilo ś ć ] = wartośćDomyślna {c ią g -te k sto w y -w ? a ściw o ści}
Zwykle podaje się jedynie nazwę atiybutu i jego typ.
Operacje Część zawierająca operacje jest opcjonalna i zawiera funkcje składowe przed stawiające zachowanie systemu. Sposób użycia w UML jest następujący: widoczność nazwa (1 ista-param etrów ) : typ -zw ro tny-w yraże nia ’-► {cią g -te k s to w y -w ta ś c iw o ś c i}
Zwykle podaje się jedynie nazwę operacji i listę parametrów. —
Na element {ciąg-tekstowy-właściwości} mogą składać się dowolne z wielu dostępnych właściwości, takie jak {ordered} lub {read-only}.
*%
-
W idoczność Dla modyfikatorów dostępu może być opcjonalnie zdefiniowany wskaźnik widoczności (symbol prefiksu). Wspomniane wskaźniki (patrz tabela C .l) można stosow ać względem zmiennych i funkcji składowych wr diagramie klasy.
190
|
Dodatek C Podstawy UML
Tabela C.l. Wskaźniki widoczności Wskaźn k w docznośc
Modyf kator dostępu package private p rotected p riv a te
Diagram obiektu Diagram obiektu odróżnia się od diagramu klasy przez podkreślenie tekstu w części przedstawiającej nazwę obiektu. Sam tekst może być wyświetlony na trzy różne sposoby wymienione w tabeli C.2. Tabela C.2. Nazwy obiektu Składn a nazwy
Op s
: NazwaKlasy
Tylko nazwa klasy
nazwaObiektu
Tylko nazwa obiektu
nazwaObiektu : NazwaKlasy
Nazwa obiektu i klasy
Diagramy obiektów nie są zbyt często stosowane, ale mogą być niezwykle użyteczne dzięki dostarczaniu szczegółowych informacji, jak pokazano na rysunku C.2.
Nazwa obiektu Nazwy atrybutów
mvOrch: Orchestra orchName = "BR Orchestra'" instrCount = 7
— Nazwa klasy Wartości atr/butów
Rysunek C.2. Diagram obiektu
G raficzne przedstaw ienie ikony Ikony graficzne to podstawowe bloki budulcowre wr diagramach UML, jak pokazano na rysunku C.3.
Graf czne przedstaw en e kony
|
191
Rysunek C.3. Graficzne przedstawienie ikony
Klasy, klasy abstrakcyjne i interfejsy Klasy, klasy abstrakcyjne i interfejsy są przedstawiane w postaci umieszczo nej w prostokącie ich nazwy zapisanej czcionką pogrubioną. Nazwa klasy abstrakcyjnej jest dodatkowo pochylona. Interfejs jest poprzedzony słowem interface ujętym w znaki nazywane guillemet (« i »). Wymienione znaki guillemet przechowują stereotyp, a w7 przypadku interfejsu dodatkowo kla syfikację.
Uwagi Uwagi są komentarzami umieszczonymi w prostokącie z zawiniętym jednym rogiem. Uwragi mogą być pojedyncze lub połączone ze sobą za pomocą przerywanych linii.
Pakiety Pakiet jest przedstawiany za pomocą ikony przypominającej teczkę z aktami. Nazwa pakietu jest wyświetlona w większym prostokącie, o ile nie będzie on zajęty przez inne elementy graficzne (na przykład ikonę klasy). W tym drugim przypadku nazwa pakietu zostanie umieszczona w7 mniejszym pro stokącie. Otwarta strzałka narysow7ana przeryw7aną linią przedstawia zależ ności pakietu. Strzałka zawsze jest skierowana w stronę pakietu wymagającego spełnie nia zależności. Przykład diagramu pakietu pokazano na rysunku C.4.
192
|
Dodatek C Podstawy UML
java.util.concurrent 7N i
com.oreilly.ensemble Klarnecista
___
\
Orkiestra
Rysunek C .4 . Diagram pakietu
Łączniki Łączniki to obrazy graficzne przedstawiające powiązania między klasami. Ich dokładniejsze omówienie znajdziesz w dalszej części dodatku.
W skaźniki ilości Wskaźniki ilości określają, ile obiektów uczestniczy w danym powiązaniu (patrz tabela C.3). Tego rodzaju wskaźniki są zwykle umieszczone obok łącznika, a ponadto mogą być używane jako część zmiennej składowej we fragmencie przedstawiającym atrybuty. Tabela C .3 . Wskaźniki ilości Wskaźn k
Op s
*
Ze o lub więcej obiektów
0 .. *
Ze o lub więcej obiektów
0 .. 1
Opcjonalny (ze o lub jeden obiekt)
o. . n
Od ze a do n obiektów gdzie n > 1
l
Dokładnie jeden obiekt
l .. *
Jeden lub więcej obiektów
l ••n
Od jednego do n obiektów gdzie n > 1
m.. n
Wskazany zak es obiektów
n
Tylko n obiektów gdzie n > 1
Wskaźn k lośc
| 193
N azw y ról Nazwy ról są stosowane, gdy zachodzi konieczność dokładniejszego wyja śnienia relacji między klasami. W nazwach ról bardzo często pojawiają się wskaźniki ilości. Na rysunku C.5 pokazano, że klasa orkiestry (Orchestra) wykonuje partyturę (Score) jeden lub więcej razy.
Rysunek C.5. Nazwy ról
Relacje klas Relacje między klasami są przedstawiane przez użycie łączników i diagra mów7 klas, jak pokazano na rysunku C.6. Ikony graficzne, wskaźniki ilości i nazwy ról również można wykorzystać podczas prezentacji relacji klas.
Rysunek C.6. Relacje klas
194
|
Dodatek C Podstawy UML
Asocjacja Asocjacja wskazuje relację między klasami i może być stosowana dwukie runkowo. Atrybuty klasy i wskaźnik ilości mogą znajdować się po stronie docelowej.
Asocjacja bezpośrednia Asocjacja bezpośrednia, nazywana również nawigacyjnością, to relacja prowa dząca od klasy źródłowej do klasy docelowej. Przykład tego rodzaju aso cjacji bezpośredniej jest następujący: „Orkiestra ma klarnecistę". Atrybuty klasy i wskaźnik ilości mogą znajdować się po stronie docelowej. Między klasami nawigacyjność może być dwukierunkowa.
Kom pozycja Kompozycja jest określana również mianem containmerit i przedstawia model relacji całość-część, gdzie całość zarządza cyklem życiowym części. Poszcze gólne części nie mogą istnieć, chyba że jako komponenty całości. To jest postać asocjacji silniejsza niż agregacja. Przykładem kompozycji może być: „Na wynik składa się... (jedna lub więcej części)".
Agregacja Agregacja przedstawia model relacji całość-część, gdzie poszczególne części mogą istnieć niezależnie od całości. Dlatego też całość nie wpływa na ist nienie poszczególnych części. Przykład agregacji przedstawia się następu jąco: „Orkiestra jest całością, a klarnecista to jeden z jej członków\7".
Pow iązanie tym czasow e Powiązanie tymczasowa, lepiej znane jako zależność, przedstawia model, w którym jedna klasa wymaga istnienia innej. Tego rodzaju relacja występuje również, gdy obiekt jest używ7any jako zmienna lokalna, w7artość zwrotna lub argument funkcji składow7ej. Przekazanie wartości częstotliwości meto dzie dostrajania klasy instrumentu (na przykład Cl ari net) można odczytać jako zależność klasy instrumentu (Clarinet) od klasy częstotliwości (Frequ '-►ency): „Instrument gra z częstotliwością abc".
Relacje klas
| 195
Generalizacje Generalizacja występuje, gdy klasa specjalizowana dziedziczy elementy po znacznie ogólniejszej klasie. W Javie nazywamy to dziedziczeniem — klasa rozszerza inną klasę. Powracając do przykładu orkiestry, można stwier dzić: „Klarnet to instrument dęty", czyli w tym przypadku klasa Clarinet rozszerza klasę Woodwind.
Realizacje Realizacja modeluje klasę implementującą interfejs, na przykład klasa Clarinet implementuje interfejs Instrument.
Diagram sekw encji Diagramy sekwencji w UML są używane w celu pokazania dynamicznych interakcji między obiektami (patrz lysunek C.7). Współpraca rozpoczyna się na górze diagramu i działa w kierunku dołu diagramu.
Rysunek C.7. Sekwencja diagramów
196
|
Dodatek C Podstawy UML
Uczestnik (1) Za uczestnikówv uznaje się obiekty.
Kom unikat „znalezio n y" (2) Komunikat „znaleziony" występuje, gdy nadawca nie jest przedstawiony w diagramie. Oznacza to, że nadawca pozostaje nieznany lub nie musi być umieszczony w danym diagramie.
Kom unikat synchroniczny (3) Komunikat synchroniczny jest używany, gdy źródło oczekuje, aż cel zakończy przetwarzanie komunikatu.
Kom unikat zw rotny (4) Komunikat zwrotny może opcjonalnie przedstawić wartość zwrotną, ale najczęściej nie jest stosowany w diagramie sekwencji.
Kom unikat asynchroniczny (5) Komunikat asynchroniczny jest używany, gdy źródło nie musi czekać, aż cel zakończy przetwarzanie komunikatu.
Kom unikat w ew nętrzny (6) Komunikat wewnętrzny oznacza komunikat, któiy obiekt wysyła sam do siebie.
Linia życia (7) Linie życia są przypisane poszczególnym obiektom i umieszczone pionow7o. Ponadto linie życia są powdązane z czasem, odczytywrane do dołu, a naj wcześniejsze zdarzenie jest umieszczane na górze strony.
D agram sekwencj
| 197
Belki aktyw acji (8) Belki aktywacji znajdują się na pionowej linii życia lub na innych belkach aktywacji. Wspomniana belka pokazuje, kiedy uczestnik (obiekt) jest aktywny w trakcie współpracy z innymi.
198
|
Dodatek C Podstawy UML
Skorowidz
XE, 1 6 9 -1 7 4
A adnotacja, 64, 65 ©Functionallnterface, 66 agregacja (UML), 195 alokacja pamięci, 52 API daty i godziny, 161-167 Fluent, 1 6 1 ,1 7 7 ,1 7 8 N IO .2 ,131-133 skryptow e, 155-159 archiwizacja program u Ja w , 111 argument classpath, 114 ASCH, 21, 22 asercje, 73 asocjacja (UML), 195 automatyczne pakowanie, 39, 40
B biblioteki API J a w SE, 93-103 CORBA, 100 RMI, 100 wspomagające programowanie w Javie, 182,183
blok, 68 catch, 80-83 finally, 80-83 try, 80-83 błędy, 77, 79
c camelCase, 17
D dane składowe, 54 definiowanie własnej klasy ^wyjątku, 84 deserializacja obiektu, 129 domknięcia, 169-174
E elementy leksykalne, 21-32 encje specjalne, 36, 37 encje zmiennoprzecinkowe, 35, 36
F Fluent, 177,178 formatowanie obiektów daty i godziny, 1 6 6 ,1 6 7
199
Framework Collections, 143-148 framework Generics, 149-154
G garbage collection, 115-122 generalizacja (UML), 196 granice, 151,152 GZIP, 1 29,130
H hermetyzacja, 53 hierarchia -wyjątku, 75 i
identyfikator}'-, 24 implementacje silnika skryptów, 155-157 inicjalizator statyczny, 62 interfejs Collection, 143 C om parator, 1 4 6 ,1 4 7 ,1 4 8 maszynowy, 1 64,1 6 5 Runnable, 136 ScriptEngine, 155 Serializable, 128 interfejsy, 63 funkcjonalne, 66 ogólnego przeznaczenia, 172, 173,174 specjalnego przeznaczenia, 171, 172 interpreter Javy, 109, 110
J JDBC, 166 JDK, 105,106 języki skryptowe zgodne ze specyfikacją JSR 223,186, 187 JRE, 105
200
|
Skorow dz
K kalendarz ISO, 162-164 klasa, 53, 54 abstrakcyjna, 60 BufferedlnputStream, 126 BufferedOutputStream, 126 BufferedReader, 124, 127 Collections, 1 4 5,146 DatalnputStream, 1 2 5 ,1 2 7 DataOutputStream, 126,128 DateTimeFormatter, 166 Executors, 140 Files, 132 FileWriter, 126 InputStream, 124 ObjectlnputStream, 129 ObjectOutputStream, 128 opakowująca, 39 OutputStream, 124 Path, 132 PrintWriter, 1 2 6,127 PushbacklnputStream, 126 Reader, 124 Thread, 135 ThreadPoolExecutor, 139 wejścia-wyjścia, 123-130 W riter, 124 ZipInputSteam, 129 ZipOutputStream, 129 klonowanie, 51, 52 kolekcje, 143 komentarze, 23 kompilator Javy, 1 0 8,109 kompozycja (UML), 195 konfiguracja języka skryptowego, 157 silnika skryptowego, 158 konstrukcja try-catch, 81 try-catch-finally, 82, 83 try-finally, 82 konstruktory, 56, 57
konwencje nazw, 17 konwersja m iędzy typami podstawowymi i odnośnikowymi, 47 typów7 odnośnikowych, 46, 47 kopiowranie typów7 odnośnikowych, 51, 52
L literał}7, 26, 28, 29 dla typów7 podstawowych, 33-35
M mechanizm CMS, 117 G l, 117 Parallel, 116 Parallel Compacting, 116 Serial, 116 metaadnotacja Retention, 65 metoda, 54-56 abstrakcyjna, 61 Duration.between(), 165 equals(), 49 finalize(), 122 getAnnotation(), 65 getM essage(), 85 getPriority(), 137 getState(), 137 interrupt(), 137 isAlive(), 137 islnterrupted(), 137 join(), 137 klasy Object dotycząca w7ątków7, 138 klasy Thread dotycząca w7ątków7, 137 lines(), 127 main(), 107 notifyO, 138 notifyAll(), 138
printf(), 60 printStackTrace(), 85 setPriority(int), 137 start(), 137 statyczna dotycząca w7ątków7, 138 statyczna, 62 toString(), 85 typu vararg, 59 w7ait(), 138 w7rite(), 128 w7ritelnt(), 126 modyfikator abstract, 89 default, 89 dostępu, 87, 88 final, 89 Javy, 87-90 native, 89 package-private, 88 private, 88 protected, 88 public, 88 static, 89 strictfp, 89 synchronized, 89 transient, 89 volatile, 89 moment, 166
N nadpisywanie metod, 56 narzędzia firm trzecich wspomagające programoA \Tanie w Ja vie, 179-187 javadoc, 112, 113 odmierzania czasu, 141 przeznaczone do zarządzania pamięcią, 117, 118 wdersza poleceń, 108-114 w7spółbieżności, 139-141
Skorow dz
| 201
NIO, 123 N IO .2 ,131-133 notacja duże 0 , 147
o
obiekt, 53, 54 obsługa wyjątków, 75-86 odczyt gniazda, 127, 128 odczyt plików, 124-126 okres, 165 OOP, Patrz programowanie zorientowane obiektowo operatory, 26 równości, 48 warunkowe, 38
p param etry typu, 151, 152 platforma aplikacji sieci oawych wspomagające programowanie w Javie, 184,185 Java SE, 93-103 pliki JAR, 1 11,112 podklasa, 57 pola, 54 polecenie, 67-74 assert, 73 break, 72 continue, 72 do-while, 71 for, 70 if else if, 69 if, 68 if-else, 69 iteracji, 70, 71 obsługi awyjątków, 74 puste, 68 retu rn, 73 SAwitch, 69 aw postaci Awyraienia, 67
202
|
Skorow dz
AwarunkoAwe, 68, 69 Awhile, 71 porÓAw nyw anie
ciągÓAw teks to awych, 49 typÓAw odnośnikoAwych, 48, 49 awyliczeń, 50 poAwiązanie tymczasoAwe (UML), 195 Przestrzeń M etaspace, 121 priorytety Awątku, 136, 137 programoAwanie AwieloAwątkoAwe, 135 zorientoAwane obiektoAwo, 53-66 prom ocja liczboAwa, 37 przeciążanie m etod, 55
R realizacja (UML), 196 rozpakoAwyAwanie, 40
s SAM, 66 sekw encje sterujące, 30 separator}'-, 25 serializacja obiektu, 128 silniki skryptoAwe, 155-159 s Ioawo kluczoAwe, 24 abstract, 60 extends, 57 final, 62 static, 62 super, 58 synchronize, 138 synchronized, 73 this, 58 throAW, 80 stale statyczne, 62 stany Awątku, 137 statyczne dane składoAwe, 61 stos, 121 zm iana Awielkości stosu Awirtualnej maszyny JaAy, 121,122
struktura program u w Jawie, 106-108 strumienie danych wejściowych i wyjściowych, 124, 125 superJdasa, 57 synchronizacja, 138, 139 synchronizator, 141 System .err, 124 Systemin, 123 System.out, 124
ś środom\7isk a IDE, 183,184
w wTartość domyślna, 44 wTątki, 135-142 weryfikacja silnika skryptom\7ego, 158 współbieżne kolekcje, 141 współbieżność, 135-142 wyjątek, 75 wyjątki niespraw7dzane, 76-79 spraw7dzane, 76-78 m\yliczenia, 63 m\yrażenia lambda, 169-174
x
T tablice, 45, 46 TimeUnit, 141,142 tokeny, 21-32 tworzenie archiwum ZIP i rozpakomvymvanie plikom\7, 1 2 9,130 typy generyczne, specjalizacja, 153 odnośnikom \7e, 43-52 podstam\7om\Te, 33-41 a typy odnośnikom \7e, 44 proste, 33-41
U UML, 189-198 diagram klas, 189-191 diagram obiektu, 191 diagram pakietu, 192, 193 diagram sekwencji, 196, 197 relacje klas, 194-196 Unicode, 21 symbole w7alut, 31, 32 usuwanie nieużytkom\7, 115-122 opcje w7 -wierszu poleceń, 118-120
XSD, 166
Z zapis gniazda, 127, 128 pliku, 124-126 zarządzanie pamięcią, 115-122 zasada zastępoA\7ania, 151 ZIP, 129 zmienne egzemplarza, 44, 54 zmienne lokalne, 44 znaki ASCE, 22, 23 A\7ieloznaczne, 151,152 Zunifikom\7any język modelom\7ania, Patrz UML
Skorow dz
| 203