java. przygotowanie do programowania na platformę android...java.lang, java.lang.ref i java.math....

74

Upload: others

Post on 24-Jun-2020

19 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano
Page 2: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

Tytuł oryginału: Learn Java for Android Development

Tłumaczenie: Daniel Kaczmarek (wstęp, rozdz. 1 – 7, dod. A)Aleksander Lamża (rozdz. 8 – 10, dod. A)

ISBN: 978-83-246-3372-2

Original edition copyright © 2010 by Jeff “JavaJeff” Friesen.All rights reserved.

Polish edition copyright © 2012 by Helion S.A.All rights reserved.

All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher.

Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji.

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli.

Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce.

Pliki z przykładami omawianymi w książce można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/jappan.zip

Wydawnictwo HELIONul. Kościuszki 1c, 44-100 GLIWICEtel. 32 231 22 19, 32 230 98 63e-mail: [email protected]: http://helion.pl (księgarnia internetowa, katalog książek)

Drogi Czytelniku!Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/jappanMożesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.

Printed in Poland.

• Kup książkę• Poleć książkę • Oceń książkę

• Księgarnia internetowa• Lubię to! » Nasza społeczność

Page 3: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

Spis tre�ci

O autorze ....................................................................................................11

O recenzencie technicznym .........................................................................12

Wprowadzenie ...........................................................................................13

Rozdzia� 1. Pierwsze kroki w j�zyku Java .....................................................................17Czym jest Java? ....................................................................................................................... 17

Java jest językiem programowania ............................................................................... 18Java jest platformą .......................................................................................................... 19Java SE, Java EE, Java ME i Android ............................................................................ 21

Instalacja i poznawanie możliwości JDK ........................................................................... 22Instalacja i poznawanie możliwości dwóch najpopularniejszych środowisk IDE ....... 27

Zintegrowane środowisko programistyczne NetBeans ............................................. 28Zintegrowane środowisko programistyczne Eclipse ................................................. 32

Gra karciana Kareta ............................................................................................................... 35Reguły gry w Karetę ........................................................................................................ 36Model gry Kareta w pseudokodzie ............................................................................... 36Przekształcenie pseudokodu na kod języka Java ........................................................ 38Kompilowanie, uruchamianie i udostępnianie aplikacji FourOfAKind ................ 51

Podsumowanie ....................................................................................................................... 55

Rozdzia� 2. Podstawy j�zyka Java .................................................................................57Klasy ......................................................................................................................................... 57

Deklarowanie klas ........................................................................................................... 58Pola .................................................................................................................................... 59Metody .............................................................................................................................. 73Konstruktory ................................................................................................................... 91Inne konstrukcje inicjalizujące ..................................................................................... 93Interfejs a implementacja .............................................................................................. 98

Obiekty .................................................................................................................................. 102Tworzenie obiektów i tablic ........................................................................................ 102Uzyskiwanie dostępu do pól ....................................................................................... 104Wywoływanie metod .................................................................................................... 106Odśmiecanie .................................................................................................................. 109

Podsumowanie ..................................................................................................................... 111

Page 4: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

6

Rozdzia� 3. Mechanizmy j�zyka zorientowane obiektowo ..........................................115Dziedziczenie ........................................................................................................................ 115

Rozszerzanie klas .......................................................................................................... 116Najwyższa klasa przodka ............................................................................................. 121Kompozycja ................................................................................................................... 130Problemy z dziedziczeniem implementacji .............................................................. 130

Wielopostaciowość .............................................................................................................. 134Rzutowanie w górę i późne wiązanie ......................................................................... 135Klasy i metody abstrakcyjne ........................................................................................ 138Rzutowanie w dół i identyfikacja typów w fazie wykonania .................................. 140Kowariantne typy zwracanych wartości .................................................................... 142

Interfejsy ................................................................................................................................ 144Deklarowanie interfejsów ............................................................................................ 144Implementowanie interfejsów .................................................................................... 145Rozszerzanie interfejsów .............................................................................................. 149Po co używać interfejsów? ........................................................................................... 150

Podsumowanie ..................................................................................................................... 156

Rozdzia� 4. Zaawansowane mechanizmy j�zyka — cz��� I .........................................157Typy zagnieżdżone .............................................................................................................. 157

Statyczne klasy składowe ............................................................................................. 157Niestatyczne klasy składowe ....................................................................................... 160Klasy anonimowe .......................................................................................................... 164Klasy lokalne .................................................................................................................. 166Interfejsy wewnątrz klas ............................................................................................... 168

Pakiety ................................................................................................................................... 169Czym są pakiety? ........................................................................................................... 169Instrukcja pakietu ......................................................................................................... 171Instrukcja importu ........................................................................................................ 171Wyszukiwanie pakietów i typów ................................................................................ 172Korzystanie z pakietów ................................................................................................ 174Pakiety i pliki JAR ......................................................................................................... 178

Importy statyczne ................................................................................................................ 178Wyjątki .................................................................................................................................. 180

Czym są wyjątki? ........................................................................................................... 181Reprezentowanie wyjątków w kodzie źródłowym ................................................... 181Rzucanie wyjątków ....................................................................................................... 185Obsługa wyjątków ......................................................................................................... 188Wykonywanie czynności sprzątających .................................................................... 192

Podsumowanie ..................................................................................................................... 198

Rozdzia� 5. Zaawansowane mechanizmy j�zyka — cz��� II ........................................199Asercje ................................................................................................................................... 199

Deklarowanie asercji .................................................................................................... 200Korzystanie z asercji ..................................................................................................... 201Unikanie korzystania z asercji .................................................................................... 207Włączanie i wyłączanie asercji .................................................................................... 207

Page 5: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

SPIS TRE�CI

7

Adnotacje .............................................................................................................................. 208Działanie adnotacji ....................................................................................................... 209Deklarowanie typów adnotacji i wstawianie adnotacji do kodu źródłowego ...... 212Przetwarzanie adnotacji ............................................................................................... 216

Mechanizmy ogólne ............................................................................................................ 218Kolekcje i potrzeba bezpieczeństwa typologicznego ............................................... 219Typy ogólne ................................................................................................................... 221Metody ogólne ............................................................................................................... 232

Typy wyliczeniowe .............................................................................................................. 233Problem z tradycyjnymi typami wyliczeniowymi .................................................... 234Enum — alternatywa dla tradycyjnego typu wyliczeniowego ............................... 235Klasa Enum .................................................................................................................... 240

Podsumowanie ..................................................................................................................... 244

Rozdzia� 6. Podstawowe interfejsy API — cz��� I .......................................................247Interfejsy API do wykonywania obliczeń matematycznych .......................................... 247

Klasy Math i StrictMath ............................................................................................... 247Klasa BigDecimal .......................................................................................................... 254Klasa BigInteger ............................................................................................................ 259

Informacje na temat pakietów ........................................................................................... 263Podstawowe klasy opakowujące ........................................................................................ 267

Klasa Boolean ................................................................................................................ 268Klasa Character ............................................................................................................. 270Klasy Float i Double ..................................................................................................... 271Klasy Integer, Long, Short i Byte ................................................................................ 275Klasa Number ................................................................................................................ 277

API References ..................................................................................................................... 277Podstawowe pojęcia ...................................................................................................... 277Klasy Reference i ReferenceQueue ............................................................................. 279Klasa SoftReference ...................................................................................................... 280Klasa WeakReference ................................................................................................... 283Klasa PhantomReference ............................................................................................. 284

Podsumowanie ..................................................................................................................... 288

Rozdzia� 7. Podstawowe interfejsy API — cz��� II ......................................................289API Reflection ...................................................................................................................... 289Zarządzanie ciągami znaków ............................................................................................. 297

Klasa String .................................................................................................................... 298Klasa StringBuffer ......................................................................................................... 301

Klasa System ......................................................................................................................... 304API Threading ...................................................................................................................... 307

Interfejs Runnable i klasa Thread ............................................................................... 307Synchronizacja wątków ................................................................................................ 317

Podsumowanie ..................................................................................................................... 333

Rozdzia� 8. Biblioteka kolekcji ....................................................................................335Przegląd biblioteki ............................................................................................................... 335

Interfejs Comparable kontra Comparator ................................................................ 336

Page 6: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

8

Interfejsy Iterable i Collection ........................................................................................... 338Iterator i nowa pętla for ............................................................................................... 341Automatyczne pakowanie i rozpakowywanie .......................................................... 342

Interfejs List .......................................................................................................................... 344Klasa ArrayList .............................................................................................................. 348Klasa LinkedList ............................................................................................................ 349

Interfejs Set ........................................................................................................................... 351Klasa TreeSet ................................................................................................................. 351Klasa HashSet ................................................................................................................ 353Klasa EnumSet .............................................................................................................. 356

Interfejs SortedSet ................................................................................................................ 358Interfejs Queue ..................................................................................................................... 365

Klasa PriorityQueue ..................................................................................................... 366Interfejs Map ........................................................................................................................ 369

Klasa TreeMap .............................................................................................................. 373HashMap ........................................................................................................................ 374Klasa IdentityHashMap ............................................................................................... 380Klasa WeakHashMap ................................................................................................... 382Klasa EnumMap ............................................................................................................ 383

Interfejs SortedMap ............................................................................................................. 384Narzędzia .............................................................................................................................. 387Klasyczne klasy kolekcji ...................................................................................................... 389Podsumowanie ..................................................................................................................... 396

Rozdzia� 9. Dodatkowe biblioteki klas narz�dziowych ...............................................397Narzędzia wspomagające współbieżność ......................................................................... 397

Wykonawcy ................................................................................................................... 397Synchronizatory ............................................................................................................ 406Współbieżne kolekcje ................................................................................................... 408Blokady ........................................................................................................................... 410Zmienne atomowe ........................................................................................................ 413

Internacjonalizacja ............................................................................................................... 414Lokalizatory ................................................................................................................... 414Paczki zasobów .............................................................................................................. 416Iteratory operujące na tekście ..................................................................................... 425Porównywanie tekstów — klasa Collator .................................................................. 429Daty, strefy czasowe i kalendarze ............................................................................... 430Formatery ....................................................................................................................... 436

Biblioteka klas preferencji .................................................................................................. 443Generowanie liczb pseudolosowych ................................................................................. 446Wyrażenia regularne ........................................................................................................... 449Podsumowanie ..................................................................................................................... 460

Rozdzia� 10. Operacje wej�cia-wyj�cia ..........................................................................463Klasa File ............................................................................................................................... 463Klasa RandomAccessFile .................................................................................................... 474Strumienie ............................................................................................................................. 485

Przegląd klas strumieni ................................................................................................ 485Klasy OutputStream i InputStream ............................................................................ 487

Page 7: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

SPIS TRE�CI

9

Klasy ByteArrayOutputStream i ByteArrayInputStream ....................................... 489Klasy FileOutputStream i FileInputStream .............................................................. 491Klasy PipedOutputStream i PipedInputStream ....................................................... 494Klasy FilterOutputStream i FilterInputStream ......................................................... 497Klasy BufferedOutputStream i BufferedInputStream ............................................. 504Klasy DataOutputStream i DataInputStream ........................................................... 505Serializacja i deserializacja obiektów .......................................................................... 508Klasa PrintStream ......................................................................................................... 519

Klasy Writer i Reader .......................................................................................................... 523Przegląd klas Writer i Reader ...................................................................................... 524Klasy bazowe Writer i Reader ..................................................................................... 524Klasy OutputStreamWriter i InputStreamReader ................................................... 525Klasy FileWriter i FileReader ...................................................................................... 529

Podsumowanie ..................................................................................................................... 540Na tym nie koniec ......................................................................................................... 541

Dodatek A Odpowiedzi do �wicze� ............................................................................543Rozdział 1. Pierwsze kroki w języku Java ......................................................................... 543Rozdział 2. Podstawy języka Java ...................................................................................... 548Rozdział 3. Mechanizmy języka zorientowane obiektowo ............................................ 551Rozdział 4. Zaawansowane mechanizmy języka — część I ........................................... 558Rozdział 5. Zaawansowane mechanizmy języka — część II .......................................... 564Rozdział 6. Podstawowe interfejsy API — część I ........................................................... 569Rozdział 7. Podstawowe interfejsy API — część II ......................................................... 572Rozdział 8. Biblioteka kolekcji ........................................................................................... 578Rozdział 9. Dodatkowe biblioteki klas narzędziowych .................................................. 583Rozdział 10. Operacje wejścia-wyjścia .............................................................................. 589

Skorowidz .................................................................................................601

Page 8: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano
Page 9: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

R O Z D Z I A � 6

Podstawowe interfejsy API— cz��� I

Poważni programiści aplikacji dla systemu Android muszą gruntownie znać najważniejszeinterfejsy API języka Java. Z kilkoma API mieliśmy już do czynienia, dość wspomnieć klasyObject i String oraz hierarchię klas Throwable. W tym rozdziale przedstawimy kolejne pod-stawowe interfejsy API przeznaczone do wykonywania obliczeń matematycznych, opero-wania na pakietach i typach podstawowych, a także mechanizm odśmiecania.

� Uwaga • W rozdziale 6. zostan� opisane podstawowe klasy i interfejsy API zlokalizowane w pakietachjava.lang, java.lang.ref i java.math.

Interfejsy API do wykonywaniaoblicze� matematycznychW rozdziale 2. zaprezentowano operatory +, -, *, / i % języka Java przeznaczone do wyko-nywania najważniejszych operacji matematycznych na wartościach typów podstawowych.Java udostępnia także klasy przeznaczone do wykonywania operacji trygonometrycznychi innych zaawansowanych działań, precyzyjnej prezentacji wartości pieniężnych oraz obsługibardzo długich liczb całkowitych wykorzystywanych do szyfrowania algorytmem RSA (http://pl.wikipedia.org/wiki/RSA_(kryptografia)) i w innych kontekstach.

Klasy Math i StrictMathKlasa java.lang.Math deklaruje stałe typu double o nazwach E i PI, które reprezentują od-powiednio podstawę logarytmu naturalnego (2,71828…) oraz stosunek obwodu okręgu dojego średnicy (3,141519…). Stała E jest inicjalizowana wartością 2,718281828459045, nato-miast stała PI ma wartość 3,141592653589793. W klasie Math zadeklarowane są także wybra-ne metody klasy, przeznaczone do wykonywania różnego rodzaju działań matematycznych.W tabeli 6.1 opisano większość dostępnych metod.

Page 10: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

248

Tabela 6.1. Metody klasy Math

Metoda Opis

double abs(double d) Zwraca wartość bezwzględną liczby d. Istnieją cztery przypadkiszczególne: abs(-0.0) = +0.0, abs(+nieskoczono��) = +nieskoczono��,abs(-nieskoczono��) = +nieskoczono�� oraz abs(NaN) = NaN.

float abs(float f) Zwraca wartość bezwzględną liczby f. Istnieją cztery przypadkiszczególne: abs(-0.0) = +0.0, abs(+nieskoczono��) = +nieskoczono��,abs(-nieskoczono��) = +nieskoczono�� oraz abs(NaN) = NaN.

int abs(int i) Zwraca wartość bezwzględną liczby i. Istnieje jeden przypadek szczególny:wartością bezwzględną Integer.MIN_VALUE jest Integer.MIN_VALUE.

long abs(long l) Zwraca wartość bezwzględną liczby l. Istnieje jeden przypadekszczególny: wartością bezwzględną Long.MIN_VALUE jest Long.MIN_VALUE.

double acos(double d) Zwraca arcus cosinus kąta d z przedziału od 0 do PI. Istnieją trzyprzypadki szczególne: acos(warto�� > 1) = NaN, acos(warto�� < -1) =NaN oraz acos(NaN) = NaN.

double asin(double d) Zwraca arcus sinus kąta d z przedziału od –PI/2 do PI/2. Istnieją trzyprzypadki szczególne: asin(warto�� > 1) = NaN, asin(warto�� < -1) =NaN oraz asin(NaN) = NaN.

double atan(double d) Zwraca arcus tangens kąta d z przedziału –PI/2 do PI/2. Istnieje pięćprzypadków szczególnych: atan(+0.0) = +0.0, atan(-0.0) = -0.0,atan(+nieskoczono��) = +PI/2, atan(-nieskoczono��) = -PI/2 orazatan(NaN) = NaN.

double ceil(double d) Zwraca najmniejszą wartość (najbliższą minus nieskończoności),która nie jest mniejsza od d i jest liczbą całkowitą. Istnieje sześćprzypadków szczególnych: ceil(+0.0) = +0.0, ceil(-0.0) = -0.0,ceil(warto�� > -1.0 oraz < 0.0) = -0.0, ceil(+nieskoczono��) =+nieskoczono��, ceil(-nieskoczono��) = -nieskoczono�� oraz ceil(NaN)= NaN.

double cos(double d) Zwraca cosinus kąta d (wyrażonego w radianach). Istnieją trzy przypadkiszczególne: cos(+nieskoczono��) = NaN, cos(-nieskoczono��) = NaNoraz cos(NaN) = NaN.

double exp(double d) Zwraca liczbę Eulera e podniesioną do potęgi d. Istnieją trzy przypadkiszczególne: exp(+nieskoczono��) = + nieskoczono��, exp(-nieskoczono��) = +0.0 oraz exp(NaN) = NaN.

double floor(double d) Zwraca największą wartość (najbliższą plus nieskończoności), któranie jest większa od d i jest liczbą całkowitą. Istnieje pięć przypadkówszczególnych: floor(+0.0) = +0.0, floor(-0.0) = -0.0,floor(+nieskoczono��) = +nieskoczono��, floor(-nieskoczono��)= -nieskoczono�� oraz floor(NaN) = NaN.

double log(double d) Zwraca logarytm naturalny (przy podstawie e) z liczby d. Istnieje sześćprzypadków szczególnych: log(+0.0) = - nieskoczono��, log(-0.0)= - nieskoczono��, log(warto�� < 0) = NaN, log(+nieskoczono��)= +nieskoczono��, log(-nieskoczono��) = NaN oraz log(NaN) = NaN.

Page 11: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

ROZDZIA� 6. � PODSTAWOWE INTERFEJSY API — CZ�� I

249

Tabela 6.1. Metody klasy Math — ciąg dalszy

Metoda Opisdouble log10(double d) Zwraca logarytm przy podstawie 10 z liczby d. Istnieje sześć

przypadków szczególnych: log10(+0.0) = -nieskoczono��, log10(-0.0)= -nieskoczono��, log10(warto�� < 0) = NaN, log10(+nieskoczono��) =+nieskoczono��, log10(-nieskoczono��) = NaN oraz log10(NaN) = NaN.

double max(double d1,double d2)

Zwraca największą (najbliższą plus nieskończoności) spośród liczb d1i d2. Istnieją cztery przypadki szczególne: max(NaN, warto��) = NaN,max(warto��, NaN) = NaN, max(+0.0, -0.0) = +0.0 oraz max(-0.0, +0.0)= +0.0.

float max(double f1,double f2)

Zwraca największą (najbliższą plus nieskończoności) spośród liczb f1i f2. Istnieją cztery przypadki szczególne: max(NaN, warto��) = NaN,max(warto��, NaN) = NaN, max(+0.0, -0.0) = +0.0 oraz max(-0.0, +0.0) = +0.0.

int max(int i1, int i2) Zwraca największą (najbliższą plus nieskończoności) spośród liczb i1 i i2.long max(long l1, long l2) Zwraca największą (najbliższą plus nieskończoności) spośród liczb l1 i l2.double min(double d1,double d2)

Zwraca najmniejszą (najbliższą minus nieskończoności) spośród liczbd1 i d2. Istnieją cztery przypadki szczególne: min(NaN, warto��) = NaN,min(warto��, NaN) = NaN, min(+0.0, -0.0) = -0.0 oraz min(-0.0, +0.0) = -0.0.

float min(float f1,float f2)

Zwraca najmniejszą (najbliższą minus nieskończoności) spośród liczbf1 i f2. Istnieją cztery przypadki szczególne: min(NaN, warto��) = NaN,min(warto��, NaN) = NaN, min(+0.0, -0.0) = -0.0 oraz min(-0.0, +0.0) = -0.0.

int min(int i1, int i2) Zwraca najmniejszą (najbliższą minus nieskończoności) spośródliczb i1 i i2.

long min(long l1, long l2) Zwraca najmniejszą (najbliższą minus nieskończoności) spośródliczb l1 i l2.

double random() Zwraca liczbę pseudolosową z przedziału prawostronnie otwartegood 0,0 (włącznie) do 1,0.

long round(double d) Zwraca wynik zaokrąglenia liczby d do długiej liczby całkowitej. Wynikjest równoważny wynikowi wyrażenia (long) Math.floor(d+0.5).Istnieje siedem przypadków szczególnych: round(+0.0) = +0.0, round(-0.0)= +0.0, round(warto�� > Long.MAX_VALUE) = Long.MAX_VALUE, round(warto��< Long.MIN_VALUE) = Long.MIN_VALUE, round(+nieskoczono��) = Long.MAX_�VALUE, round(-nieskoczono��) = Long.MIN_VALUE oraz round(NaN) = +0.0.

int round(float f) Zwraca wynik zaokrąglenia liczby f do liczby całkowitej. Wynik jestrównoważny wynikowi wyrażenia (long) Math.floor(f+0.5). Istniejesiedem przypadków szczególnych: round(+0.0) = +0.0, round(-0.0) = +0.0,round(warto�� > Integer.MAX_VALUE) = Integer.MAX_VALUE, round(warto��< Integer.MIN_VALUE) = Integer.MIN_VALUE, round(+nieskoczono��) =Integer.MAX_VALUE, round(-nieskoczono��) = Integer.MIN_VALUE orazround(NaN) = +0.0.

double signum(double d) Zwraca znak liczby d jako liczbę –1,0 (jeżeli d jest mniejsze od 0,0), liczbę0,0 (jeżeli d jest równe 0,0) lub 1,0 (jeżeli d jest większe niż 0,0). Istniejepięć przypadków szczególnych: signum(+0.0) = +0.0, signum(-0.0) = -0.0,signum(+nieskoczono��) = +1.0, signum(-nieskoczono��) = -1.0 orazsignum(NaN) = NaN.

Page 12: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

250

Tabela 6.1. Metody klasy Math — ciąg dalszy

Metoda Opisfloat signum(float f) Zwraca znak liczby f jako liczbę –1,0 (jeżeli f jest mniejsze od 0,0),

liczbę 0,0 (jeżeli f jest równe 0,0) lub 1,0 (jeżeli f jest większe niż 0,0).Istnieje pięć przypadków szczególnych: signum(+0.0) = +0.0, signum(-0.0) = -0.0, signum(+nieskoczono��) = +1.0, signum(-nieskoczono��) =-1.0 oraz signum(NaN) = NaN.

double sin(double d) Zwraca sinus kąta d (wyrażonego w radianach). Istnieje pięćprzypadków szczególnych: sin(+0.0) = +0.0, sin(-0.0) = -0.0,sin(+nieskoczono��) = NaN, sin(-nieskoczono��) = NaN oraz sin(NaN) = NaN.

double sqrt(double d) Zwraca pierwiastek kwadratowy liczby d. Istnieje pięć przypadkówszczególnych: sqrt(+0.0) = +0.0, sqrt(-0.0) = -0.0, sqrt(warto�� < 0)= NaN, sqrt(+nieskoczono��) = +nieskoczono�� oraz sqrt(NaN) = NaN.

double tan(double d) Zwraca tangens kąta d (wyrażonego w radianach). Istnieje pięć przypadkówszczególnych: tan(+0.0) = +0.0, tan(-0.0) = -0.0, tan(+nieskoczono��) =NaN, tan(-nieskoczono��) = NaN oraz tan(NaN) = NaN.

double toDegrees (doubleangrad)

Przekształca miarę kąta angrad z radianów na stopnie za pomocąwyrażenia angrad*180/PI. Istnieje pięć przypadków szczególnych:toDegrees(+0.0) = +0.0, toDegrees(-0.0) = -0.0, toDegrees(+nieskoczono��)= +nieskoczono��, toDegrees(-nieskoczono��) = -nieskoczono�� oraztoDegrees(NaN) = NaN.

double toRadians(angdeg)

Przekształca miarę kąta angdeg ze stopni na radiany za pomocąwyrażenia angdeg/180*PI. Istnieje pięć przypadków szczególnych:toRadians(+0.0) = +0.0, toRadians(-0.0) = -0.0, toRadians(+nieskoczono��)= +nieskoczono��, toRadians(-nieskoczono��) = -nieskoczono�� oraztoRadians(NaN) = NaN.

W tabeli 6.1 przedstawiono obszerny zbiór metod przydatnych do wykonywania działańmatematycznych. Na przykład każda metoda abs zwraca wartość bezwzględną (czyli liczbębez względu na znak) przekazanego do niej argumentu.

Metody abs(double) oraz abs(float) przydają się do bezpiecznego porównywania liczbzmiennopozycyjnych o podwójnej precyzji oraz liczb zmiennopozycyjnych. Na przykładwyrażenie 0.3 == 0.1+0.1+0.1 ma wartość false, ponieważ liczba 0,1 nie ma dokładnej re-prezentacji. Wyrażenia te można jednak ze sobą porównać przy użyciu metody abs() i wartościtolerancji, która wskazuje akceptowalny poziom błędu. Na przykład wyrażenie Math.abs�(0.3-(0.1+0.1+0.1)) < 0.1 będzie już mieć wartość true, ponieważ bezwzględna różnicamiędzy 0.3 i 0.1+0.1+0.1 jest mniejsza niż wartość tolerancji 0,1.

We wcześniejszych rozdziałach przedstawiono inne metody klasy Math. Na przykładw rozdziale 2. zostały wykorzystane metody sin(), toRadians(), cos(), round(double) i random()tej klasy.

Jak widać na przykładzie aplikacji Lotto649 z rozdziału 5., funkcja random() (która zwra-ca liczbę wyglądającą na losową, choć w rzeczywistości jest wyznaczana przez określonąfunkcję matematyczną i dlatego jest tak naprawdę liczbą pseudolosową) przydaje się dosymulacji, gier i w innych zastosowaniach, w których potrzeba losowości. Najpierw jednak

Page 13: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

ROZDZIA� 6. � PODSTAWOWE INTERFEJSY API — CZ�� I

251

liczbę zwracaną przez random(), która należy do przedziału od 0,0 do prawie 1,0, trzeba ja-koś przekształcić do wartości bardziej przydatnej, na przykład należącej do przedziału od 0do 49 albo od –100 do 100. Na listingu 6.1 znajduje się metoda rnd(), przydatna do wyko-nywania tego typu przekształceń.

Listing 6.1. Przekształcanie wartości zwracanej przez random() do bardziej przydatnej wartościpublic static int rnd(int limit){ return (int) (Math.random()*limit);}

Metoda rnd() przekształca zwracaną przez random() liczbę zmiennopozycyjną o podwójnejprecyzji z przedziału od 0,0 do 1,0 do liczby całkowitej z przedziału od 0 do limit – 1.Na przykład rnd(50) zwróci liczbę całkowitą z przedziału od 0 do 49. Z kolei instrukcja-100+rnd(201) przekształci przedział od 0,0 do prawie 1,0 do przedziału od –100 do 100 przezdodanie odpowiedniej wartości przesunięcia i wykorzystanie odpowiedniej wartości limit.

� Ostrze�enie • Nie nale�y wykonywa� instrukcji (int) Math.random()*limit, poniewa� wyra�enieto zawsze bdzie mie� warto�� 0. W wyra�eniu u�amkowa liczba zmiennopozycyjna o podwójnej precy-zji z przedzia�u od 0,0 do 0,99999… najpierw jest rzutowana na liczb ca�kowit� 0 przez ucicie cz�ciu�amkowej, a nastpnie 0 jest mno�one przez limit, co w efekcie daje równie� 0.

W tabeli 6.1 opisano także przypadki szczególne, dotyczące najczęściej wartości+nieskończoność, –nieskończoność, +0.0, –0.0 i NaN (ang. Not a Number — wartość, któranie jest liczbą).

Wynikiem obliczeń zmiennopozycyjnych wykonywanych w języku Java mogą być war-tości +nieskończoność, –nieskończoność, +0.0, –0.0 i NaN, ponieważ Java w dużej mierzejest zgodna ze standardem IEEE 754 (http://pl.wikipedia.org/wiki/IEEE_754), który opisujesposób wykonywania obliczeń zmiennopozycyjnych. Poniżej przedstawiono okoliczności,w których pojawiają się wspomniane wartości specjalne:

� +nieskończoność jest zwracana jako wynik dzielenia liczby dodatniej przez 0,0.Na przykład instrukcja System.out.println(1.0/0.0); zwróci wartość Infinity.

� –nieskończoność jest zwracana jako wynik dzielenia liczby ujemnej przez 0,0.Na przykład instrukcja System.out.println(-1.0/0.0); zwróci wartość –Infinity.

� NaN jest zwracana jako wynik dzielenia 0,0 przez 0,0, wartość pierwiastka kwadrato-wego liczby ujemnej oraz wynik innych dziwnych operacji. Na przykład instrukcjeSystem.out.println(0.0/0.0); oraz System.out.println(Math.sqrt(-1.0)); zwra-cają wynik NaN.

� +0.0 jest zwracana jako wynik dzielenia liczby całkowitej przez +nieskończoność.Na przykład instrukcja System.out.println(1.0/(1.0/0.0)); zwróci wartość +0.0.

� -0.0 jest zwracana jako wynik dzielenia liczby ujemnej przez +nieskończoność.Na przykład instrukcja System.out.println(-1.0/(1.0/0.0)); zwróci wartość -0.0.

Page 14: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

252

Jeżeli wynikiem jakiegoś działania jest wartość specjalna +nieskończoność, –nieskoń-czoność lub NaN, wówczas całe wyrażenie ma zwykle taki sam wynik równy wartości spe-cjalnej. Na przykład wynikiem instrukcji System.out.println(1.0/0.0*20.0); jest Infinity.Jednak wyrażenie, w którym pojawia się wartość +nieskończoność lub –nieskończoność,może też zwrócić wartość NaN. Na przykład w wyrażeniu 1.0/0.0*0.0 najpierw pojawia się+nieskończoność (jako wynik wyrażenia 1.0/0.0), a następnie NaN (jako wynik wyrażenia+nieskończoność*0, 0).

Kolejna ciekawostka wiąże się z wartościami Integer.MAX_VALUE, Integer.MIN_VALUE,Long.MAX_VALUE oraz Long.MIN_VALUE. Każda z tych wartości jest klasą opakowującą typupodstawowego, która identyfikuje wartość maksymalną lub minimalną, jaka może być re-prezentowana przez typ podstawowy skojarzony z klasą.

Można się także zastanawiać, dlaczego nie istnieją przeciążone wersje metod abs(),max() i min(), które obsługują argumenty typu byte i short, czyli byte abs(byte b) oraz shortabs(short s). Wersje takie nie są jednak potrzebne, ponieważ ograniczone przedziały liczbcałkowitych typu byte i short sprawiają, że są one mało przydatne do wykonywania obliczeń.Jeżeli jednak metody takie są potrzebne, można skorzystać z implementacji przedstawionejna listingu 6.2.

Listing 6.2. Przeciążone metody byte abs(byte b) i short abs(short s)public static byte abs(byte b){ return (b < 0) ? (byte) -b : b;}public static short abs(short s){ return (s < 0) ? (short) -s : s;}public static void main(String[] args){ byte b = -2; System.out.println(abs(b)); // Wynik: 2 short s = -3; System.out.println(abs(s)); // Wynik: 3}

Rzutowania (byte) i (short) trzeba wykonać, ponieważ wyrażenie –b przekształca war-tość zmiennej b z typu byte na typ int, a wyrażenie –s przekształca wartość zmiennej s z ty-pu short na typ int. Z kolei rzutowania nie są potrzebne w wyrażeniach (b < 0) i (s < 0),ponieważ w tych przypadkach wartości b i s są automatycznie rzutowane do typu int przedporównaniem ich z wartością 0 typu int.

� Wskazówka • Brak wspomnianych wersji metod w klasie Math móg�by sugerowa�, �e typy bytei short nie s� zbyt przydatne w deklaracjach metod. Jednak typy te przydaj� si wówczas, gdy deklaruje sitablice, których elementy przechowuj� ma�e warto�ci (na przyk�ad warto�ci bajtowe w pliku binarnym).Gdyby tablica do przechowywania takich warto�ci zosta�a zadeklarowana jako typu int lub long,zmarnowa�oby si w ten sposób znaczn� ilo�� miejsca na stercie (a w skrajnym przypadku mog�oby todoprowadzi� do wyczerpania si pamici).

Page 15: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

ROZDZIA� 6. � PODSTAWOWE INTERFEJSY API — CZ�� I

253

Gdy w dokumentacji języka Java analizuje się informacje na temat pakietu java.lang,można natknąć się na klasę o nazwie StrictMath. Oprócz dłuższej nazwy, klasa wydaje sięidentyczna z klasą Math. Różnice między dwiema klasami można podsumować następująco:

� Metody klasy StrictMath zwracają identyczne wyniki na wszystkich platformach. Nato-miast metody klasy Math mogą zwracać nieco odmienne wartości, zależnie od platformy.

� Ponieważ StrictMath nie może używać elementów charakterystycznych dla konkret-nych platform, takich jak choćby koprocesor obliczeń matematycznych o zwiększonejprecyzji, implementacja klasy StrictMath może być mniej wydajna od implementacjiklasy Math.

W większości przypadków metody klasy Math mogą wywoływać swoje odpowiedniczkiz klasy StrictMath. Dwoma wyjątkami od tej reguły są metody toDegrees() i toRadians().Wprawdzie w obydwóch klasach obie metody mają taką samą implementację, lecz w na-główkach tych metod w klasie StrictMath występuje zastrzeżone słowo strictfp:

public static strictfp double toDegrees(double angrad)public static strictfp double toRadians(double angdeg)

Według Wikipedii (http://en.wikipedia.org/wiki/Strictfp) słowo zastrzeżone strictfpogranicza obliczenia zmiennopozycyjne w taki sposób, aby zapewnić przenośność. Słowo toumożliwia przenośność dzięki zapewnieniu jednolitej pośredniej reprezentacji liczb zmien-nopozycyjnych oraz w zakresie nadmiarów i niedomiarów (czyli generowania wartości zbytdużej lub zbyt małej w stosunku do ograniczeń reprezentacji).

� Uwaga • Zgodnie ze wspomnianym przed chwil� artyku�em z Wikipedii na temat s�owa zastrze�onegostrictfp klasa Math zawiera metod public static strictfp double abs(double); oraz innemetody strictfp. Jednak gdy w Javie 6 update 16 przeanalizuje si kod ród�owy tej klasy, oka�e si,�e nie ma w nim �adnego wyst�pienia s�owa strictfp. Jednak wiele metod klasy Math (na przyk�admetoda sin()) wywo�uje swoje odpowiedniczki z klasy StrictMath, które s� ju� zaimplementowanew bibliotece dla odpowiedniej platformy, a implementacje metod w tej bibliotece bazuj� ju� na strictfp.

Jeżeli słowo zastrzeżone strictfp nie jest obecne, wówczas obliczenia pośrednie nie sąograniczone do 32-bitowych i 64-bitowych reprezentacji zmiennopozycyjnych obsługiwanychprzez Javę. W zamian w obliczeniach można korzystać z szerszych reprezentacji (w szczególno-ści 128-bitowych) na tych platformach, które takie reprezentacje obsługują.

W przypadku reprezentacji wartości na 32 lub 64 bitach w trakcie obliczeń pośrednichmoże dojść do nadmiaru lub niedomiaru. Natomiast jeśli reprezentacja bazuje na większejliczbie bitów, prawdopodobieństwo wystąpienia nadmiaru lub niedomiaru się zmniejsza.

Ze względu na te różnice zapewnienie pełnej przenośności nie jest możliwe. Dlategosłowo zastrzeżone strictfp do pewnego stopnia wyrównuje te niespójności przez nałożeniewymagania, by na wszystkich platformach obliczenia pośrednie były wykonywane na repre-zentacji 32-bitowej lub 64-bitowej.

Gdy w deklaracji metody zostanie zawarte słowo zastrzeżone strictfp, będzie ono gwa-rantować, że wszystkie wykonywane w metodzie obliczenia zmiennopozycyjne zostaną wy-konane zgodnie z regułami zapewnienia precyzji. Słowo zastrzeżone strictfp można umieścić

Page 16: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

254

również w deklaracji klasy (na przykład public strictfp class FourierTransform), abyzapewnić, że wszystkie obliczenia zmiennopozycyjne wykonywane w ramach tej klasy będąprzeprowadzane z zapewnieniem właściwej precyzji.

� Uwaga • Klasy Math i StrictMath s� zadeklarowane jako final i dlatego nie mo�na ich rozszerza�.Ponadto w klasach tych znajduj� si deklaracje prywatnych, pustych i bezargumentowych konstrukto-rów, co powoduje, �e nie mo�na tworzy� ich instancji.

Klasy Math i StrictMath to przyk�ady tak zwanych klas narz�dziowych (ang. utility classes), poniewa�wyznaczaj� one obszar zarezerwowany dla sta�ych narzdziowych oraz metod narzdziowych (static).

Klasa BigDecimalW rozdziale 2. zdefiniowano klasę CheckingAccount z polem o nazwie balance. Zgodniez deklaracją pole balance jest typu int, a dodatkowo w kodzie źródłowym został umieszczonykomentarz, według którego pole balance reprezentuje liczbę złotych, jaką można wypłacićz konta. Alternatywnie można było wskazać, że pole balance zawiera liczbę groszy dostęp-nych do wypłaty.

Można zadać pytanie, dlaczego pole balance nie zostało zadeklarowane jako pole typudouble lub float. Dzięki temu w polu balance można by przechowywać na przykład wartość18,26 (18 złotych w części całkowitoliczbowej i 26 groszy w części ułamkowej). Pole balancenie zostało zadeklarowane jako typu float lub double z następujących względów:

� Nie wszystkie wartości zmiennopozycyjne, które mogą reprezentować kwoty pienięż-ne (w złotych i groszach), mogą być przechowywane w pamięci z odpowiednią precy-zją. Na przykład liczba 0.1 (która może oznaczać 10 groszy) nie posiada precyzyjnejreprezentacji w pamięci. Gdyby wykonano wyrażenie double total = 0.1; for (inti = 0; i < 50; i++) total += 0.1; System.out.println(total);, jego wynikiembyłaby wartość 5.099999999999998, a nie prawidłowa wartość 5.1.

� Wynik każdego obliczenia zmiennopozycyjnego musi zostać zaokrąglony do jednegogrosza. Jeżeli tak się nie stanie, w obliczeniach pojawią się drobne niedokładności,które w efekcie mogą spowodować, że ostateczny wynik będzie się znacznie różnił odprawidłowego. Wprawdzie klasa Math udostępnia dwie metody round(), za pomocąktórych można próbować zaokrąglać wyniki obliczeń do jednego grosza, lecz metodyte zaokrąglają wartości do najbliższych liczb całkowitych (czyli złotych).

Aplikacja InvoiceCalc z listingu 6.3 ilustruje obydwa wspomniane problemy. Jednakpierwszy z tych problemów nie jest aż tak poważny, ponieważ nie wpływa znacząco na do-kładność ostatecznego wyniku. Zdecydowanie bardziej istotny jest drugi problem, przezktóry wyniki obliczeń nie są zaokrąglane do jednego grosza.

Listing 6.3. Obliczanie zmiennopozycyjnej wartości faktury, które prowadzi do powstania błędówimport java.text.NumberFormat;

class InvoiceCalc{

Page 17: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

ROZDZIA� 6. � PODSTAWOWE INTERFEJSY API — CZ�� I

255

final static double DISCOUNT_PERCENT = 0.1; // 10% final static double TAX_PERCENT = 0.05; // 5% public static void main(String[] args) { double invoiceSubtotal = 285.36; double discount = invoiceSubtotal*DISCOUNT_PERCENT; double subtotalBeforeTax = invoiceSubtotal-discount; double salesTax = subtotalBeforeTax*TAX_PERCENT; double invoiceTotal = subtotalBeforeTax+salesTax; NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(); System.out.println("Suma: " + currencyFormat.format(invoiceSubtotal)); System.out.println("Rabat: " + currencyFormat.format(discount)); System.out.println("Suma po uwzgl�dnieniu rabatu: " + currencyFormat.format(subtotalBeforeTax)); System.out.println("Podatek: " + currencyFormat.format(salesTax)); System.out.println("��cznie: " + currencyFormat.format(invoiceTotal)); }}

Na listingu 6.3 wykorzystano klasę NumberFormat (z pakietu java.text) i jej metodę format(),aby sformatować wartość zmiennopozycyjną o podwójnej precyzji na postać wartości wa-lutowej. Więcej na temat klasy NumberFormat powiemy w rozdziale 9. Gdy uruchomi się aplika-cję InvoiceCalc, zwróci ona następujący wynik:

Suma: 285,36 z�Rabat: 28,54 z�Suma po uwzgl�dnieniu rabatu: 256,82 z�Podatek: 12,84 z���cznie: 269,67 z�

W wynikach działania aplikacji prawidłowo obliczone zostały kwoty sumy, rabatu, sumypo uwzględnieniu rabatu i podatku. Nieprawidłowo natomiast wskazana jest kwota łączna,której wartość wynosi 269,67 zamiast 269,66. Klient nie będzie skłonny zapłacić dodatko-wego grosza, mimo że zgodnie z regułami obliczeń zmiennopozycyjnych to właśnie kwota269,67 jest wartością prawidłową:

Suma: 285,36Rabat: 28,536Suma po uwzgl�dnieniu rabatu: 256,824Podatek: 12,8412��cznie: 269,6652

Źródłem problemu jest to, że po wykonaniu każdej operacji, a przed wykonaniem ope-racji następnej uzyskany wynik nie jest zaokrąglany do najbliższego grosza. W efekcie 0,024w liczbie 256,824 oraz 0,012 w liczbie 12,84 są uwzględniane także w kwocie końcowej,przez co metoda format() klasy NumberFormat zaokrągla kwotę końcową do wartości 269,67.

Java udostępnia rozwiązanie obydwóch problemów w postaci klasy java.math.BigDecimal.Jest to klasa niezmienna (to znaczy instancja klasy BigDecimal nie może być zmieniona),która reprezentuje liczbę dziesiętną o określonym znaku (na przykład 23,653) ze wskazanaprecyzją (liczbą cyfr) i odpowiednią skalą (czyli z uwzględnieniem liczby całkowitej wyzna-czającej liczbę cyfr po przecinku).

Page 18: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

256

W klasie BigDecimal zadeklarowano trzy wygodne stałe: ONE, TEN i ZERO. Każda z tychstałych jest odpowiednikiem wartości 1, 10 i 0 ze skalą zerową.

� Ostrze�enie • W klasie BigDecimal zadeklarowano kilka sta�ych, których nazwy zaczynaj� si od s�o-wa ROUND_. Sta�e te s� w wikszo�ci przestarza�e i powinno si ich unika�. To samo dotyczy metod publicBigDecimal divide(BigDecimal divisor, int scale, int roundingMode) oraz publicBigDecimal setScale(int newScale, int roundingMode), które s� nadal obecne w klasie, abyzagwarantowa� prawid�ow� kompilacj starszego kodu.

Klasa BigDecimal deklaruje ponadto kilka przydatnych konstruktorów i metod. Wybra-ne konstruktory i metody zostały opisane w tabeli 6.2.

Tabela 6.2. Konstruktory i metody klasy BigDecimal

Metoda OpisBigDecimal(int val) Inicjalizuje instancję klasy BigDecimal liczbą cyfr wskazywaną przez val

i skalą 0.BigDecimal(String val) Inicjalizuje instancję klasy BigDecimal dziesiętnym odpowiednikiem val.

Jako skalę ustawia liczbę cyfr po przecinku lub 0, jeżeli przecineknie występuje. Jeśli val będzie null, konstruktor rzuci wyjątekjava.lang.NullPointerException. Jeżeli reprezentacja val w postaci ciąguznaków będzie nieprawidłowa (na przykład będzie zawierała litery),konstruktor rzuci wyjątek java.lang.NumberFormatException.

BigDecimal abs() Zwraca nową instancję klasy BigDecimal, która zawiera bezwzględnąwartość wartości instancji bieżącej. Skala nowej instancji jest taka samajak skala instancji bieżącej.

BigDecimaladd(BigDecimal augend)

Zwraca nową instancję klasy BigDecimal, która zawiera sumę wartościbieżącej oraz argumentu przekazanego do konstruktora. Skala w nowejinstancji jest wyznaczana przez wartość większą spośród skali instancjibieżącej i skali instancji przekazanej jako argument. Jeżeli augend będzienull, metoda rzuci wyjątek NullPointerException.

BigDecimaldivide(BigDecimaldivisor)

Zwraca nową instancję klasy BigDecimal, która zawiera iloraz wartościbieżącej podzielonej i wartości argumentu. Skala nowej instancji toróżnica między skalą instancji bieżącej i skalą instancji przekazanej jakoargument. Skala ta może zostać odpowiednio dostosowana, jeżeli doprzedstawienia wyniku dzielenia potrzebna będzie większa liczba cyfr.Jeżeli divisor będzie null, metoda rzuci wyjątek NullPointerException,a jeżeli divisor będzie reprezentować wartość 0 lub wyniku dzielenianie będzie można zaprezentować precyzyjnie, metoda rzuci wyjątekjava.lang.ArithmeticException.

BigDecimalmax(BigDecimal val)

Zwraca this lub val, zależnie od tego, która z tych instancji posiada większąwartość. Jeżeli val będzie null, metoda rzuci wyjątek NullPointerException.

BigDecimalmin(BigDecimal val)

Zwraca this lub val, zależnie od tego, która z tych instancji posiadamniejszą wartość. Jeżeli val będzie null, metoda rzuci wyjątekNullPointerException.

Page 19: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

ROZDZIA� 6. � PODSTAWOWE INTERFEJSY API — CZ�� I

257

Tabela 6.2. Konstruktory i metody klasy BigDecimal — ciąg dalszy

Metoda OpisBigDecimalmultiply(BigDecimalmultiplicand)

Zwraca nową instancję klasy BigDecimal, która zawiera iloczyn wartościbieżącej i wartości instancji podanej jako argument. Skala nowej instancjijest sumą skali instancji bieżącej i instancji przekazanej jako argument.Jeżeli multiplicand jest null, metoda rzuci wyjątek NullPointerException.

BigDecimal negate() Zwraca nową instancję klasy BigDecimal, która zawiera wartość przeciwnądo wartości bieżącej. Skala nowej instancji jest taka sama jak skalainstancji bieżącej.

int precision() Zwraca precyzję bieżącej instancji klasy BigDecimal.BigDecimalremainder(BigDecimaldivisor)

Zwraca nową instancję klasy BigDecimal, która zawiera resztę z dzieleniawartości instancji bieżącej przez wartość instancji przekazanej jakoargument. Skala nowej instancji to różnica między skalą bieżącą i skaląargumentu. Skala ta może zostać odpowiednio dostosowana, jeżeli dowyświetlenia wyniku potrzeba będzie większej liczby cyfr. Jeżeli divisorbędzie null, metoda rzuci wyjątek NullPointerException, a jeśli divisorbędzie mieć wartość 0, metoda rzuci wyjątek ArithmeticException.

int scale() Zwraca skalę bieżącej instancji klasy BigDecimal.BigDecimal setScale(intnewScale, RoundingModeroundingMode)

Zwraca nową instancję klasy BigDecimal o wskazanej skali i trybiezaokrąglania. Jeżeli nowa skala jest większa niż skala dotychczasowa,wówczas do wartości, które były niewyskalowane, dodawane są zera.W takiej sytuacji nie potrzeba wykonywać zaokrąglania. Jeżeli nowaskala jest mniejsza niż skala dotychczasowa, wówczas usuwane sąostatnie cyfry. Jeżeli usuwane cyfry są inne niż zero, uzyskana w tensposób liczba niewyskalowana musi zostać zaokrąglona. Zaokrągleniewykonuje się w trybie zaokrąglania wskazanym jako argument. JeżeliroundingMode jest null, metoda rzuci wyjątek NullPointerException. Jeżelinatomiast roundingMode będzie mieć wartość RoundingMode.ROUND_UNNECESSARY,a ze względu na bieżącą skalę zaokrąglenie będzie potrzebne, metodarzuci wyjątek ArithmeticException.

BigDecimalsubtract(BigDecimalsubtrahend)

Zwraca nową instancję klasy BigDecimal, która zawiera wartość bieżącąpomniejszoną o wartość argumentu. Skala nowej instancji jest większąspośród skali bieżącej i skali argumentu. Jeżeli subtrahend będzie null,metoda rzuci wyjątek NullPointerException.

String toString() Zwraca ciąg znaków, który stanowi reprezentację bieżącej instancjiBigDecimal. Jeżeli to konieczne, zostanie użyta notacja naukowa.

W tabeli 6.2 wspomniano o typie RoundingMode wyznaczającym tryb zaokrąglania. Rounding�Mode to typ wyliczeniowy enum, który zawiera stałe odpowiadające różnorodnym trybomzaokrąglania. Stałe te opisano w tabeli 6.3.

Najlepszym sposobem oswojenia się z klasą BigDecimal jest zastosowanie jej w praktyce.Na listingu 6.4 wykorzystano tę klasę do wykonania prawidłowych obliczeń wartości na faktu-rze, którą przedstawiono wcześniej na listingu 6.3.

Page 20: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

258

Tabela 6.3. Stałe typu RoundingMode

Sta�a Opis

CEILING Zaokrągla w kierunku plus nieskończoności.DOWN Zaokrągla w kierunku zera.FLOOR Zaokrągla w kierunku minus nieskończoności.HALF_DOWN Zaokrągla w kierunku „bliższej liczby sąsiedniej”, chyba że odległość do liczb

sąsiednich jest taka sama — wówczas zaokrągla w dół.HALF_EVEN Zaokrągla w kierunku „bliższej liczby sąsiedniej”, chyba że odległość do liczb

sąsiednich jest taka sama — wówczas zaokrągla w stronę tej liczby sąsiedniej,która jest parzysta.

HALF_UP Zaokrągla w kierunku „bliższej liczby sąsiedniej”, chyba że odległość do liczbsąsiednich jest taka sama — wówczas zaokrągla w górę (o tym trybiezaokrąglania najczęściej uczy się w szkole).

UNNECESSARY Zaokrąglanie nie jest potrzebne, ponieważ wynik działania jest zawsze dokładny.UP Liczby dodatnie są zaokrąglane w kierunku plus nieskończoności, a liczby

ujemne są zaokrąglane w kierunku minus nieskończoności.

Listing 6.4. Obliczenia wartości na fakturze przy użyciu klasy BigDecimal, dzięki której unika siębłędów zaokrągleńclass InvoiceCalc{ public static void main(String[] args) { BigDecimal invoiceSubtotal = new BigDecimal("285.36"); BigDecimal discountPercent = new BigDecimal("0.10"); BigDecimal discount = invoiceSubtotal.multiply(discountPercent); discount = discount.setScale(2, RoundingMode.HALF_UP); BigDecimal subtotalBeforeTax = invoiceSubtotal.subtract(discount); subtotalBeforeTax = subtotalBeforeTax.setScale(2, RoundingMode.HALF_UP); BigDecimal salesTaxPercent = new BigDecimal("0.05"); BigDecimal salesTax = subtotalBeforeTax.multiply(salesTaxPercent); salesTax = salesTax.setScale(2, RoundingMode.HALF_UP); BigDecimal invoiceTotal = subtotalBeforeTax.add(salesTax); invoiceTotal = invoiceTotal.setScale(2, RoundingMode.HALF_UP); System.out.println("Suma: " + invoiceSubtotal); System.out.println("Rabat: " + discount); System.out.println("Suma po uwzgl�dnieniu rabatu: " + subtotalBeforeTax); System.out.println("Podatek: " + salesTax); System.out.println("��cznie: " + invoiceTotal); }}

W metodzie main() z listingu 6.4 najpierw tworzone są obiekty BigDecimal o nazwachinvoiceSubtotal i discountPercent, inicjalizowane wartościami odpowiednio 285.36 i 0.10.Wartość invoiceSubtotal jest mnożona przez discountPercent, a wynikowa instancja klasyBigDecimal tego mnożenia jest przypisywana zmiennej discount.

Na tym etapie zmienna discount ma wartość 28.5360. Jeśli nie liczyć ostatniego zera, war-tość ta jest taka sama jak wartość wynikowa wyrażenia invoiceSubtotal*DISCOUNT_PERCENT

Page 21: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

ROZDZIA� 6. � PODSTAWOWE INTERFEJSY API — CZ�� I

259

z listingu 6.3. Wartością, która powinna zostać przypisana zmiennej discount, jest 28.54.Aby rozwiązać ten problem jeszcze przed wykonaniem kolejnego obliczenia, w metodziemain() jest wywoływana metoda setScale() z następującymi argumentami:

� 2 — dwie cyfry po przecinku.� RoundingMode.HALF_UP — standardowy sposób zaokrąglania.

Gdy określona jest już odpowiednia skala i tryb zaokrąglania, metoda main() odejmujediscount od invoiceSubtotal, a instancję BigDecimal stanowiącą reprezentację uzyskanejróżnicy przypisuje zmiennej subtotalBeforeTax. Następnie na zmiennej subtotalBeforeTaxjest wywoływana metoda setScale(), aby odpowiednio zaokrąglić jej wartość przed wyko-naniem kolejnego obliczenia.

W kolejnym kroku main() tworzy obiekt klasy BigDecimal o nazwie salesTaxPercent,który zostaje zainicjalizowany wartością 0.05. Dalej subtotalBeforeTax zostaje przemnożo-na przez salesTaxPercent, a iloczyn jest przypisywany zmiennej salesTax. Na tej zmiennej,której typem jest BigDecimal, jest wywoływana metoda setScale(), aby odpowiednio za-okrąglić wartość reprezentowaną przez ten obiekt.

Po wykonaniu tej czynności main() dodaje salesTax do subtotalBeforeTax. Suma zo-staje przypisana zmiennej invoiceTotal, na której metoda setScale() dokonuje odpowiedniegozaokrąglenia. Na koniec wartości wszystkich obiektów klasy BigDecimal zostają przekazane dostandardowego wyjścia za pomocą metody System.out.println(), która wywołuje na każdymobiekcie ich metody toString(), aby uzyskać ciąg znaków reprezentujący wartości poszcze-gólnych instancji BigDecimal.

Gdy tak zmodyfikowana wersja aplikacji InvoiceCalc zostanie uruchomiona, uzyskamynastępujący wynik:

Suma: 285,36Rabat: 28,54Suma po uwzgl�dnieniu rabatu: 256,82Podatek: 12,84��cznie: 269,66

� Ostrze�enie • Klasa BigDecimal deklaruje konstruktor BigDecimal(double val), którego w miarmo�liwo�ci powinno si unika�. Konstruktor ten inicjalizuje instancj klasy BigDecimal warto�ci� przekazan�jako val, przez co w sytuacji gdy warto�� typu double nie mo�e zosta� przedstawiona jako warto�� dok�ad-na, tak utworzona instancja mo�e odzwierciedla� nieprawid�ow� reprezentacj warto�ci. Na przyk�ad wyni-kiem wywo�ania BigDecimal(0.1) jest instancja z warto�ci� 0.10000000000000000555111512�31257827021181583404541015625. Z kolei wywo�anie BigDecimal("0.1") daje w wyniku instancjz prawid�ow� warto�ci� 0.1.

Klasa BigIntegerKlasa BigDecimal przechowuje liczbę dziesiętną ze znakiem w postaci niewyskalowanejwartości ze skalą określoną przez 32-bitową liczbę całkowitą. Wartość niewyskalowana jestprzechowywana w instancji klasy java.math.BigInteger.

Page 22: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

260

Klasa BigInteger jest klasą niezmienną, która reprezentuje liczbę całkowitą ze znakiemo określonej precyzji. Wartość jest w tej klasie przechowywana w kodzie uzupełnień dodwóch (inaczej mówiąc, wszystkie bity są zamienione — jedynki na zera, a zera na jedynki— a do wyniku dodawana jest wartość 1, aby wynik był zgodny z kodem uzupełnień dodwóch używanym w typach języka Java: całkowitoliczbowym bajtowym, krótkim całkowi-toliczbowym, całkowitoliczbowym i długim całkowitoliczbowym).

� Uwaga • Wicej informacji na temat zapisu w kodzie uzupe�nie� do dwóch mo�na znale� w Wikipedii,na stronie pod adresem http://pl.wikipedia.org/wiki/Kod_uzupe%C5%82nie%C5%84_do_dw%C3%B3ch.

W klasie BigInteger są zadeklarowane trzy przydatne stałe o nazwach ONE, TEN i ZERO.Każda z tych stałych odpowiada instancji klasy BigInteger reprezentującej wartości odpo-wiednio 1, 10 i 0.

W klasie BigInteger jest zadeklarowana całkiem pokaźna liczba przydatnych konstruk-torów i metod. Kilka wybranych konstruktorów i metod przedstawiono w tabeli 6.4.

Najlepszym sposobem, aby oswoić się z klasą BigInteger, jest wypróbowanie jej w praktyce.Na listingu 6.5 wykorzystano klasę BigInteger do zaimplementowania metod factorial,aby porównać sposób ich działania.

Listing 6.5. Porównanie metod factorial()class FactComp{ public static void main(String[] args) { System.out.println(factorial(12)); System.out.println(); System.out.println(factorial(20L)); System.out.println(); System.out.println(factorial(170.0)); System.out.println(); System.out.println(factorial(new BigInteger("170"))); System.out.println(); System.out.println(factorial(25.0)); System.out.println(); System.out.println(factorial(new BigInteger("25"))); } public static int factorial(int n) { if (n == 0) return 1; else return n*factorial(n-1); } public static long factorial(long n) { if (n == 0) return 1; else return n*factorial(n-1); } public static double factorial(double n)

Page 23: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

ROZDZIA� 6. � PODSTAWOWE INTERFEJSY API — CZ�� I

261

Tabela 6.4. Konstruktory i metody klasy BigInteger

Metoda Opis

BigInteger(byte[] val) Inicjalizuje instancję klasy BigInteger liczbą całkowitą przechowywanąw tablicy val. Element val[0] tej tablicy zawiera osiem najbardziejznaczących (lewych) bitów. Jeżeli val będzie null, konstruktor rzuciwyjątek NullPointerException, natomiast jeśli val.length będzie miećwartość 0, konstruktor rzuci wyjątek NumberFormatException.

BigInteger(String val) Inicjalizuje instancję klasy BigInteger liczbą całkowitąodpowiadającą val. Jeżeli val będzie null, konstruktor rzuci wyjątekNullPointerException, a jeśli ciąg znaków reprezentujący val będzienieprawidłowy (na przykład będzie zawierać litery), wówczaskonstruktor rzuci wyjątek NumberFormatException.

BigInteger abs() Zwraca nową instancję klasy BigInteger, która zawiera wartośćbezwzględną wartości instancji bieżącej.

BigInteger add(BigIntegeraugend)

Zwraca nową instancję klasy BigInteger, która zawiera sumę wartościbieżącej oraz wartości przekazanej jako argument. Jeżeli augendbędzie null, metoda rzuci wyjątek NullPointerException.

BigIntegerdivide(BigInteger divisor)

Zwraca nową instancję klasy BigInteger, która zawiera ilorazwartości bieżącej podzielonej przez wartość przekazaną jakoargument. Jeżeli divisor jest null, metoda rzuci NullPointerException,natomiast jeśli divisor reprezentuje wartość 0 lub wynik dzielenianie jest wartością dokładną, metoda rzuci wyjątek ArithmeticException.

BigInteger max(BigIntegerval)

Zwraca this lub val zależnie od tego, która instancja klasyBigInteger zawiera większą wartość. Jeżeli val jest null, metodarzuci wyjątek NullPointerException.

BigInteger min(BigIntegerval)

Zwraca this lub val zależnie od tego, która instancja klasyBigInteger zawiera mniejszą wartość. Jeżeli val jest null, metodarzuci wyjątek NullPointerException.

BigIntegermultiply(BigIntegermultiplicand)

Zwraca nową instancję klasy BigInteger, która zawiera iloczynwartości bieżącej oraz wartości argumentu. Jeżeli multiplicandbędzie null, metoda rzuci NullPointerException.

BigInteger negate() Zwraca nową instancję klasy BigInteger, która zawiera wartośćprzeciwną do wartości bieżącej.

BigIntegerremainder(BigIntegerdivisor)

Zwraca nową instancję klasy BigInteger, która zawiera resztęz podzielenia wartości bieżącej przez wartość argumentu. Jeżelidivisor jest null, metoda rzuci wyjątek NullPointerException,natomiast jeżeli divisor reprezentuje wartość 0, metoda rzuciwyjątek ArithmeticException.

BigIntegersubtract(BigIntegersubtrahend)

Zwraca nową instancję klasy BigInteger, która zawiera wartośćbieżącą pomniejszoną o wartość argumentu. Jeżeli subtrahendbędzie null, metoda rzuci wyjątek NullPointerException.

String toString() Zwraca ciąg znaków stanowiący reprezentację instancji BigInteger.

Page 24: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

262

{ if (n == 1.0) return 1.0; else return n*factorial(n-1); } public static BigInteger factorial(BigInteger n) { if (n.equals(BigInteger.ZERO)) return BigInteger.ONE; else return n.multiply(factorial(n.subtract(BigInteger.ONE))); }}

Na listingu 6.5 porównano cztery wersje rekurencyjnej metody factorial(), której za-daniem jest wyliczanie silni. Porównanie to pozwala zidentyfikować największą wartość ar-gumentu, jaką można przekazać do pierwszych trzech metod, zanim metody te zacznązwracać nieprawidłowe wartości spowodowane przekroczeniem przedziału wartości po-prawnie reprezentowanych przez dany typ liczbowy.

W pierwszej wersji metody wykorzystywany jest argument typu int, a przedział wartościprzekazywanego argumentu wynosi od 0 do 12. Jeżeli do metody zostanie przekazany do-wolny argument większy od 12, wartości silni tego argumentu nie będzie już można zapre-zentować prawidłowo jako liczby typu int.

Przedział, do jakiego może należeć argument metody factorial(), można poszerzyć przezzmianę typu parametru na long. Przedział ten nie zwiększy się jednak znacząco. Po wprowadze-niu zmiany typu argumentu do metody będzie można przekazać wartość nie większą niż 20.

Aby jeszcze bardziej zwiększyć zakres obsługiwanych wartości, można zaimplementowaćmetodę factorial(), której parametr i zwracana wartość będą typu double. Jest to możliwe, po-nieważ za pomocą typu double można precyzyjnie reprezentować liczby całkowite. Jednak w ta-kim przypadku największym argumentem, jaki można przekazać do metody, jest 170.0. Każdawartość większa niż 170.0 spowoduje, że metoda factorial() zwróci plus nieskończoność.

Może się zdarzyć sytuacja, że konieczne będzie wyliczenie silni wartości większej niż 170— na przykład gdy będą wykonywane pewne obliczenia statystyczne uwzględniające kom-binacje lub permutacje. Jedyny sposób, który pozwoli na obliczanie takiej silni, polega naużyciu wersji metody factorial() wykorzystującej typ BigInteger.

Gdy aplikacja z listingu 6.5 zostanie uruchomiona, zwróci następujące wyniki:

479001600

2432902008176640000

7.257415615307994E306

7257415615307998967396728211129263114716991681296451376543577798900561843401706157852350749242617459511490991237838520776666022565442753025328900773207510902400430280058295603966612599658257104398558294257568966313439612262571094946806711205568880457193340212661452800000000000000000000000000000000000000000

1.5511210043330986E25

15511210043330985984000000

Page 25: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

ROZDZIA� 6. � PODSTAWOWE INTERFEJSY API — CZ�� I

263

Pierwsze trzy wartości to najwyższe wartości silni zwracane przez metody factorial(),w których wykorzystano odpowiednio typy int, long i double. Czwarta wartość reprezen-tuje wartość typu BigInteger, która odpowiada najwyższej wartości silni typu double.

Warto zauważyć, że metoda z typem double nie jest w stanie dokładnie zaprezentowaćwartości 170! (! to matematyczny symbol silni). Precyzja tej metody jest po prostu zbyt ma-ła. Wprawdzie metoda próbuje zaokrąglić najmniejszą cyfrę, lecz takie zaokrąglenie niezawsze się udaje — liczba kończy się cyframi 7994 zamiast 7998. Zaokrąglenie sprawdza sięjedynie w przypadkach argumentów nie większych niż 25.0, o czym świadczą dwa ostatniewiersze danych wynikowych.

� Uwaga • Algorytm szyfrowania RSA, klasa BigDecimal i obliczanie silni to praktyczne przyk�ady zasto-sowania klasy BigInteger. Klasy tej mo�na u�ywa� jednak tak�e w zastosowaniach niestandardowych. Naprzyk�ad w artykule opublikowanym w magazynie „JavaWorld” z lutego 2006 pod tytu�em Travel ThroughTime with Java (http://www.javaworld.com/javaworld/jw-02-2006/jw-0213-funandgames.html), którystanowi� kolejn� cz�� serii Java Fun and Games, zosta�a wykorzystana klasa BigInteger do przechowywa-nia obrazka w postaci bardzo du�ej liczby ca�kowitej. Pomys� polega� na tym, by poeksperymentowa�z klas� BigInteger i sprawdzi�, jak za jej pomoc� mo�na wyszukiwa� zdjcia ludzi i miejsc, które ist-nia�y w przesz�o�ci, bd� istnie� w przysz�o�ci lub nigdy nie istnia�y. Artyku� mo�na poleci� zw�aszczaprogramistom, którzy lubi� troch poszale�.

Informacje na temat pakietówKlasa java.lang.Package udostępnia informacje na temat pakietu (wstępne informacje natemat pakietów zostały przedstawione w rozdziale 4.). Informacje te dotyczą wersji imple-mentacji i specyfikacji pakietu języka Java, nazwy pakietu, a także wskazują, czy pakiet zo-stał upakowany (ang. sealed), czyli czy wszystkie klasy wchodzące w skład pakietu zostałyzarchiwizowane w tym samym pliku JAR.

� Uwaga • Pliki JAR zosta�y opisane w rozdziale 1.

W tabeli 6.5 opisano wybrane metody klasy Package.Na listingu 6.6 znajduje się kod źródłowy aplikacji PackageInfo, którą zaimplemento-

wano, aby zaprezentować działanie większości metod klasy Package z tabeli 6.5.

Listing 6.6. Uzyskiwanie informacji na temat pakietupublic class PackageInfo{ public static void main(String[] args) { if (args.length == 0) { System.err.println("u�ycie: java PackageInfo nazwaPakietu [wersja]"); return; } Package pkg = Package.getPackage(args[0]); if (pkg == null)

Page 26: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

264

Tabela 6.5. Metody klasy Package

Metoda Opis

String getImplementationTitle() Zwraca tytuł implementacji pakietu, który może być null.Format tytułu jest nieokreślony.

String getImplementationVendor() Zwraca nazwę sprzedawcy lub organizacji, która dostarczyłaimplementację pakietu. Nazwa ta może być null. Formatnazwy jest nieokreślony.

String getImplementationVersion() Zwraca numer wersji implementacji pakietu, który może byćnull. Ciąg reprezentujący numer wersji musi być sekwencjądodatnich dziesiętnych liczb całkowitych, oddzielonych odsiebie znakami kropki. Liczby te mogą mieć poprzedzającezera.

String getName() Zwraca nazwę pakietu w standardowym zapisie z kropkami,na przykład java.lang.

static Package getPackage(StringpackageName)

Zwraca obiekt klasy Package, który jest skojarzony z pakietemwskazywanym przez packageName. Jeżeli pakietu wskazywanegoprzez packageName nie można znaleźć, zwraca null. JeżelipackageName jest null, metoda zwraca NullPointerException.

static Package[] getPackages() Zwraca tablicę wszystkich obiektów klasy Package, które sądostępne dla kodu wywołującego.

String getSpecificationTitle() Zwraca tytuł specyfikacji pakietu, który może być null.Format tytułu jest nieokreślony.

String getSpecificationVendor() Zwraca nazwę sprzedawcy lub organizacji, która dostarczyłaspecyfikację zaimplementowaną w ramach pakietu. Nazwa tamoże być null. Format nazwy jest nieokreślony.

String getSpecificationVersion() Zwraca numer wersji specyfikacji implementacji pakietu,który może być null. Ciąg wskazujący numer wersji musi byćsekwencją dodatnich dziesiętnych liczb całkowitych oddzielonychod siebie znakami kropek. Liczby te mogą mieć poprzedzającezera.

boolean isCompatibleWith(Stringdesired)

Sprawdza, czy pakiet jest zgodny z podanym ciągiem wersji.W tym celu wersja specyfikacji pakietu jest porównywanaz wersją desired. Jeżeli numer wersji specyfikacji pakietu jestwyższy od pożądanego numeru wersji desired lub mu równy,metoda zwraca wartość true (co oznacza, że pakiet jest zgodny);w przeciwnym razie metoda zwraca wartość false. Jeżelidesired jest null, metoda rzuca wyjątek NullPointerException,a jeżeli numer wersji pakietu lub numer wersji desired niema formatu z kropkami, metoda rzuca wyjątekNumberFormatException.

boolean isSealed() Zwraca wartość true, jeżeli pakiet jest upakowany.W przeciwnym razie zwracana jest wartość false.

Page 27: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

ROZDZIA� 6. � PODSTAWOWE INTERFEJSY API — CZ�� I

265

{ System.err.println("Nie znaleziono pakietu " + args[0]); return; } System.out.println("Nazwa: " + pkg.getName()); System.out.println("Tytu� implementacji: " + pkg.getImplementationTitle()); System.out.println("Dostawca implementacji: " + pkg.getImplementationVendor()); System.out.println("Wersja implementacji: " + pkg.getImplementationVersion()); System.out.println("Tytu� specyfikacji: " + pkg.getSpecificationTitle()); System.out.println("Dostawca specyfikacji: " + pkg.getSpecificationVendor()); System.out.println("Wersja specyfikacji: " + pkg.getSpecificationVersion()); System.out.println("Upakowany: " + pkg.isSealed()); if (args.length > 1) System.out.println("Zgodny z wersj� " + args[1] + ": " + pkg.isCompatibleWith(args[1])); }}

Aby skorzystać z aplikacji, w wierszu poleceń należy podać przynajmniej nazwę pakietu.Na przykład polecenie java PackageInfo java.lang zwraca w wersji 6 języka Java następu-jące dane wynikowe:

Nazwa: java.langTytu� implementacji: Java Runtime EnvironmentDostawca implementacji: Sun Microsystems, Inc.Wersja implementacji: 1.6.0_16Tytu� specyfikacji: Java Platform API SpecificationDostawca specyfikacji: Sun Microsystems, Inc.Wersja specyfikacji: 1.6Upakowany: false

Aplikacja PackageInfo pozwala ustalić, czy specyfikacja pakietu jest zgodna z określo-nym numerem wersji. Pakiet jest zgodny ze swoimi poprzednikami.

Na przykład jeżeli aplikację wywoła się poleceniem java PackageInfo java.lang 1.6,zwróci ona wynik Zgodny z wersj� 1.6: true, podczas gdy aplikacja wywołana poleceniemjava PackageInfo java.lang 1.8 zwróci wynik Zgodny z wersj� 1.6: false.

Za pomocą aplikacji PackageInfo można także analizować pakiety utworzone samo-dzielnie. O tym, jak tworzy się własne pakiety, była już mowa w rozdziale 4. W przykładzie4. zaprezentowano przykładowy pakiet logging.

Plik PackageInfo.class należy skopiować do katalogu, w którym znajduje się katalog pa-kietu logging (w którym z kolei znajdują się skompilowane pliki klas). Następnie należywykonać polecenie java PackageInfo logging.

Aplikacja PackageInfo zwróci wówczas następujący wynik:

Nie znaleziono pakietu logging

Komunikat błędu jest zwracany dlatego, że metoda getPackage() wymaga załadowaniaz pakietu co najmniej jednego pliku klasy, zanim będzie mogła zwrócić obiekt klasy Packagez opisem pakietu.

Page 28: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

266

Jedynym sposobem, w jaki można wyeliminować powyższy komunikat błędu, jest załado-wanie klasy z pakietu. W tym celu kod z listingu 6.7 należy uwzględnić w kodzie z listingu 6.6.

Listing 6.7. Dynamiczne ładowanie klasy z pliku klasyif (args.length == 3)try{ Class.forName(args[2]);}catch (ClassNotFoundException cnfe){ System.err.println("nie mo�na za�adowa� " + args[2]); return;}

Powyższy fragment kodu należy wstawić przed instrukcją Package pkg = Package.get�Package(args[0]);. Kod ten ładuje plik klasy o nazwie wskazanej przez trzeci argumentwiersza poleceń aplikacji PackageInfo.

Gdy nową wersję aplikacji PackageInfo uruchomi się poleceniem java PackageInfo logging1.5 logging.File, zwróci ona dane wynikowe przedstawione poniżej. W poleceniu wywołują-cym jako klasę, którą aplikacja ma załadować, wskazano klasę File pakietu logging.

Nazwa: loggingTytu� implementacji: nullDostawca implementacji: nullWersja implementacji: nullTytu� specyfikacji: nullDostawca specyfikacji: nullWersja specyfikacji: nullUpakowany: falseException in thread "main" java.lang.NumberFormatException: Empty version string at java.lang.Package.isCompatibleWith(Unknown Source) at PackageInfo.main(PackageInfo.java:43)

Tak wiele wartości null w danych wynikowych nie powinno dziwić, ponieważ do pa-kietu logging nie dodano żadnych informacji. Dodatkowo metoda isCompatibleWith()rzuca wyjątek NumberFormatException, ponieważ pakiet logging nie zawiera numeru wersjispecyfikacji w zapisie z kropką (numer ten jest null).

Zapewne najprostszym sposobem umieszczenia informacji na temat pakietu w pakiecielogging jest utworzenie pliku logging.jar w sposób podobny do opisanego w rozdziale 4.Najpierw jednak trzeba utworzyć niewielki plik tekstowy, który będzie zawierać te informa-cje o pakiecie. Plik można nazwać dowolnie. Na listingu 6.8 została przedstawiona wersjapliku o nazwie manifest.mf.

Listing 6.8. Zawartość pliku manifest.mf z informacjami o pakiecieImplementation-Title: Implementacja mechanizmu rejestracjiImplementation-Vendor: Jeff FriesenImplementation-Version: 1.0aSpecification-Title: Specyfikacja mechanizmu rejestracjiSpecification-Vendor: Jeff "JavaJeff" FriesenSpecification-Version: 1.0Sealed: true

Page 29: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

ROZDZIA� 6. � PODSTAWOWE INTERFEJSY API — CZ�� I

267

� Uwaga • Nale�y pamita� o tym, by ostatni wiersz pliku (Sealed: true) zako�czy� naci�niciem klawiszaReturn lub Enter. W przeciwnym razie aplikacja zwróci prawdopodobnie warto�� Upakowany: false,poniewa� narzdzie jar pakietu JDK mo�e nie zapisa� w pakiecie logging odpowiadaj�cego temu pa-rametrowi wiersza z pliku manifestu. Potwierdza to powszechn� opini, �e narzdzie jar jest do�� kapry�ne.

Aby utworzyć plik JAR, który będzie zawierał pakiet logging i składające się na niegopliki oraz którego manifest, czyli specjalny plik MANIFEST.MF, będzie zawierał informacjena temat zawartości pliku JAR przedstawione na listingu 6.8, należy wykonać następującepolecenie:

jar cfm logging.jar manifest.mf logging

Powyższe polecenie utworzy plik JAR o nazwie logging.jar (o czym decyduje opcja c od-powiedzialna za utworzenie i opcja f, która mówi o pliku). Polecenie włączy także zawartośćpliku manifest.mf (dzięki opcji m jak manifest) do pliku MANIFEST.MF, który znajduje sięw katalogu META-INF pakietu.

� Uwaga • Aby dowiedzie� si wicej na temat manifestu pliku JAR, warto zapozna� si z punktem „JarManifest” na stronie „JAR File Specification” dokumentacji JDK (http://java.sun.com/javase/6/docs/technotes/guides/jar/jar.html#JAR%20Manifest).

Jeżeli narzędzie jar nie zwróci żadnych komunikatów o błędach, należy wykonać przed-stawione poniżej polecenie wiersza poleceń systemu Windows (lub wiersza systemu opera-cyjnego, który akurat jest używany). Polecenie to wykona aplikację PackageInfo i odczytainformacje na temat pakietu logging:

java -cp logging.jar;. PackageInfo logging 1.0 logging.File

Tym razem wynik działania aplikacji będzie następujący:

Nazwa: loggingTytu� implementacji: Implementacja mechanizmu rejestracjiDostawca implementacji: Jeff FriesenWersja implementacji: 1.0aTytu� specyfikacji: Specyfikacja mechanizmu rejestracjiDostawca specyfikacji: Jeff "JavaJeff" FriesenWersja specyfikacji: 1.0Upakowany: falseZgodny z wersj� 1.0: true

Podstawowe klasy opakowuj�cePakiet java.lang zawiera klasy Boolean, Byte, Character, Double, Float, Integer, Long i Short.Są to tak zwane podstawowe klasy opakowujące (ang. primitive wrapper classes), ponieważopakowują one wartości typów podstawowych.

� Uwaga • Podstawowe klasy opakowuj�ce s� równie� znane jako klasy warto�ci (ang. value classes).

Page 30: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

268

Java udostępnia osiem wspominanych podstawowych klas opakowujących z dwóch po-wodów:

� Platforma kolekcji (o której więcej powiemy w rozdziale 8.) udostępnia listy, zbioryi mapy, które mogą przechowywać jedynie obiekty, natomiast nie można w nich umiesz-czać wartości typów podstawowych. Wartość typu podstawowego umieszcza się w in-stancji podstawowej klasy opakowującej, a następnie tę instancję można umieścićw kolekcji.

� Podstawowe klasy opakowujące są kontenerami, w których można wygodnie skoja-rzyć stałe (na przykład MAX_VALUE i MIN_VALUE) i metody klas (takie jak metody parseInt()klasy Integer i metody isDigit(), isLetter() i toUpperCase() klasy Character) z typamipodstawowymi.

W tym punkcie opiszemy wszystkie podstawowe klasy opakowujące, a także klasę o na-zwie Number.

Klasa BooleanKlasa Boolean to najmniejsza spośród podstawowych klas opakowujących. Klasa ta dekla-ruje trzy stałe, z których dwie to stałe TRUE i FALSE, oznaczające predefiniowane obiekty klasyBoolean.

Klasa Boolean deklaruje także dwa konstruktory, które inicjalizują obiekty klasy:

� Boolean(boolean value) inicjalizuje obiekt klasy Boolean wartością value.� Boolean(String s) przekształca tekst przypisany parametrowi s na wartość true lub

false, a następnie umieszcza tę wartość w obiekcie klasy Boolean.

Drugi konstruktor porównuje wartość parametru s z wartością true. Ponieważ w po-równaniu tym nie bierze się pod uwagę wielkości liter, dowolna kombinacja czterech literskładających się na wartość true (czyli true, TRUE, tRue i tak dalej) zostanie umieszczonaw obiekcie. W przeciwnym razie w obiekcie zostanie umieszczona wartość false.

Uzupełnieniem dla konstruktorów klasy Boolean jest metoda boolean booleanValue(),która zwraca opakowaną wartość klasy Boolean.

Klasa Boolean deklaruje także lub pokrywa następujące metody:

� int compareTo(Boolean b), która porównuje bieżący obiekt klasy Boolean z parame-trem b, aby ustalić ich kolejność. Metoda zwraca wartość 0, jeżeli bieżący obiekt za-wiera tę samą wartość logiczną co parametr b, wartość dodatnią, jeżeli bieżący obiektzawiera wartość true, a parametr b ma wartość false, oraz wartość ujemną, jeżeli bie-żący obiekt zawiera wartość false, a parametr b wartość true.

� boolean equals(Object o), która porównuje bieżący obiekt klasy Boolean z parame-trem o i zwraca true, jeżeli o nie jest null, o jest typu Boolean i obydwa obiekty zawie-rają tę samą wartość logiczną.

� static boolean getBoolean(String name), która zwraca true, jeżeli właściwość sys-temowa (o których powiemy w rozdziale 7.) identyfikowana przez name istnieje i jestrówna true.

Page 31: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

ROZDZIA� 6. � PODSTAWOWE INTERFEJSY API — CZ�� I

269

� int hashCode(),zwracająca odpowiedni kod skrótu, dzięki któremu możliwe jest wy-korzystanie obiektów klasy Boolean w kolekcjach opartych na skrótach (powiemyo nich w rozdziale 8.).

� static boolean parseBoolean(String s), która parsuje wartość parametru s i zwra-ca true, jeżeli s równa się "true", "TRUE", "True" lub dowolnej innej kombinacji tychliter. W przeciwnym razie metoda zwraca false. (Parsowanie to czynność, w trakciektórej sekwencja znaków jest rozkładana na komponenty o określonym znaczeniu,tak zwane tokeny).

� String toString(), która zwraca "true", jeżeli bieżąca instancja klasy Boolean zawie-ra true. W przeciwnym razie metoda zwraca "false".

� static String toString(boolean b), która zwraca "true", jeżeli b zawiera true.W przeciwnym razie metoda zwraca wartość "false".

� static Boolean valueOf(boolean b), która zwraca TRUE, jeżeli b zawiera true lubFALSE, jeżeli b zawiera false.

� static Boolean valueOf(String s), która zwraca TRUE, jeżeli s równa się "true","TRUE", "True" lub dowolnej innej kombinacji tych liter. W przeciwnym razie metodazwraca FALSE.

� Ostrze�enie • Programi�ci, którzy dopiero poznaj� klas Boolean, czsto spodziewaj� si, �e metodagetBoolean() zwróci warto�� true lub false obiektu klasy Boolean. Jednak metoda getBoolean()zwraca warto�� w�a�ciwo�ci systemowej opartej na klasie Boolean (wicej na temat w�a�ciwo�ci sys-temowych powiemy w rozdziale 7.). Aby uzyska� warto�� true lub false, nale�y skorzysta� z metodybooleanValue().

W większości przypadków lepiej jest użyć stałych TRUE lub FALSE, zamiast tworzyćobiekty klasy Boolean. Załóżmy na przykład, że trzeba zaimplementować metodę, którazwróci obiekt klasy Boolean z wartością true, jeżeli argument typu double tej metody będziemiał wartość ujemną, lub false, jeżeli argument ten będzie mieć wartość dodatnią lub bę-dzie równy zero. Potrzebną metodę można zadeklarować w sposób analogiczny jak w przy-padku metody isNegative() z listingu 6.9.

Listing 6.9. Metoda isNegative(), w której tworzy się obiekt klasy Boolean, choć nie jest to koniecznepublic Boolean isNegative(double d){ return new Boolean(d < 0);}

Kod metody jest zwarty, lecz niepotrzebnie tworzy się w niej obiekt klasy Boolean. Jeślimetoda będzie często wywoływana, zostanie utworzonych wiele obiektów Boolean, którezajmą przestrzeń na stercie. Gdy na stercie zaczyna brakować miejsca, włączany jest procesodśmiecania, który spowalnia działanie aplikacji i obniża w ten sposób jej wydajność.

Na listingu 6.10 przedstawiono ulepszoną wersję metody isNegative().

Page 32: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

270

Listing 6.10. Zrefaktoryzowana metoda isNegative(), w której nie tworzy się obiektów klasy Booleanpublic Boolean isNegative(double d){ return (d < 0) ? Boolean.TRUE : Boolean.FALSE;}

W nowej wersji metody nie trzeba już tworzyć obiektów klasy Boolean, ponieważ meto-da zwraca predefiniowany obiekt TRUE lub FALSE.

� Wskazówka • Nale�y d��y� do tego, by liczba tworzonych obiektów klasy Boolean by�a jak najmniej-sza. Dziki temu mniejsza bdzie ilo�� pamici zu�ywanej przez aplikacj, a wydajno�� samej aplikacjibdzie wy�sza, poniewa� proces od�miecania nie bdzie musia� by� uruchamiany zbyt czsto.

Klasa CharacterKlasa Character jest największą spośród podstawowych klas opakowujących. Zawiera znacznąliczbę stałych, konstruktor, wiele metod oraz dwie klasy zagnieżdżone (Subset i UnicodeBlock).

� Uwaga • Wysoki stopie� z�o�ono�ci klasy Character ma swoje ród�o w tym, �e Java obs�uguje Unicode(http://pl.wikipedia.org/wiki/Unicode). Dla uproszczenia pominito wikszo�� mechanizmów klasy zwi�-zanych z obs�ug� Unicode, poniewa� wykraczaj� one poza zakres tego rozdzia�u.

Klasa Character deklaruje jeden konstruktor Character(char value), za pomocą które-go obiekt klasy Character inicjalizuje się wartością value. Uzupełnieniem konstruktora jestmetoda charValue(), która zwraca wartość opakowanego znaku.

Programiści, którzy implementują swoje pierwsze aplikacje, często używają wyrażeńw postaci ch >= '0' && ch <= '9' (aby sprawdzić, czy ch zawiera cyfry) oraz ch >= 'A' &&ch <= 'Z' (aby sprawdzić, czy ch zawiera wielką literę). Takiej praktyki powinno się jednakunikać z następujących względów:

� Bardzo łatwo jest popełnić błąd w wyrażeniu. Na przykład wyrażenie ch > '0' && ch<= '9' zawiera drobny błąd, który powoduje, że wartość '0' nie spełnia warunku wy-rażenia.

� Na podstawie wyrażeń stosunkowo trudno jest ustalić, co tak naprawdę jest w nichsprawdzane.

� W wyrażeniach można używać jedynie cyfr łacińskich (0 – 9) oraz łacińskich liter (A – Zi a – z). W wyrażeniach nie są natomiast uwzględniane cyfry i litery, które są po-prawne w innych językach. Na przykład '\u0beb' to literał znakowy, który repre-zentuje jedną z cyfr w języku tamilskim.

Klasa Character deklaruje kilka metod narzędziowych, które służą do porównywaniaoraz przekształcania i w ten sposób rozwiązują przytoczone przed chwilą problemy. Meto-dami tymi są:

Page 33: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

ROZDZIA� 6. � PODSTAWOWE INTERFEJSY API — CZ�� I

271

� static boolean isDigit(char ch), która zwraca true, jeśli ch zawiera cyfrę (standar-dowo z przedziału od 0 do 9, ale również cyfry z innych języków).

� static boolean isLetter(char ch), która zwraca true, jeśli ch zawiera literę (stan-dardowo A – Z lub a – z, ale również litery z innych języków).

� static boolean isLetterOrDigit(char ch), która zwraca true, jeśli ch zawiera literęlub cyfrę (standardowo A – Z, a – z lub 0 – 9, ale również litery lub cyfry z innych ję-zyków).

� static boolean isLowerCase(char ch), która zwraca true, jeśli ch zawiera małą literę.� static boolean isUpperCase(char ch), która zwraca true, jeśli ch zawiera wielką literę.� static boolean isWhitespace(char ch), która zwraca true, jeśli ch zawiera znak niewi-

doczny (zazwyczaj znak spacji, tabulacji poziomej, powrotu karetki lub nowego wiersza).� static char toLowerCase(char ch), która zwraca małą literę odpowiadającą wielkiej

literze zawartej w ch. Jeżeli ch nie zawiera wielkiej litery, metoda zwraca wartość ch.� static char toUpperCase(char ch), która zwraca wielką literę odpowiadającą małej

literze zawartej w ch. Jeżeli ch nie zawiera małej litery, metoda zwraca wartość ch.

Na przykład zamiast ch >= '0' && ch <= '9' zdecydowanie lepiej jest wykonać metodęisDigit(ch), ponieważ w ten sposób unika się ryzyka popełnienia błędów, sama metoda jestzdecydowanie bardziej czytelna, a poza tym zwraca ona wartość true nie tylko dla cyfr ła-cińskich, ale także cyfr z innych języków (na przykład '\u0beb').

Klasy Float i DoubleKlasy Float i Double przechowują w obiektach typu Float i Double odpowiednio wartościzmiennopozycyjne i wartości zmiennopozycyjne o podwójnej precyzji. Klasy te deklarująnastępujące stałe:

� MAX_VALUE identyfikuje maksymalną wartość, którą można reprezentować jako war-tość typu float lub double.

� MIN_VALUE identyfikuje minimalną wartość, którą można reprezentować jako wartośćtypu float lub double.

� NaN reprezentuje 0.0F/0.0F jako typu float oraz 0.0/0.0 jako typu double.� NEGATIVE_INFINITY reprezentuje minus nieskończoność jako typu float lub double.� POSITIVE_INFINITY reprezentuje plus nieskończoność jako typu float lub double.

Klasy Float i Double deklarują także następujące konstruktory, które inicjalizują obiektytych klas:

� Float(float value) inicjalizuje obiekt klasy Float wartością value.� Float(double value) inicjalizuje obiekt klasy Float odpowiednikiem wartości value

typu float.

Page 34: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

272

� Float(String s) przekształca tekst ze zmiennej s w wartość zmiennopozycyjną i ini-cjalizuje tą wartością obiekt klasy Float.

� Double(double value) inicjalizuje obiekt klasy Double wartością value.� Double(String s) przekształca tekst ze zmiennej s w wartość zmiennopozycyjną

o podwójnej precyzji i inicjalizuje tą wartością obiekt klasy Double.

Uzupełnieniem dla konstruktorów klasy Float jest metoda float floatValue(), którazwraca opakowaną wartość zmiennopozycyjną. Analogicznie uzupełnieniem dla konstruk-torów klasy Double jest metoda double doubleValue(), która zwraca opakowaną wartośćzmiennopozycyjną o podwójnej precyzji.

Oprócz metody floatValue() klasa Float deklaruje kilka metod narzędziowych. Są tonastępujące metody:

� static int floatToIntBits(float value) przekształca value w 32-bitową liczbę cał-kowitą.

� static boolean isInfinite(float f) zwraca true, jeśli wartością f jest plus nie-skończoność lub minus nieskończoność. Podobna do niej metoda public booleanisInfinite() zwraca true, jeśli wartością bieżącego obiektu klasy Float jest plus nie-skończoność lub minus nieskończoność.

� static boolean isNaN(float f) zwraca true, jeśli wartością f jest NaN. Podobna doniej metoda public boolean isNaN() zwraca true, jeśli wartością bieżącego obiektuklasy Float jest NaN.

� static float parseFloat(String s) parsuje s i zwraca wartość zmiennopozycyjną,która odpowiada zawartej w s tekstowej reprezentacji wartości zmiennopozycyjnejlub rzuca wyjątek NumberFormatException, jeżeli reprezentacja ta jest nieprawidłowa(na przykład zawiera litery).

Oprócz metody doubleValue() klasa Double deklaruje kilka metod narzędziowych. Są tonastępujące metody:

� static long doubleToLongBits(double value) przekształca value na długą liczbęcałkowitą.

� static boolean isInfinite(double d) zwraca true, jeśli wartością d jest plus nie-skończoność lub minus nieskończoność. Podobna do niej metoda boolean isInfinite()zwraca true, jeśli wartością bieżącego obiektu klasy Double jest plus nieskończonośćlub minus nieskończoność.

� static boolean isNaN(double d) zwraca true, jeśli wartością d jest NaN. Podobna doniej metoda public boolean isNaN() zwraca true, jeśli wartością bieżącego obiektuklasy Double jest NaN.

� static double parseDouble(String s) parsuje s i zwraca wartość zmiennopozycyjnąo podwójnej precyzji, która odpowiada zawartej w s tekstowej reprezentacji wartościzmiennopozycyjnej o podwójnej precyzji lub rzuca wyjątek NumberFormatException,jeżeli reprezentacja ta jest nieprawidłowa.

Page 35: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

ROZDZIA� 6. � PODSTAWOWE INTERFEJSY API — CZ�� I

273

Za pomocą metod floatToIntBits() i doubleToIntBits() implementuje się metodyequals() i hashCode(), które mają dotyczyć pól typu float i double. Dzięki metodomfloatToIntBits() i doubleToIntBits() metody equals() i hashCode() działają prawidłowow opisanych poniżej sytuacjach.

� equals() musi zwrócić true, jeśli f1 i f2 zawierają Float.NaN (lub jeśli d1 i d2 zawierająDouble.NaN). Gdyby metoda equals() była zaimplementowana w sposób analogicznydo f1.floatValue() == f2.floatValue() (albo d1.doubleValue() == d2.doubleValue()),metoda zwróciłaby false, ponieważ NaN nie jest równa żadnej innej wartości oprócz sa-mej siebie.

� equals() musi zwrócić false, jeśli f1 zawiera +0.0 i f2 zawiera -0.0 (albo odwrotnie)lub jeśli d1 zawiera +0.0 i d2 zawiera -0.0 (albo odwrotnie). Gdyby metoda equals() byłazaimplementowana w sposób analogiczny do f1.floatValue() == f2.floatValue()(lub d1.doubleValue() == d2.doubleValue()), metoda zwróciłaby true, ponieważwyrażenie +0.0 == -0.0 zwraca true.

Spełnienie tych wymagań jest niezbędne, aby kolekcje bazujące na skrótach (o którychwięcej powiemy w rozdziale 8.) funkcjonowały prawidłowo. Na listingu 6.11 widać, w jakisposób opisane wymagania wpływają na działanie metod equals() klas Float i Double.

Listing 6.11. Ilustracja działania metody equals() klasy Float w kontekście wartości NaN oraz metodyequals() klasy Double w kontekście wartości +0.0 i –0.0public static void main(String[] args){ Float f1 = new Float(Float.NaN); System.out.println(f1.floatValue()); Float f2 = new Float(Float.NaN); System.out.println(f2.floatValue()); System.out.println(f1.equals(f2)); System.out.println(Float.NaN == Float.NaN); System.out.println(); Double d1 = new Double(+0.0); System.out.println(d1.doubleValue()); Double d2 = new Double(-0.0); System.out.println(d2.doubleValue()); System.out.println(d1.equals(d2)); System.out.println(+0.0 == -0.0);}

Gdy aplikacja zostanie uruchomiona, zwróci przedstawione poniżej dane wynikowe.Dowodzą one, że metoda equals() klasy Float odpowiednio obsługuje wartość NaN, a me-toda equals() klasy Double odpowiednio uwzględnia wartości +0.0 i -0.0:

NaNNaNtruefalse

0.0-0.0falsetrue

Page 36: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

274

� Wskazówka • Aby sprawdzi�, czy warto�ci typu float lub double s� równe plus niesko�czono�ci lubminus niesko�czono�ci (ale nie obydwóm tym warto�ciom), nie nale�y do tego celu u�ywa� metodyisInfinite(). Zamiast niej warto�� nale�y porówna� za pomoc� operatora == ze sta�� NEGATIVE_�INFINITY lub POSITIVE_INFINITY, na przyk�ad f == Float.NEGATIVE_INFINITY.

Metody parseFloat() i parseDouble() okażą się przydatne w wielu sytuacjach. Na przy-kład na listingu 6.12 wykorzystano metodę parseDouble(), aby wykonać parsowanie argu-mentów wiersza poleceń do wartości typu double.

Listing 6.12. Parsowanie argumentów wiersza poleceń do wartości zmiennopozycyjnych o podwójnej precyzjipublic static void main(String[] args){ if (args.length != 3) { System.err.println("u�ycie: java Calc warto��1 operator warto��2"); System.err.println("operatorem mo�e by� +, -, * lub /"); return; } try { double value1 = Double.parseDouble(args[0]); double value2 = Double.parseDouble(args[2]); if (args[1].equals("+")) System.out.println(value1+value2); else if (args[1].equals("-")) System.out.println(value1-value2); else if (args[1].equals("*")) System.out.println(value1*value2); else if (args[1].equals("/")) System.out.println(value1/value2); else System.err.println("nieprawid�owy operator: " + args[1]); } catch (NumberFormatException nfe) { System.err.println("Nieprawid�owy format liczby: " + nfe.getMessage()); }}

Aby wypróbować powyższą aplikację, można wywołać ją poleceniem java Calc 10E+3 + 66.0.Wynikiem zwróconym przez aplikację będzie 10066.0. Gdyby natomiast wywołać ją poleceniemjava Calc 10E+3 + A, aplikacja zwróciłaby następujący komunikat błędu: Nieprawid�owyformat liczby: "A". Komunikat ten jest spowodowany rzuceniem wyjątku NumberFormat�Exception, co zachodzi w wyniku drugiego wywołania metody parseDouble().

Choć klasa NumberFormatException opisuje wyjątki niekontrolowane, a wyjątków niekon-trolowanych zwykle się nie obsługuje, ponieważ reprezentują one błędy w kodzie źródłowym, tojednak w tym przykładzie NumberFormatException nie pasuje do tego schematu. Wyjątek jestrzucany nie w wyniku błędu w kodzie źródłowym, lecz z powodu przekazania do aplikacji nie-prawidłowego argumentu liczbowego, na co jakość kodu źródłowego nie ma żadnego wpływu.

Page 37: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

ROZDZIA� 6. � PODSTAWOWE INTERFEJSY API — CZ�� I

275

Klasy Integer, Long, Short i ByteKlasy Integer, Long, Short i Byte przechowują wartości całkowitoliczbowe odpowiednio 32-,64-, 16- i 8-bitowe w obiektach typów odpowiednio Integer, Long, Short i Byte.

Każda z tych klas deklaruje stałe MAX_VALUE i MIN_VALUE identyfikujące wartości maksy-malną i minimalną, które może reprezentować typ podstawowy powiązany z daną klasą.

Klasy deklarują także konstruktory, które inicjalizują ich obiekty.

� Integer(int value) inicjalizuje obiekt klasy Integer wartością value.� Integer(String s) przekształca tekst w argumencie s na 32-bitową wartość całko-

witoliczbową i inicjalizuje tą wartością obiekt klasy Integer.� Long(long value) inicjalizuje obiekt klasy Long wartością value.� Long(String s) przekształca tekst w argumencie s na 64-bitową wartość całkowito-

liczbową i inicjalizuje tą wartością obiekt klasy Long.� Short(short value) inicjalizuje obiekt klasy Short wartością value.� Short(String s) przekształca tekst w argumencie s na 16-bitową wartość całkowito-

liczbową i inicjalizuje tą wartością obiekt klasy Short.� Byte(byte value) inicjalizuje obiekt klasy Byte wartością value.� Byte(String s) przekształca tekst w argumencie s na 8-bitową wartość całkowito-

liczbową i inicjalizuje tą wartością obiekt klasy Byte.

Uzupełnieniem dla konstruktorów klasy Integer jest metoda int intValue(), dla kon-struktorów klasy Long takim uzupełnieniem jest metoda long longValue(), dla konstruk-torów klasy Short — metoda short shortValue(), zaś dla konstruktorów klasy Byte — metodabyte byteValue(). Wszystkie wspomniane metody zwracają opakowane liczby całkowite.

Wszystkie cztery klasy deklarują różnorodne przydatne metody do przetwarzania liczbcałkowitych. Na przykład klasa Integer deklaruje wymienione poniżej metody klas, któreprzeprowadzają konwersję 32-bitowej liczby całkowitej na ciąg znaków String zgodnie zewskazaną reprezentacją (binarną, szesnastkową, ósemkową i dziesiątkową):

� static String toBinaryString(int i) zwraca obiekt klasy String, który zawiera bi-narną reprezentację argumentu i. Na przykład Integer.toBinaryString(255) zwróciobiekt klasy String, który będzie zawierać ciąg 11111111.

� static String toHexString(int i) zwraca obiekt klasy String, który zawiera szes-nastkową reprezentację argumentu i. Na przykład Integer.toHexString(255) zwróciobiekt klasy String, który będzie zawierać ciąg ff.

� static String toOctalString(int i) zwraca obiekt klasy String, który zawieraósemkową reprezentację argumentu i. Na przykład toOctalString(64) zwróci obiektklasy String, który będzie zawierać ciąg 377.

� static String toString(int i) zwraca obiekt klasy String, który zawiera dziesiąt-kową reprezentację argumentu i. Na przykład toString(255) zwróci obiekt klasyString, który będzie zawierać ciąg 255.

Page 38: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

276

Często wygodnie jest poprzedzać ciąg binarny zerami, tak aby ciągi te móc umieszczaćw kolumnach o takiej samej szerokości. Na przykład można zaimplementować aplikację,która będzie wyświetlać następujący, obustronnie wyrównany zbiór danych wynikowych:

11110001+00000111--------11111000

Niestety, metoda toBinaryString() nie ułatwia wykonania tego zadania. Na przykładmetoda Integer.toBinaryString(7) zwróci obiekt klasy String, który będzie zawierał ciąg111, a nie 00000111. Na listingu 6.13 przedstawiono metodę toAlignedBinaryString(), którawyświetla ciąg binarny w pożądanym, obustronnie wyrównanym formacie.

Listing 6.13. Wyrównywanie binarnego ciągu znakówpublic static void main(String[] args){ System.out.println(toAlignedBinaryString(7, 8)); System.out.println(toAlignedBinaryString(255, 16)); System.out.println(toAlignedBinaryString(255, 7));}static String toAlignedBinaryString(int i, int numBits){ String result = Integer.toBinaryString(i); if (result.length() > numBits) return null; // nie można zmieścić wyniku w numBits kolumnach int numLeadingZeros = numBits-result.length(); String zerosPrefix = ""; for (int j = 0; j < numLeadingZeros; j++) zerosPrefix += "0"; return zerosPrefix + result;}

Metoda toAlignedBinaryString() przyjmuje dwa argumenty. Pierwszy zawiera 32-bitowąliczbę całkowitą, którą należy przekształcić na binarny ciąg znaków, zaś drugi argumentwskazuje liczbę kolumn bitów, w których należy wyświetlić ten ciąg znaków.

Najpierw jest wywoływana metoda toBinaryString(), która zwraca binarny ciąg zna-ków stanowiący odpowiednik wartości i, lecz bez poprzedzających zer. Następująca po nimmetoda toAlignedBinaryString() sprawdza, czy wszystkie cyfry binarnego ciągu znakówzmieszczą się w kolumnach bitów, których liczbę wyznacza numBits. Jeżeli cyfr będzie więcejniż kolumn, metoda zwróci null. (Więcej informacji na temat metody length() oraz innychmetod klasy String przedstawimy w rozdziale 7.).

W dalszej kolejności metoda toAlignedBinaryString() oblicza, iloma zerami należy po-przedzić wartość result, po czym w pętli tworzy ciąg znaków złożony z takiej liczby zer.Na koniec metoda zwraca ciąg zer, które mają poprzedzić wynikowy ciąg znaków.

Złożona operacja połączenia ciągów znaków za pomocą operatora przypisania (+=) napierwszy rzut oka nie budzi wątpliwości, jednak tak naprawdę jest to rozwiązanie mało wy-dajne, ponieważ pośrednie obiekty tworzone w trakcie tej operacji są najpierw tworzone,a następnie niszczone. Zastosowaliśmy jednak tak niewydajny kod, aby w rozdziale 7. prze-ciwstawić mu rozwiązanie zdecydowanie lepsze pod względem wydajności.

Page 39: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

ROZDZIA� 6. � PODSTAWOWE INTERFEJSY API — CZ�� I

277

Gdy aplikacja zostanie uruchomiona, zwróci następujące dane wynikowe:

000001110000000011111111null

Klasa NumberWszystkie spośród klas Float, Double, Integer, Long, Short i Byte udostępniają nie tylkometodę xValue() odnoszącą się do samej klasy, ale również metody xValue() odnoszące siędo wszystkich pozostałych klas. Na przykład w klasie Float dostępne są, oprócz floatValue(),również metody doubleValue(), intValue(), longValue(), shortValue() oraz byteValue().

Wszystkie sześć metod to składowe klasy java.lang.Number, która jest abstrakcyjną klasą ba-zową dla klas Float, Double, Integer, Long, Short i Byte. Metody floatValue(), doubleValue(),intValue() i longValue() klasy Number są więc metodami abstrakcyjnymi. Klasa Number jestrównież klasą bazową dla klas BigDecimal i BigInteger (a także dla niektórych klas przezna-czonych do pracy współbieżnej, o czym więcej powiemy w rozdziale 9.).

Klasa Number istnieje po to, by uprościć iterowanie przez kolekcję obiektów klas potom-nych po Number. Na przykład można zadeklarować zmienną typu List<Number> i zainicjali-zować ją instancją klasy ArrayList<Number>. W tak utworzonej kolekcji można przechowywaćróżne klasy potomne po Number i iterować przez kolekcję, wykorzystując do tego wielopostacio-wość wywołań metod klas podrzędnych.

API ReferencesW rozdziale 2. opisano mechanizm odśmiecania, który usuwa obiekt ze sterty, jeśli nie ist-nieją już żadne odwołania do tego obiektu.

W rozdziale 3. z kolei przedstawiono metodę finalize() klasy Object. Jest to metoda,którą wywołuje proces odśmiecania, zanim usunie obiekt ze sterty. Metoda finalize() po-zwala obiektowi na wykonanie czynności sprzątających.

W tym punkcie będzie kontynuowany wątek zapoczątkowany w rozdziałach 2. oraz 3.Zostanie też zaprezentowane API References. Interfejs ten umożliwia aplikacji komuniko-wanie się, w ograniczonym zakresie, z procesem odśmiecania.

Na początek przedstawimy podstawowe pojęcia związane z API References. Następnieopiszemy klasy Reference i ReferenceQueue interfejsu, po czym zakończymy prezentacjąklas SoftReference, WeakReference i PhantomReference.

Podstawowe poj�ciaGdy uruchamia się aplikację, tworzony jest dla niej główny zbiór odwołań (ang. root set ofreferences). Zbiór ten jest kolekcją zmiennych lokalnych, parametrów, pól klas i pól instan-cji, które aktualnie istnieją i zawierają — potencjalnie puste — odwołania do obiektów. Zbiórgłówny zmienia się z upływem czasu i w miarę wykonywania przez aplikację kolejnych za-dań. Na przykład po powrocie z metody ze zbioru znikają jej parametry.

Page 40: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

278

Wiele procesów odśmiecania odczytuje główny zbiór odwołań w momencie, gdy zostająuruchomione. Na podstawie głównego zbioru odwołań proces odśmiecania sprawdza, czyobiekt jest osiągalny (albo czy obiekt żyje, to znaczy czy istnieją jakieś odwołania do niego),czy też jest nieosiągalny (czyli nie istnieją żadne odwołania do niego). Proces odśmiecanianie może niszczyć obiektów, które są osiągalne — proces ten może usuwać ze sterty jedyniete obiekty, które, począwszy od głównego zbioru odwołań, nie są osiągalne.

� Uwaga • Obiektami osi�galnymi s� tak�e te obiekty, które s� osi�galne po�rednio za po�rednictwemzmiennych ze zbioru g�ównego. Inaczej mówi�c, chodzi o obiekty, które s� osi�galne za po�rednictwem�ywych obiektów osi�galnych bezpo�rednio za pomoc� tych zmiennych. Obiekt, który pozostaje nie-osi�galny na �adnej �cie�ce, bez wzgldu na to, któr� zmienn� z g�ównego zbioru odwo�a� si wybie-rze, podlega przetworzeniu przez mechanizm od�miecania.

Począwszy od wersji 1.2 języka Java, obiekty osiągalne dzieli się na obiekty silnie osią-galne, miękko osiągalne, słabo osiągalne i złudnie osiągalne. W odróżnieniu od obiektówsilnie osiągalnych, obiekty osiągalne miękko, słabo i złudnie mogą podlegać przetwarzaniuprzez mechanizm odśmiecania.

W poniższych punktach scharakteryzowano cztery wspomniane typy osiągalności za-leżnie od mocy odwołania — od najsilniejszego do najsłabszego.

� Obiekt jest silnie osiągalny (ang. strongly reachable), jeżeli jest osiągalny dla wątkui wątek ten nie musi przechodzić przez obiekty API Reference — wątek korzystaz silnego odwołania (ang. strong reference) przypisanego zmiennej z głównego zbioruodwołań. Nowo utworzony obiekt (na przykład obiekt, do którego odwołuje sięzmienna d z instrukcji Double d = new Double(1.0);) jest silnie osiągalny dla wątku,który ten obiekt stworzył. (Więcej na temat wątków powiemy w rozdziale 7.).

� Obiekt jest miękko osiągalny (ang. softly reachable), jeżeli nie jest silnie osiągalny,lecz staje się osiągalny za pośrednictwem odwołania miękkiego (ang. soft reference),czyli odwołania do obiektu, które jest przechowywane w obiekcie klasy SoftReference.Najsilniejszym odwołaniem do takiego obiektu jest odwołanie miękkie. Gdy ilośćmiejsca na stercie jest już niewielka, proces odśmiecania zwykle usuwa miękkie od-wołania do najstarszych miękko osiągalnych obiektów, po czym finalizuje te obiekty(przez wywołanie metody finalize()) i je usuwa.

� Obiekt jest słabo osiągalny (ang. weakly reachable), jeżeli nie jest silnie ani miękkoosiągalny, natomiast staje się osiągalny za pośrednictwem odwołania słabego (ang.weak reference), czyli odwołania do obiektu, które jest przechowywane w obiekcie klasyWeakReference. Najsilniejszym odwołaniem do takiego obiektu jest odwołanie słabe.Proces odśmiecania usuwa słabe odwołania do słabo osiągalnych obiektów i niszczyje (a wcześniej finalizuje) przy następnym uruchomieniu procesu, nawet jeśli w pamięcijest dużo wolnego miejsca.

� Obiekt jest złudnie osiągalny (ang. phantom reachable), jeżeli nie jest silnie, miękkoani słabo osiągalny, został sfinalizowany i proces odśmiecania jest gotowy na odzy-skanie zajmowanej przez niego pamięci. Dodatkowo do obiektu złudnie osiągalnego

Page 41: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

ROZDZIA� 6. � PODSTAWOWE INTERFEJSY API — CZ�� I

279

wiedzie złudne odwołanie (ang. phantom reference), czyli odwołanie do obiektuprzechowywane w obiekcie klasy PhantomReference. Najsilniejszym odwołaniem doobiektu złudnie osiągalnego jest odwołanie złudne.

� Uwaga • Jedyna ró�nica midzy odwo�aniem mikkim a s�abym sprowadza si do tego, �e prawdopo-dobie�stwo usunicia obiektu mikko osi�galnego przez proces od�miecania jest ni�sze ni� w przypadkuobiektu s�abo osi�galnego. Poza tym odwo�anie s�abe nie ma wystarczaj�cej mocy, by utrzyma� obiektw pamici.

Obiekty, do których odwołanie jest przechowywane w obiektach klas SoftReference,WeakReference lub PhantomReference, to tak zwane referenty.

Klasy Reference i ReferenceQueueAPI Reference zawiera pięć klas, które wchodzą w skład pakietu java.lang.ref. Jądrem te-go pakietu są klasy Reference i ReferenceQueue.

Klasa Reference jest abstrakcyjną klasą główną dla wchodzących w skład pakietu klaspotomnych SoftReference, WeakReference i PhantomReference.

Klasa ReferenceQueue to klasa, której instancje opisują strukturę kolejek danych. Jeśli in-stancja klasy ReferenceQueue zostanie skojarzona z obiektem klasy potomnej Reference(czyli, krócej mówiąc, z obiektem Reference), wówczas w momencie gdy referent, do które-go wiedzie odwołanie enkapsulowane w obiekcie Reference, zostanie zniszczony przez pro-ces odśmiecania, obiekt Reference zostanie dodany do kolejki.

� Uwaga • Obiekt klasy ReferenceQueue kojarzy si z obiektem Reference w ten sposób, �e obiekt klasyReferenceQueue przekazuje si do konstruktora odpowiedniej klasy potomnej po klasie Reference.

Klasa Reference jest zadeklarowana jako ogólny typ Reference<T>, w którym T oznaczatyp referenta. Klasa udostępnia następujące metody:

� void clear() przypisuje odwołaniu null. Obiekt klasy Reference, na którym jest wy-woływana ta metoda, nie jest kolejkowany (wstawiany) do skojarzonej z nim kolejkiodwołań (jeżeli oczywiście taka kolejka odwołań jest skojarzona z obiektem). (Procesodśmiecania czyści odwołania w sposób bezpośredni, a nie przez wywołanie metodyclear(). Metoda clear() jest wywoływana przez aplikacje).

� boolean enqueue() dodaje obiekt klasy Reference, na którym metoda została wywołana,do skojarzonej z nią kolejki odwołań. Metoda zwraca true, gdy obiekt klasy Referencezostał zakolejkowany, lub false w przeciwnym wypadku — wówczas jest to znak, żeobiekt został zakolejkowany już wcześniej albo w momencie jego tworzenia nie zostałskojarzony z żadną kolejką. (Proces odśmiecania kolejkuje obiekty klasy Referencew sposób bezpośredni, a nie przez wywołanie metody enqueue(). Metoda enqueue()jest wywoływana przez aplikacje).

Page 42: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

280

� T get() zwraca odwołanie przechowywane w obiekcie klasy Reference. Jeżeli prze-chowywane odwołanie zostało wcześniej wyczyszczone czy to przez aplikację, czy toprzez proces odśmiecania, zwracaną wartością jest null.

� boolean isEnqueued() zwraca true, jeśli obiekt klasy Reference został zakolejkowanyprzez aplikację lub przez proces odśmiecania. W przeciwnym razie metoda zwracawartość false, co oznacza, że obiekt klasy Reference nie został w momencie jegoutworzenia skojarzony z żadną kolejką.

� Uwaga • Klasa Reference deklaruje tak�e konstruktory. Poniewa� konstruktory te s� prywatne w ramachpakietu, klasami potomnymi po Reference mog� by� wy��cznie klasy z pakietu java.lang.ref. Na-�o�enie takiego ograniczenia by�o konieczne dlatego, �e instancje klas potomnych po Reference musz��ci�le wspó�pracowa� z procesem od�miecania.

Klasa ReferenceQueue jest zadeklarowana jako ogólny typ ReferenceQueue<T>, w którym Twskazuje typ referenta. Klasa ReferenceQueue deklaruje konstruktor i metody opisane poniżej.

� ReferenceQueue() inicjalizuje nową instrukcję klasy ReferenceQueue.� Reference<? extends T> poll() sprawdza, czy w kolejce jest dostępny obiekt klasy

Reference. Jeżeli taki obiekt jest dostępny, zostaje on usunięty z kolejki i zwrócony przezmetodę. W przeciwnym razie następuje natychmiastowy powrót z metody z wartościąwynikową null.

� Reference<? extends T> remove() usuwa z kolejki następny obiekt klasy Referencei go zwraca. Przez nieokreślony czas metoda czeka na to, by obiekt klasy Reference stałsię dostępny, a gdy to oczekiwanie zostanie przerwane, rzuca wyjątek klasy java.lang.�InterruptedException.

� Reference<? extends T> remove(long timeout) usuwa z kolejki następny obiekt kla-sy Reference i go zwraca. Metoda czeka, aż obiekt klasy Reference stanie się dostępnylub upłynie tyle milisekund, ile wskazuje parametr timeout. Wywołanie metody z ar-gumentem 0 spowoduje, że metoda będzie oczekiwać bez końca. Jeżeli upłynie czaswskazywany przez timeout, metoda zwróci null. Jeżeli wartość timeout będzie ujem-na, metoda rzuci wyjątek java.lang.IllegalArgumentException, a jeżeli jej oczekiwa-nie zostanie przerwane, zostanie rzucony wyjątek klasy InterruptedException.

Klasa SoftReferenceKlasa SoftReference opisuje obiekt klasy Reference, którego referent jest miękko osiągalny.Jest to klasa ogólna, która oprócz tego, że dziedziczy metody klasy Reference i pokrywa jejmetodę get(), udostępnia także opisane poniżej konstruktory przeznaczone do inicjalizo-wania obiektów klasy SoftReference.

� SoftReference(T r) umieszcza w obiekcie odwołanie przekazane jako argument r.Obiekt klasy SoftReference zachowuje się jak miękkie odwołanie do r. Żaden obiektklasy ReferenceQueue nie jest skojarzony z obiektem klasy SoftReference.

Page 43: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

ROZDZIA� 6. � PODSTAWOWE INTERFEJSY API — CZ�� I

281

� SoftReference(T r, ReferenceQueue<? super T> q) umieszcza w obiekcie odwołanieprzekazane jako argument r. Obiekt klasy SoftReference zachowuje się jak miękkieodwołanie do r. Z obiektem klasy SoftReference zostaje skojarzona kolejka SoftReferencewskazywana przez q. Jeżeli przekazany do metody argument q będzie null, będzie tooznaczać, że z miękkim odwołaniem nie jest skojarzona żadna kolejka.

Klasa SoftReference przydaje się do implementowania buforów pamięci podręcznej, naprzykład do przechowywania obrazków. Bufor obrazków przechowuje w pamięci obrazki(ponieważ ich załadowanie z dysku zabiera czas), a także zapewnia, że do pamięci nie tra-fiają duplikaty obrazków, które potencjalnie mogą mieć duże rozmiary.

Bufor obrazków zawiera odwołania do obiektów obrazków, które znajdują się już w pa-mięci. Gdyby były to silne odwołania, obrazki pozostawałyby w pamięci. Trzeba by wów-czas ustalać, które z tych obrazków nie są już więcej potrzebne, i usuwać je z pamięci, abymogły zostać przetworzone przez proces odśmiecania.

Gdyby konieczne było ręczne usuwanie obrazków, oznaczałoby to tak naprawdę powie-lanie zadań wykonywanych przez proces odśmiecania. Jeżeli jednak odwołania do obiektówobrazków opakuje się w obiektach klasy SoftReference, proces odśmiecania sam ustali, kie-dy obiekty te należy usunąć (zazwyczaj będzie to wówczas, gdy na stercie będzie już małowolnego miejsca), a także sam je usunie.

Na listingu 6.14 pokazano, w jaki sposób za pomocą klasy SoftReference można utrzy-mywać podręczny bufor obrazków.

Listing 6.14. Utrzymywanie podręcznego bufora obrazkówclass Image{ private byte[] image; private Image(String name) { image = new byte[1024*100]; } static Image getImage(String name) { return new Image(name); }}public class ImageCache{ final static int NUM_IMAGES = 200; @SuppressWarnings("unchecked") public static void main(String[] args) { String[] imageNames = new String[NUM_IMAGES]; for (int i = 0; i < imageNames.length; i++) imageNames[i] = new String("obrazek" + i + ".gif");

SoftReference<Image>[] cache = new SoftReference[imageNames.length]; for (int i = 0; i < cache.length; i++) cache[i] = new SoftReference<Image>(Image.getImage(imageNames[i]));

for (int i = 0; i < cache.length; i++) { Image im = cache[i].get();

Page 44: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

282

if (im == null) { System.out.println(imageNames[i] + " nie znajduje si� w buforze"); im = Image.getImage(imageNames[i]); cache[i] = new SoftReference<Image>(im); } System.out.println("Rysowanie obrazka"); im = null; // Usunięcie silnego odwołania do obrazka. } }}

Na listingu zadeklarowano klasę Image, która symuluje ładowanie obrazka. Każda in-stancja obrazka jest tworzona przez wywołanie metody klasy getImage(). Prywatna tablicaimage instancji zajmuje 100 KB pamięci.

Metoda main() najpierw tworzy tablicę obiektów klasy String, które zawierają nazwyplików obrazków. Sposób tworzenia tej tablicy jest daleki od wydajnego, a rozwiązanie al-ternatywne o odpowiedniej wydajności zostanie przedstawione w rozdziale 7.

Metoda main() tworzy następnie tablicę obiektów klasy SoftReference, która odgrywarolę podręcznego bufora dla obiektów klasy Image. Tablica jest inicjalizowana obiektamiklasy SoftReference, z których każdy jest inicjalizowany odwołaniem do obiektu klasy Image.

Na tym etapie metoda main() rozpoczyna wykonanie głównej pętli aplikacji. Pętla ite-ruje przez bufor i odczytuje kolejne obiekty klasy Image lub null, jeśli proces odśmiecaniawyczyścił miękkie odwołanie do obiektu obrazka (aby zwolnić miejsce zajmowane przezniego na stercie).

Jeżeli odwołaniem przypisanym im nie jest null, oznacza to, że obiekt nie stał się nie-osiągalny — następujący zaraz potem kod może więc wyrysować obrazek na ekranie. In-strukcja przypisania im = null; usuwa silne odwołanie do obiektu klasy Image ze zmiennejim głównego zbioru odwołań.

� Uwaga • Wykonanie instrukcji przypisania im = null; nie jest w tej aplikacji konieczne, poniewa�zaraz w nastpnej iteracji im jest nadpisywane przez warto�� zwrócon� przez metod get() albo ptlai aplikacja zostaj� zako�czone. W przyk�adowym kodzie instrukcja ta zosta�a umieszczona po to, aby po-kaza�, w jaki sposób mo�na si pozby� warto�ci zmiennej im. Dzia�anie takie oka�e si przydatne, gdywarto�� zmiennej pozostanie w pamici na d�u�ej, je�li przyk�adowa aplikacja zostanie rozbudowana dobardziej z�o�onej postaci, a proces od�miecania nie bdzie móg� usun�� ze sterty obiektu klasy Imagewskazywanego przez im ze wzgldu na fakt, �e obiekt ten bdzie silnie osi�galny.

Jeśli odwołanie przypisane zmiennej im będzie null, będzie to oznaczać, że obiekt klasyImage stał się nieosiągalny i prawdopodobnie został usunięty ze sterty. W takiej sytuacjiobiekt obrazka trzeba ponownie utworzyć i umieścić w nowym obiekcie klasy SoftReference,który powinien następnie trafić do bufora podręcznego.

Poniżej znajduje się krótki wycinek danych wynikowych zwróconych przez aplikację —jej kod być może trzeba będzie odpowiednio dostosować, aby uzyskać takie same wyniki:

obrazek162.gif nie znajduje si� w buforzeRysowanie obrazkaobrazek163.gif nie znajduje si� w buforzeRysowanie obrazkaRysowanie obrazka

Page 45: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

ROZDZIA� 6. � PODSTAWOWE INTERFEJSY API — CZ�� I

283

Komunikat Rysowanie obrazka w ostatnim wierszu przytoczonych danych wynikowychoznacza, że obrazek obrazek164.gif nadal znajduje się w buforze. Inaczej mówiąc, obiekt kla-sy Image obrazka nadal jest osiągalny.

� Uwaga • Je�eli aplikacja bdzie zwraca� niesko�czon� liczb komunikatów „Rysowanie obrazka”, mo�eto oznacza�, �e przestrze� na stercie u�ywana przez maszyn wirtualn� Javy jest wiksza ni� przestrze�na stercie wykorzystywana przez aktualnie u�ywan� maszyn wirtualn�, gdy aplikacja zosta�a urucho-miona w systemie Windows XP. Je�eli przestrze� na stercie dostpna dla maszyny wirtualnej bdzie od-powiednio du�a, mikkie odwo�ania nie bd� czyszczone i aplikacja bdzie mog�a zwraca� wynikiw niesko�czono��. Aby rozwi�za� ten problem, mo�na zwikszy� rozmiar tablicy obrazków image(na przyk�ad z 1024*100 do 1024*500) i ewentualnie przypisa� sta�ej NUM_IMAGES wiksz� warto��(na przyk�ad 500).

Klasa WeakReferenceKlasa WeakReference opisuje obiekt klasy Reference, którego referent jest słabo osiągalny.WeakReference to klasa ogólna, która dziedziczy metody po klasie Reference, a także udo-stępnia konstruktory opisane poniżej, które inicjalizują obiekty klasy WeakReference:

� WeakReference(T r) umieszcza w obiekcie odwołanie r. Obiekt klasy WeakReferencezachowuje się jak słabe odwołanie do r. Z obiektem tym nie jest skojarzona kolejkaReferenceQueue.

� WeakReference(T r, ReferenceQueue<? super T> q) umieszcza w obiekcie odwoła-nie r. Obiekt klasy WeakReference zachowuje się jak słabe odwołanie do r. Z obiektemtym zostanie skojarzony obiekt klasy ReferenceQueue wskazywany przez argument q.Jeżeli jako q zostanie przekazane null, będzie to oznaczać, że ze słabym odwołaniemnie jest skojarzona żadna kolejka.

Klasa WeakReference przydaje się do zapobiegania wyciekom pamięci, które mogą wy-stąpić w przypadku korzystania z map skrótów. Wyciek pamięci następuje wtedy, gdy domapy skrótów są dodawane kolejne obiekty, które nie są nigdy usuwane. Obiekty te pozo-stają wówczas w pamięci, ponieważ mapa skrótów przechowuje silne odwołania do nich.

Idealnym rozwiązaniem byłoby, gdyby obiekty pozostawały w pamięci jedynie wówczas,gdy w aplikacji występują silne odwołania do nich. Z chwilą zniknięcia ostatniego silnegoodwołania do obiektu (nie licząc silnego odwołania w mapie skrótów) obiekt powinien zo-stać usunięty przez proces odśmiecania.

Okolicznościom, w których dochodzi do wycieków pamięci, można zapobiec przez two-rzenie słabych odwołań do elementów mapy skrótów. Dzięki temu elementy mapy skrótówzostaną usunięte, jeśli przestaną istnieć jakiekolwiek silne odwołania do ich kluczy. Do tegocelu służy klasa WeakHashmap opisywana w rozdziale 8.

Page 46: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

284

Klasa PhantomReferenceKlasa PhantomReference opisuje obiekt klasy Reference, którego referent jest złudnie osią-galny. PhantomReference jest klasą ogólną, która dziedziczy metody po klasie Referencei pokrywa metodę get(), a także udostępnia opisany poniżej konstruktor przeznaczony doinicjalizowania obiektów klasy PhantomReference.

� PhantomReference(T r, ReferenceQueue<? super T> q) umieszcza w obiekcie od-wołanie r. Obiekt klasy PhantomReference zachowuje się jak złudne odwołanie do r.Z obiektem klasy PhantomReference jest skojarzony obiekt klasy ReferenceQueue wska-zywany przez argument q. Przekazanie null do argumentu q nie ma sensu, ponieważpokrywająca metoda get() zwraca null i obiekt klasy PhantomReference nigdy nie zo-stanie zakolejkowany.

W odróżnieniu od obiektów klas WeakReference i SoftReference, które są kolejkowanew ich własnych kolejkach odwołań wówczas, gdy ich referenty stają się słabo osiągalne(przed finalizacją), a czasami także po tym, gdy ich referenty stają się miękko osiągalne(przed finalizacją), obiekty klasy PhantomReference są kolejkowane po odzyskaniu pamięcizajmowanej przez ich referenty.

Pomimo że referent obiektu klasy PhantomReference jest niedostępny (metoda get()zwraca null), klasa jest jak najbardziej przydatna, ponieważ zakolejkowanie obiektu klasyPhantomReference wskazuje dokładnie moment usunięcia referenta. Można więc na przy-kład opóźnić utworzenie dużego obiektu do momentu, aż inny duży obiekt zostanie usuniętyz pamięci (i uniknąć w ten sposób rzucenia obiektu klasy java.lang.OutOfMemoryError).

Klasa PhantomReference jest przydatna również dlatego, że może stanowić substytutwskrzeszenia (ang. resurrection), czyli zjawiska, w którym obiekt nieosiągalny ponowniestaje się osiągalny. Jako że referent jest niedostępny (metoda get() zwraca null) ze względuna fakt, że nie ma go już w pamięci w momencie, gdy obiekt klasy PhantomReference jestkolejkowany, obiekt może zostać wyczyszczony w pierwszym cyklu pracy procesu odśmie-cania, w którym obiekt ten zostanie zidentyfikowany jako złudnie osiągalny. Po uzyskaniuodpowiedniego powiadomienia za pośrednictwem kolejki odwołań obiektu klasy Phantom�Reference można wyczyścić wszystkie zasoby powiązane z obiektem.

� Uwaga • Wskrzeszenie zachodzi w metodzie finalize(), gdy zmiennej z g�ównego zbioru odwo�a�przypisuje si this. W metodzie finalize() mo�na na przyk�ad wykona� instrukcj r = this;, abyobiekt nieosi�galny wskazywany jako this przypisa� polu klasy o nazwie r.

Z kolei proces odśmiecania potrzebuje co najmniej dwóch cykli, aby stwierdzić, czyobiekt pokrywający metodę finalize() może zostać przez ten proces przetworzony. Jeśliw pierwszym cyklu odśmiecania okaże się, że obiekt może zostać usunięty, zostanie wywo-łana metoda finalize(). Jednak metoda finalize() może doprowadzić do wskrzeszeniaobiektu, dlatego potrzebny jest jeszcze drugi cykl, w którym proces odśmiecania sprawdzi,czy do wskrzeszenia rzeczywiście doszło.

Page 47: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

ROZDZIA� 6. � PODSTAWOWE INTERFEJSY API — CZ�� I

285

� Ostrze�enie • Zjawisko wskrzeszania wykorzystano w implementacji pul obiektów, które odtwarzaj� tesame obiekty, je�li ich utworzenie jest kosztowne (czasoch�onne). Przyk�adem takiego obiektu mo�e by�cho�by po��czenie z baz� danych. Jednak wskrzeszanie te� jest czynno�ci� czasoch�onn�, a klasa Phan-tomReference likwiduje wymóg wykonywania tej czynno�ci, a zatem zdecydowanie nale�y unika�wskrzeszania we w�asnych aplikacjach.

Na listingu 6.15 pokazano, w jaki sposób za pomocą klasy PhantomReference można zi-dentyfikować fakt usunięcia dużego obiektu.

Listing 6.15. Rozpoznawanie, czy usunięty został duży obiektclass LargeObject{ private byte[] memory = new byte[1024*1024*50]; // 50 megabajtów}public class LargeObjectDemo{ public static void main(String[] args) { ReferenceQueue<LargeObject> rq; rq = new ReferenceQueue<LargeObject>(); PhantomReference<LargeObject> pr; pr = new PhantomReference<LargeObject>(new LargeObject(), rq); int counter = 0; int[] x; while (rq.poll() == null) { System.out.println("oczekiwanie na usuni�cie du�ego obiektu"); if (counter++ == 10) x = new int[1024*1024]; } System.out.println("du�y obiekt zosta� usuni�ty"); }}

W kodzie na listingu 6.15 zadeklarowano klasę LargeObject, której prywatna tablica memoryzajmuje 50 MB. Jeżeli w momencie uruchomienia aplikacji używana implementacja Javyrzuci błąd OutOfMemoryError, konieczne będzie zmniejszenie rozmiaru tej tablicy.

Metoda main() tworzy najpierw obiekt klasy ReferenceQueue opisujący kolejkę, do którejzostanie dodany utworzony w kolejnym kroku obiekt klasy PhantomReference zawierającyodwołanie do LargeObject.

Następnie metoda main() tworzy obiekt klasy PhantomReference. W tym celu do kon-struktora zostaje przekazane odwołanie do nowo utworzonego obiektu klasy LargeObjectoraz odwołanie do wcześniej utworzonego obiektu klasy ReferenceQueue.

Po zainicjalizowaniu zmiennej counter (która wskazuje liczbę iteracji, jakie wykonanoprzed utworzeniem kolejnego dużego obiektu) oraz po zadeklarowaniu zmiennej lokalnejo nazwie x, przeznaczonej do przechowywania silnego odwołania do kolejnego dużegoobiektu, metoda main() uruchamia pętlę odpytywania.

Pętla odpytywania rozpoczyna się od wywołania metody poll(), która sprawdza, czyobiekt klasy LargeObject został usunięty z pamięci. Dopóki metoda będzie zwracać null, co

Page 48: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

286

oznacza, że obiekt klasy LargeObject nadal znajduje się w pamięci, pętla będzie zwracaćkomunikat i zwiększać wartość licznika counter.

Gdy licznik iteracji counter osiągnie wartość 10, zmiennej x zostaje przypisana tablicaelementów typu int z milionem elementów w postaci liczb całkowitych. Tablica nie zosta-nie wyczyszczona przez proces odśmiecania do momentu zakończenia działania aplikacji,ponieważ odwołanie przypisane zmiennej x jest odwołaniem silnym.

Na niektórych platformach przypisanie odwołania do tablicy zmiennej x wystarczy dotego, by proces odśmiecania zniszczył obiekt klasy LargeObject. Obiekt klasy PhantomRefe-rence dużego obiektu jest kolejkowany w kolejce ReferenceQueue, na którą wskazuje odwo-łanie rq, a metoda poll() zwraca obiekt klasy PhantomReference.

W zależności od implementacji używanej maszyny wirtualnej aplikacja może zwrócić(choć nie musi) komunikat du�y obiekt zosta� usuni�ty. Jeżeli komunikat ten nie zosta-nie zwrócony przez aplikację, być może trzeba będzie zwiększyć rozmiar tablicy x, aby w tensposób zapewnić, że nie zostanie rzucony błąd OutOfMemoryError.

Po uruchomieniu aplikacji można uzyskać dane wynikowe widoczne poniżej. Aby uzyskaćpodobny wynik, konieczne może być odpowiednie dostosowanie kodu źródłowego aplikacji.

oczekiwanie na usuni�cie du�ego obiektuoczekiwanie na usuni�cie du�ego obiektuoczekiwanie na usuni�cie du�ego obiektuoczekiwanie na usuni�cie du�ego obiektuoczekiwanie na usuni�cie du�ego obiektuoczekiwanie na usuni�cie du�ego obiektuoczekiwanie na usuni�cie du�ego obiektuoczekiwanie na usuni�cie du�ego obiektuoczekiwanie na usuni�cie du�ego obiektuoczekiwanie na usuni�cie du�ego obiektuoczekiwanie na usuni�cie du�ego obiektudu�y obiekt zosta� usuni�ty

� Uwaga • Wicej ciekawych przyk�adów zastosowania klasy PhantomReference oraz wicej bardziejszczegó�owych informacji na temat procesu od�miecania mo�na znale� we wpisie na blogu Keitha D.Gregory’ego pod tytu�em „Java Reference Objects” (http://www.kdgregory.com/index.php?page=java.refobj).

wiczenia

Celem poni�szych �wicze� jest sprawdzenie wiedzy wyniesionej z tego rozdzia�u, dotycz�cej podsta-wowych API jzyka Java.

1. Jakie sta�e deklaruje Math?

2. Dlaczego Math.abs(Integer.MIN_VALUE) jest równe Integer.MIN_VALUE?

3. Do czego s�u�y metoda random() klasy Math?

4. Nale�y wskaza� pi� warto�ci specjalnych, które mog� wyst�pi� w trakcie wykonywania oblicze�zmiennopozycyjnych.

5. Czym ró�ni� si klasy Math i StrictMath?

6. Do czego s�u�y s�owo strictfp?

7. Co to jest BigDecimal i do czego si u�ywa tej klasy?

Page 49: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

ROZDZIA� 6. � PODSTAWOWE INTERFEJSY API — CZ�� I

287

8. Która sta�a RoundingMode opisuje tryb zaokr�glania, o którym mówi si w szkole na lekcjach?

9. Co to jest BigInteger?

10. Do czego s�u�y metoda isSealed() klasy Package?

11. Metoda getPackage() wymaga, by z pakietu za�adowano co najmniej jeden plik klas, zanimzostanie zwrócony obiekt klasy Package opisuj�cy ten pakiet. Prawda czy fa�sz?

12. Nale�y wskaza� dwa najwa�niejsze zastosowania podstawowych klas opakowuj�cych.

13. Dlaczego powinno si unika� implementowania wyra�e� w stylu ch >= '0' && ch <= '9' (dosprawdzenia, czy ch zawiera cyfry) albo ch >= 'A' && ch <= 'Z' (aby sprawdzi�, czy chzawiera wielk� liter)?

14. Nale�y wskaza� cztery rodzaje osi�galno�ci.

15. Co to jest referent?

16. Która z klas API Reference jest odpowiednikiem metody finalize() klasy Object?

17. Zanim rozpowszechni�y si ekrany graficzne, czasami programi�ci wy�wietlali kszta�ty na ekra-nach tekstowych. Na przyk�ad okr�g móg� by� prezentowany w nastpuj�cy sposób:

* ********* ** ** ** ** * * * * ** ** * * * * * * ** ** * * * * * * ** ** * * * * ** ** ** ** ********* *

� Uwaga • Powy�sza figura ma kszta�t eliptyczny, a nie okr�g�y, poniewa� wy�wietlana wysoko�� ka�dejgwiazdki jest wiksza ni� jej wy�wietlana szeroko��. Gdyby wysoko�� i szeroko�� by�y takie same, figuramia�aby kszta�t okrgu.

Nale�y zaimplementowa� aplikacj Circle, która bdzie generowa� i wy�wietla� przedstawio-ny powy�ej okr�g. Najpierw aplikacja powinna tworzy� dwuwymiarow� tablic screen z�o�on�z 22 wierszy i takiej samej liczby kolumn. Ka�dy element tablicy trzeba zainicjalizowa� znakiemspacji (który wskazuje czysty ekran). Dla ka�dego konta o mierze ca�kowitoliczbowej z przedzia�u od 0do 360 nale�y obliczy� wspó�rzdne x i y w ten sposób, �e promie� o warto�ci 10 bdzie mno�onyprzez sinus i kosinus k�ta. Do warto�ci x i y nale�y doda� 11, aby kszta�t okrgu umie�ci� w �rodkutablicy screen. Punktowi o wynikowych wspó�rzdnych (x,y) nale�y przypisa� znak gwiazdki. Gdywykonywanie ptli dobiegnie ko�ca, nale�y zwróci� zawarto�� tablicy do standardowego wyj�cia.

Page 50: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

288

18. Liczba pierwsza to dodatnia liczba ca�kowita, która jest podzielna tylko przez jeden i przez siebiesam�. Nale�y utworzy� aplikacj o nazwie PrimeNumberTest, która bdzie sprawdza�, czyprzekazany do niej pojedynczy argument ca�kowitoliczbowy wskazuje liczb pierwsz�, czy inn� liczb,i wy�wietli stosowny komunikat. Na przyk�ad aplikacja wywo�ana poleceniem java PrimeNumber�Test 289 powinna zwróci� komunikat „289 nie jest liczb� pierwsz�”. Aby w prosty sposóbsprawdzi�, czy liczba jest liczb� pierwsz�, nale�y przej�� w ptli od liczby 2 do pierwiastka kwa-dratowego argumentu ca�kowitoliczbowego i wykorzysta� w tej ptli operator reszty z dzielenia.Za jego pomoc� mo�na sprawdzi�, czy argument jest podzielny przez indeks ptli. Na przyk�adze wzgldu na to, �e wyra�enie 6%2 ma warto�� 0 (6 jest podzielne przez 2), liczba ca�kowita 6nie jest liczb� pierwsz�.

PodsumowanieKlasa java.lang.Math uzupełnia standardowe operacje matematyczne (realizowane przezoperatory +, -, *, / oraz %) o możliwość wykonywania zaawansowanych operacji (na przy-kład obliczeń trygonometrycznych). Towarzysząca jej klasa java.lang.StrictMath zapew-nia, że wszystkie operacje zaawansowane dadzą ten sam wynik na wszystkich platformach.

Wartości pieniężne nigdy nie powinny być reprezentowane przez wartości zmienno-przecinkowe ani zmiennoprzecinkowe z podwójną precyzją, ponieważ nie wszystkie warto-ści pieniężne mają precyzyjną reprezentację. Natomiast klasa java.math.BigDecimal zapew-nia dokładną prezentację takich wartości oraz wykonywanie na nich precyzyjnych obliczeń.

Klasa BigDecimal wykorzystuje klasę java.math.BigInteger do reprezentowania swojejwartości niewyskalowanej. Instancja klasy BigInteger opisuje wartość całkowitoliczbową,która może być wartością o dowolnej długości (ograniczonej jedynie limitami pamięci do-stępnej dla maszyny wirtualnej).

Klasa java.lang.Package daje dostęp do informacji na temat pakietów. Informacje tezawierają wersję implementacji i specyfikacji pakietu języka Java, nazwę pakietu, a takżewskazanie, czy pakiet jest upakowany, czy nie.

Instancje podstawowych klas opakowujących Boolean, Byte, Character, Double, Float,Integer, Long i Short z pakietu java.lang stanowią opakowania dla wartości typów podstawo-wych. Klasy te przydają się do przechowywania wartości typów podstawowych w kolekcjach.

API References pozwala aplikacji na interakcję — w ograniczonym zakresie — z proce-sem odśmiecania. Pakiet java.lang.ref tego API zawiera klasy Reference, ReferenceQueue,SoftReference, WeakReference oraz PhantomReference.

Klasa SoftReference przydaje się do implementowania bufora obrazków, za pomocąklasy WeakReference można zapobiegać wyciekom pamięci potencjalnie zachodzącym w trakciepracy z mapami skrótów, zaś dzięki PhantomReference można sprawdzać, czy obiekt zostałjuż zniszczony i czy w związku z tym można wyczyścić powiązane z nim zasoby.

Zakończyliśmy dopiero pierwszy etap poznawania podstawowych interfejsów API języ-ka Java. W rozdziale 7. zapoznamy się z kolejnym podstawowym API — Reflection API,interfejsem do zarządzania ciągami znaków, klasą System, a także niskopoziomowym APIThreading.

Page 51: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

Skorowidz

Aabs(), 248, 256, 261abstract, 58, 139, 140AbstractCollection, 336AbstractList, 336AbstractMap, 336AbstractQueue, 336AbstractSequentialList, 336AbstractSet, 336abstrakcyjna

klasa, 139metoda, 140

accept(), 470, 471AccessibleObject, 334acos(), 248add(), 163, 256, 261, 344addAppts(), 132adnotacja, 208, 209

czas życia, 215Deprecated, 209metody pokrywającej, 209Override, 119, 209przetwarzanie, 217SuppressWarnings, 209, 211typ, 212znacznikowa, 212

algorytm, 205sortowanie bąbelkowe, 205szeregowania, 311

allOf(), 358alternatywa warunkowa, 66AND, 391

Android, 17, 21, 56aplikacja, 17Platforma, 21

annotation, 208annotationType, 296anonimowa klasa, 164, 166

potomna, 239anonymous class, 164API, 289, 335, 397, 415, 463, 540

Reference, 279Reflection, 333Threading, 307, 334

aplet, 21aplikacja, 21, 56, 289, 307

dla Androida, 17implementowanie, 56współbieżna, 397zinernacjonalizowana, 416zorientowana obiektowo, 57

append(), 524arcus cosinus kąta, 248arcus sinus kąta, 248arcus tangens kąta, 248argument, 74, 112

przekazywanie przez wartość, 108, 113typu rzeczywistego, 221, 224ukryty, 75wiersza poleceń, 23

Array, 296, 334arraycopy(), 304, 306, 334ArrayList, 336, 348Arrays, 387ASCII, 523

Page 52: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

602

asercja, 200, 203, 205, 207, 244włączanie, 208wyłączanie, 208

asin(), 248assert, 58, 200assertion, 200AssertionError, 200atan(), 248Atomic, 413atomowy, 318atrybut, 340

encji, 59klasy, 59obiektu, Patrz atrybut encji

automatycznepakowanie, 342

await(), 406

Bbajt, 60bariera

cykliczna, 406wymiany, 406

baza danych prosta, 479bazowa nazwa, 416bezpieczeństwo, 327

typów, 219biblioteka

kolekcji, 335, 396preferencji, 444, 461standardowa klas, 335

BigDecimal, 256BigDecimal(), 256BigInteger, 260BigInteger(), 261bin, 23binarne wyszukiwanie, 388binarySearch(), 388bit, 60

wynikowy, 65, 66bitowa koniunkcja, 65bitowe dopełnienie, 66bitowy operator, 66bitset, 356BitSet, 390blank final, 72BlockingQueue, 408blok, 76, 112

blokada, 319, 410wielowejściowa, 410

błąd, 181, 199standardowy, 23

boolean, 58, 60accept, 471accept(), 469equals(), 121

Boolean, 267, 268, 269break, 58, 81, 86BreakIterator, 425, 461BufferedInputStream, 504BufferedOutputStream, 504bufor, 504byte, 58, 60, 252Byte, 267ByteArrayInputStream, 487, 489ByteArrayOutputStream, 489

CCalendar, 433, 461capacity, 303, 376case, 58, 80catch, 18, 58, 188, 189, 192, 198ceil(), 248CEILING, 258char, 18, 58, 60, 461Character, 267, 270, 461charset, 528charValue(), 270checked exception, 184CheckingAccount, 58, 90, 109ciało

klasy, 58metody, 74

ciągznaków, 24, 129, 297, 334łączenie, 69

Circle, 226class, 18, 20, 58, 112

invariant, 206literal, 296

Class, 290, 297, 334ClassCastException, 219, 245classloader, 20, 173ClassNotFoundException, 293clear(), 279

Page 53: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

SKOROWIDZ

603

clone(), 121, 134pokrywanie, 240

close(), 194, 487Collator, 461Collection, 335, 338, 341Collections, 389Comparable, 227, 362compare(), 337, 364compareTo(), 226, 240, 268, 337, 364, 429compress(), 491ConcurrentLinkedQueue, 408ConcurrentMap, 408connect(), 174, 495const, 58constant interface, 179Constructor, 334continue, 58, 87control-flow invariant, 203convert(), 188copy(), 195cos(), 248cosinus kąta, 248countdown latch, 406CountDownLatch, 406createTempFile(), 473cukierek syntaktyczny, 298currentTimeMillis(), 304cyclic barrier, 406czas życia, 62

DDalvik, 22, 56data, 430DataInputStream, 506DataOutputStream, 506Date, 430deadlock, 327deal(), 43debugger, 27Deck, 38default, 58, 81defekt, 199deklaracja klasy, 58deleteOnExit(), 473deposit(), 75, 90, 109deprecated, 210Deprecated, 209deprecation, 211

deserializacja obiektu, 508domyślna, 508własna, 513

design by contract, 203developer(), 213Dictionary, 390disconnect(), 174divide(), 256, 261długość, 303do, 58, 85dodawanie, 65domena problemu, 36domknięcie, 166domyślna lokalizacja, 415dopasowanie

granic, 455o zerowej długości, 455

dopełnieniebitowe, 66, 71logiczne, 67, 71

dostępdo pola, 104, 113do składowej, 68

double, 18, 59, 247, 254Double, 60, 267, 271Double(), 272doubleValue(), 272do-while, 81, 84DOWN, 258downcasting, 140draw(), 138drzewo preferencji

systemowych, 444użytkownika, 444

dueDate(), 213dynamiczny język programowania, 21dziedziczenie, 19, 115, 116, 121, 156

implementacji, 115, 120, 130wielokrotne, 120

interfejsu, 115, 147, 149jednokrotne, 120wielokrotne, 120

dzielenie, 67

Eea, 208Eclipse, 27, 32, 56

instalacja, 32

Page 54: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

604

eksternalizacja, 517elastyczność kodu, 150, 156element, 213, 338

developer(), 213dueDate(), 213id(), 213tablicy, 61

else, 59, 78enableassertions, 208encja, 57, 112

abstrakcyjna, Patrz obiektenkapsulacja, 57, 131enqueue(), 279entities, Patrz encjaentry, 369entrySet(), 371enum, 59, 81, 235, 240, 245, 257, 356

rozszerzenie, 236Enum, 240, 242, 245enumeracja, 390enumerated type, 233EnumMap, 336, 383EnumSet, 336, 357epoka unixowa, 430equals(), 125, 268, 337, 344, 364

pokrywanie, 240erasure, 231Error, 198etykieta, 88, 89exception, 181Exception, 184, 198ExceptionInInitializerError, 293exchanger, 406Executor, 398, 460executors, 398ExecutorService, 399, 460exp(), 248extends, 18, 59, 116, 149, 224Externalizable, 517

Ffactorial(), 262fail-fast, 346false, 59, 63, 78, 268Field, 334FIFO, 365File, 463

FileDescriptor, 478FileFilter, 471FilenameFilter, 469FileOutputStream, 491FileReader, 531FileWriter, 529FilterInputStream, 501FilterOutputStream, 497filtrowany strumień, 497

wejściowy, 501wyjściowy, 497

final, 59, 72, 73, 116finalizacja, 127finalize(), 121, 127

pokrywanie, 240finally, 59, 192, 198find(), 451First In, First Out, Patrz FIFOfloat, 18, 59, 254Float, 60, 267, 271Float(), 271, 272floatToIntBits(), 272floatValue(), 272FLOOR, 258floor(), 248flush(), 487for, 18, 59, 81, 82formal type parameter list, 221format(), 255formater, 436

daty, 439komunikatu, 441liczby, 436

Formatter, 524forName(), 217, 292, 297fragile base class problem, 132free variable, 166funkcja

mieszająca, 374pierwszej kategorii, 166

Future, 401

Ggarbage collector, 110, 382generator

liczb pseudolosowych, 446liniowy kongruentny, 447

Page 55: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

SKOROWIDZ

605

genericmethod, 232type, 221

generics, 218get, 100get(), 280, 295, 378getAnnotation(), 217getAnnotations(), 294getBoolean(), 268getBundle(), 417, 418getClass(), 296, 297getCause(), 183getDateInstance(), 439getDeclaredAnnotations(), 294getDeclaringClass(), 240getDefault(), 415getFirstName(), 101getImage(), 282getImplementationTitle(), 264getImplementationVersion(), 264getInstance(), 437getLastName(), 101getMethods(), 217getMessage(), 183getName(), 101, 264getNumberInstance(), 437getObject(), 418getPackage(), 264getPackages(), 264getPriority(), 312getProperty(), 304getSpecificationTitle(), 264getSpecificationVendor(), 264getSpecificationVersion(), 264getter, 100getTimeInstance(), 439getTopCard(), 44głębokie

klonowanie, 123kopiowanie, 123

głowa kolejki, 223, 365główny

interfejs, 335plik klas, 54zbiór odwołań, 277

Google, 17, 22, 56Gosling James, 18goto, 59, 88

gra kareta, 36graf obiektu, 508granica dopasowanie, 455grep, 531Groovy, 21grupa przechwytywana, 454

HHALF_DOWN, 258HALF_EVEN, 258HALF_UP, 258hashCode(), 121, 128, 269, 344

pokrywanie, 240HashMap, 336, 374HashSet, 336, 353Hashtable, 390hasMoreElements(), 163hasNext(), 341headSet(), 359heterogeniczna lista, 220hierarchia klas

Throwables, 183wyjątków, 198

homogeniczna lista, 220

Iid(), 213IDE, 27, 28, 32, 56IdentityHashMap, 336, 380identyczność, 124identyfikacja typu w fazie wykonania, Patrz RTTIidentyfikator, 58

niezlokalizowany, 419if, 18, 59, 78if-else, 78, 79, 201Image, 282implementacja, 99, 112

dziedziczenie, 115, 120, 130interfejsu, 145, 156

implementowanieaplikacji, 56buforów pamięci podręcznej, 281

implements, 59, 145import, 59, 171, 180, 198

instrukcja, 171statyczny, 179

Page 56: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

606

indefinite postponement, 312indeks, 25, 82

tablicy, 65Infinity, 251informacji ukrywanie, 99InheritableThreadLocal, 307, 330, 334InheritableThreadLocal(), 331inicjalizowanie pola, 62, 113

tablicy, 64inicjalizująca konstrukcja, 93inicjowanie leniwe, 447initCause(), 183initialValue(), 330inner classes, 157InputStream, 485, 487, 540InputStreamReader, 526instanceof, 19, 59, 126, 142instancja, 57

klasy, 57, 333anonimowej, 166

konstrukcja inicjalizująca, 94, 98obiektu, 102rzucenie, 187

instrukcja, 76, 112do-while, Patrz do-whilefor, Patrz forgoto, Patrz gotoif-else, 78importu, 171kontynuacji, 87natywna, 20pakietu, 171prosta, 76, 112przerwania, 86

z etykietą, 88przypisania, 77pusta, 76switch, 80while, Patrz whilezłożona, 76, 112

int, 18, 59, 60Integer, 267Integrated Development Environment, Patrz IDEinterface, 59, 144, 212interfejs, 19, 99, 112, 115, 144, 150, 156, 179, 333

ciało, 144Collection, 338dziedziczenie, 147, 149

Executor, 398ExecutorService, 399Externalizable, 517FileFilter, 471FilenameFilter, 469główny, 335implementacja, 145, 156Iterable, 338List, 344Lock, 410Map.Entry, 372nagłówek, 144Queue, 365Set, 351SortedSet, 358stałych, 179wewnątrz klasy, 168znacznikowy, 145

intern(), 300internacjonalizacja, 414, 461internal invariant, 201interpreter, 20intrpretacja kodu bajtowego, 20invariant, 201is, 100is-a, Patrz relacja "jest"isAlive(), 313isAnnotationPresent(), 217isBlank(), 87isCompatibleWith(), 264isDigit(), 271isEmpty(), 38, 43isEnqueued(), 280isInfinite(), 272isLetter(), 271isLetterOrDigit(), 271isLowerCase(), 271isNaN(), 272ISO, 415isSealed(), 264isSorted(), 206isUpperCase(), 271isWhitespace(), 271Iterable, 335, 338, 341iteracja, 82, 83iterator(), 344iterowanie, 82

Page 57: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

SKOROWIDZ

607

Jjar, 23Jar, Patrz plik JARJava, 17, 18, 22, 56, 57

bezpieczeństwo, 19, 21EE, 21, 56kompilator, 20ME, 21, 56Platform

Enterprise Edition, Patrz Java EEMicro Edition, Patrz Java MEStandard Edition, Patrz Java SE

przenośność, 20Runtime Environment, Patrz JRESE, 21, 22, 56

Development Kit, Patrz JDKskładnia, 18

java program, 23java.lang, 334javac, 23Javadoc, 18, 23

komentarz, 40, 49znacznik, 50

JDK, 22, 27, 56, 512instalacja, 22

jednostronnie otwarty przedział, 359język

zorientowany obiektowo, 115programowania

dynamiczny, 21zorientowany obiektowo, 57

JIT, 20Joda Time, 436join(), 313jre, 23JRE, 22, 56

Kkalendarz, 430kanoniczna postać pola, 378kareta gra, 36katalog główny, 463keySet(), 371, 528klasa, 19, 57, 73, 111, 333

abstrakcyjna, 139anonimowa, 164, 166

instancja, 166

bazowa, 116kruchość, 132

ciało, 58, 112deklaracja, 58deklarowanie, 112final, 116główna, 157, 198implementująca, 335, 336instancja, 57kolekcji, 390kompatybilna zmiana, 512konstrukcja inicjalizująca, 93, 98literał, 296, 297lokalna, 166moduł ładowania, 173nadrzędna, 116nagłówek, 58narzędziowa, 254nazwa, 58niekompatybilna zmiana, 512niezmienna, 118, 255, 334opakowująca, 134

podstawowa, 267package-private, 99podrzędna, 116pole, 112

inicjalizowanie, 62pomocnicza, 335potomna, 116, 131, 133, 134, 141, 143

anonimowa, 239prywatna w ramach pakietu, 99przeglądarka, 289przodka, 132, 134, 141, 142, 143public, 99publiczna, 99rodzica, 116rozszerzanie, 115, 121, 134składowa

niestatyczna, 160, 164statyczna, 157

strumienia, 485, 486, 519, 541Throwables hierarchia, 183uogólniona, 218wartości, Patrz podstawowa klasa

opakowującawyjątku, 184

użytkownika, 185wywiedziona, 116zagnieżdżona, 157, 169, 198

Page 58: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

608

klasazakresu znaków, 453znaków, 453

część wspólna, 454predefiniowana, 454prosta, 453różnica, 454unia, 454zanegowana, 453

klient, 144klonowanie, 121

głębokie, 123płytkie, 121, 123

klucz, 369, 419zmienny, 380

klucz-wartość, 419, 443kod

bajtowy, 20interpretacja, 20weryfikator, 20

błędu, 181klienta, 101mieszający, 374, 378natywny, 20sprzątający

po rzuceniu wyjątku, 192przed rzuceniem wyjątku, 194

uzupełnień do dwóch, 260wariantu, 415współbieżny, 408wywołujący, 74źródłowy, 18

kodowanieHuffmana, 393znaków, 523

standard, 523koercja, 134, 135kolejka, 223, 365

głowa, 223, 365ogon, 223, 365priorytetowa, 365, 366pusta, 223wielopoziomowa ze sprzężeniem

zwrotnym, 311kolejność bajtów, 506kolekcja, 219, 335, 336, 396, 408

biblioteka, 335, 396klasa, 390konkretne klasy implementujące, 396

metody klasy Collections, 389stała, 340współbieżna, 460

kolizja, 375komentarz

Javadoc, 40, 49jednowierszowy, 59wielowierszowy, 75

komparator, 337kompatybilna zmiana klasy, 512kompilacja JIT, 20kompilator, 20

javac, 23JIT, 20Just In Time, Patrz kompilator JIT

kompozycja, 115, 130komunikat

formater, 441prosty, 440złożony, 440

koniunkcjabitowa, 65logiczna, 67warunkowa, 66

konkretne klasy implementujące kolekcje, 396konkretny typ, 221

parametryzowany, 222konstrukcja inicjalizująca, 93, 112

instancję, 94, 98klasę, 93, 98kolejność, 94metodę, 98pole

instancji, 93, 98klasy, 93

konstruktor, 91, 112chroniony, 99inicjalizujący obiekt klasy, 275klasy

ArrayList, 348BigDecimal, 256–57BigInteger, 261BitSet, 391BufferedOutputStream, 504ByteArrayInputStream, 490ByteArrayOutputStream, 490DataInputStream, 506DataOutputStream, 506Date \r, 431

Page 59: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

SKOROWIDZ

609

EnumMap, 383File, 464, 465FileInputStream, 492HashMap, 376HashSet, 353InputStreamWriter, 526LinkedList, 350Locale, 414MessageFormat, 441OutputStreamWriter, 525PipedInputStream, 494PipedOutputStream, 494PriorityQueue, 367Random, 447RandomAccessFile, 474String, 298–300StringBuffer, 301–3ThreadLocal, 329TreeMap, 373TreeSet, 352

package-private, 99private, 99protected, 99prywatny, 99

w ramach pakietu, 99przeciążanie, 92, 112public, 99publiczny, 99Throwables, 183

kontrakt, 144kontrola dostępu, 99

poziom, 99chroniony, 99prywatny, 99prywatny w ramach pakietu, 99publiczny, 99

kontrolowany wyjątek, 184, 198kopiowanie

głębokie, 123płytkie, 121

kowariancja, 230kowariantny typ, 142kursor, 347, 425

pozycja, 347wirtualny, 426

kwantyfikator, 456niechętny, 456, 457własnościowy, 456, 457zachłanny, 456

LLast In, First Out, Patrz LIFOleastDesirableCard(), 49length, 82, 303leniwe inicjowanie, 447lib, 23liczba

całkowita, 60bajtowa, 60, 70długa, 60, 70krótka, 60, 70

Eulera, 248pseudolosowa, 250zmiennopozycyjna, 60, 70

o podwójnej precyzji, 60, 70LIFO, 365liniowe wyszukiwanie, 388liniowy generator kongruentny, 447, 461LinkageError, 293LinkedHashMap, 336LinkedHashSet, 336LinkedList, 336, 349, 350List, 335, 344list(), 469lista, 344

heterogeniczna, 220homogeniczna, 220operacja na zakresach, 348parametrów, 74

typów formalnych, 221powiązana, 350

ListResourceBundle, 421listRoots(), 463litera, 428literał, 62

całkowitoliczbowy, 63klasy, 296, 297logiczny, 63typ, 63w postaci ciągu znaków, 63zmiennopozycyjny, 64znakowy, 63

load factor, 376local class, 166locale, 433Locale, 414, 425, 461Lock, 410log(), 132, 248

Page 60: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

610

log10(), 249logarytm, 249

naturalny, 248logging, 266logiczna koniunkcja, 67logiczne

dopełnienie, 67wyrażenie, 83

logiczny operator, 67, 68lokalizacja, 414, 416

domyślna, 415lokalizator, 414lokalizowanie, 416lokalna klasa, 166long, 18, 59Long, 60, 267lookingAt(), 451

łańcuch

nadrzędnej paczki zasobów, 418wywołań, 109, 113znaków porównywanie, 429

łącze, 349łączenie ciągów znaków, 69łączność, 70

operatorówlewostronna, 71prawostronna, 71

Mmain(), 24, 75, 122manifest, 267MANIFEST.MF, Patrz plik manifestumap, 369Map, 335, 382Map.Entry, 372mapa, 369

mieszająca, 378uporządkowana, 384

mark(), 487marker annotations, 212markSupported(), 487maskowanie zmiennej typu, 227maszyna wirtualna, 20, 56Matcher, 461Math, 247, 461

max(), 249, 256, 261MAX_VALUE, 271mechanizm ogólny, 218, 220Media, 188metaadnotacja, 214, 216, 245meta-annotations, 214metadane, 208, 245, 475metaznak, 449Method, 334metoda, 58, 73, 112, 333

łańcuch wywołań, 109klasyInteger, 275abs(), 248, 256, 261

przeciążanie, 252abstrakcyjna, 140, 239accept(), 469, 470, 471acos(), 248add(), 163, 256, 261, 344addAppts(), 132allOf(), 358append(), 524arraycopy(), 304, 306, 334asin(), 248atan(), 248await(), 406BigDecimal(), 256BigInteger(), 261binarySearch(), 388ceil(), 248charValue(), 270chroniona, 99ciało, 74clear(), 279clone(), 121, 134

pokrywanie, 240close(), 194, 487compare(), 337, 364compareTo(), 226, 240, 268, 337, 364, 429compress(), 491connect(), 174, 495convert(), 188copy(), 195cos(), 248createTempFile(), 473currentTimeMillis(), 304deal(), 43deklarowanie, 73deleteOnExit(), 473

Page 61: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

SKOROWIDZ

611

deposit(), 75, 90, 109disconnect(), 174divide(), 256, 261dopasowująca, 449doubleValue(), 272draw(), 138enqueue(), 279entrySet(), 371equals(), 121, 125, 268, 337, 344, 364

pokrywanie, 240exp(), 248fabrykująca klasy

BreakIterator, 425DateFormat, 439

factorial(), 262finalize(), 121, 127

pokrywanie, 240find(), 451floatToIntBits(), 272floatValue(), 272floor(), 248flush(), 487format(), 255forName(), 217, 292, 297get(), 280, 295, 378getAnnotation(), 217getAnnotations(), 294getBoolean(), 268getBundle(), 417, 418getClass(), 121, 296, 297getDateInstance(), 439getDeclaredAnnotations(), 294getDeclaringClass(), 240getDefault(), 415getFirstName(), 101getImage(), 282getImplementationTitle(), 264getImplementationVendor(), 264getImplementationVersion(), 264getInstance(), 437getLastName(), 101getMethods(), 217getName(), 101, 264getNumberInstance(), 437getObject(), 418getPackage(), 264getPackages(), 264getPriority(), 312

getProperty(), 304getSpecificationTitle(), 264getSpecificationVendor(), 264getSpecificationVersion(), 264getTimeInstance(), 439getTopCard(), 44hashCode(), 128, 269, 344

pokrywanie, 240hasMoreElements(), 163hasNext(), 341headSet(), 359initialValue(), 330instancji, 75int hashCode(), 121interfejsu

Collection, 338–40ExecutorService, 399–401Externalizable, 517Future, 402list, 344–46ListIterator, 346–47Map, 371Map.Entry, 373Queue, 366SortedMap, 386SortedSet, 360

intern(), 300isAlive(), 313isAnnotationPresent(), 217isBlank(), 87isCompatibleWith(), 264isDigit(), 271isEmpty(), 38, 43isEnqueued(), 280isInfinite(), 272isLetter(), 271isLetterOrDigit(), 271isLowerCase(), 271isNaN(), 272isNegative(), 269isSealed(), 264isSorted(), 206isUpperCase(), 271isWhitespace(), 271iterator(), 344join(), 313keySet(), 371, 528

Page 62: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

612

metodaklasy, 75

Arrays, 388BigDecimal, 256–57BigInteger, 261BitSet, 391Boolean, 268, 269BreakIterator, 425, 426Calendar, 433Collator, 429Collections, 389Date, 431File, 466, 468, 470, 473, 475FileDescriptor, 478InputStream, 488InputStream, 489Math, 248–50OutputStream, 488Package, 264Pattern, 450PatternSyntaxException, 451PipedInputStream, 495PipedOutputStream, 494Random, 448RandomAccessFile, 478Reference, 279ReferenceQueue, 280String, 298–300StringBuffer, 301–3System, 305Thread, 308–9ThreadLocal, 329AccessibleObject, 296Class, 290–92Constructor, 294–95Field, 295Method, 295–96Object, 121

konstrukcja inicjalizująca, 98leastDesirableCard(), 49list(), 469listRoots(), 463log(), 132, 174, 248log10(), 249lookingAt(), 451main(), 24, 75, 122mark(), 487markSupported(), 487

max(), 249, 256, 261przeciążanie, 252

min(), 249, 256, 261przeciążanie, 252

multiply(), 257, 261name(), 241narzędziowa klasy

Character, 270Double, 272Float, 272Preferences, 444

natywna, 504nazwa, 73negate(), 257, 261newLogger(), 175next(), 341, 347nextElement(), 163nextIndex(), 347niestatyczna, 232notify(), 121, 323notifyAll(), 121object clone(), 121odczytująca, 100of(), 358offer(), 365ogólna, 232

parametr typu, 233ordinal(), 49, 241outputList(), 228package-private, 99parseBoolean(), 269parseFloat(), 272pokrywająca, 142

adnotacja, 209pokrywanie, 118, 124, 130, 132pomocnicza, 99precision(), 257previous(), 347previousIndex(), 347print(), 520printBalance(), 73, 77, 109println(), 24, 520printReport(), 109printStackTrace(), 183private, 99protected, 99prywatna, 99prywatna w ramach pakietu, 99

Page 63: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

SKOROWIDZ

613

przeciążanie, 91, 112, 119przeciążona, 469przekazująca, 133public, 99publiczna, 99put(), 378putBack(), 43random(), 249range(), 358rank(), 41read(), 501, 504readLine(), 85ready(), 525remainder(), 257, 261remove(), 341, 344reset(), 487rnd(), 251round(), 249run(), 307, 315scale(), 257set(), 433setFirstName(), 101setLastName(), 101setName(), 101setScale(), 257setText(), 427setTopCard(), 44showUsage(), 83shuffle(), 43, 448signum(), 249sin(), 250sortowania, 364split(), 217sqrt(), 250StackTraceElement[] getStackTrace(), 183statyczna, 232stos wywołań, 107, 113submit(), 402subSet(), 359subtract(), 257, 261sygnatura, 74T childValue(T parentValue), 331tailSet(), 359tan(), 250Throwable getCause(), 183Throwable initCause(Throwable cause), 183Throwable(), 183Throwables, 183toDegrees(), 250, 253

toLowerCase(), 271topCard(), 44toRadians(), 250, 253toString(), 121, 129, 132, 238, 257, 261, 269, 301

pokrywanie, 240toUpperCase(), 271ustawiająca, 100valueOf(), 241, 269values(), 371void, 89wait(), 121, 323withdraw(), 75write(), 498, 504, 525wyjście, 89wywołanie, 62, 68, 77, 106, 113zwracanie wartości, 90

miara kąta przekształcenie, 250MIDlet, 21mieszająca funkcja, 374mieszający kod, 374mieszanie, 128miękkie odwołanie, 278min(), 249, 256, 261MIN_VALUE, 271minus unarny, 70, 71mnożenie, 68moduł, 178

ładowania klas, 173monitor, 319multiply(), 257, 261

Nnadrzędna ścieżka, 465nagłówek klasy, 58najmniejsza wartość, 248największa wartość, 248, 249name(), 241namespaces, 169narzędzia wspomagające współbieżność, 397native, 59naturalne porządkowanie obiektów, 226natywna instrukcja, 20natywny kod, 20Naughton Patrick, 18nazwa

bazowa, 416klasy, 58rodziny, 416

Page 64: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

614

negate(), 257, 261NEGATIVE_INFINITY, 271nested classes, 157NetBeans, 27, 28, 56

instalacja, 28obszar

edytora, 31nawigatora, 31projektu, 30zadań, 31

new, 59, 102, 113newLogger(), 175next(), 341, 347nextElement(), 163nextIndex(), 347niedomknięty przedział, 362niekompatybilna zmiana klasy, 512niekontrolowany wyjątek, 184nieosiągalny obiekt, 278nierówność, 67niestatyczna klasa składowa, 160, 164niezmiennik, 201, 203

klas, 206sterowania przebiegiem wykonania, 244sterujący przebiegiem wykonania, 203wewnętrzny, 201, 244

niszczenie obiektów, 110, 113nonstatic member class, 160normalizowanie ścieżki, 465notify(), 121, 323notifyAll(), 121, 323null, 59NumberFormat, 255, 438

OOak, 18obiekt, 19, 57, 73, 110, 111, 115

błędu, 182Deck, 38deserializacja, 508instancja, 102naturalne porządkowanie, 226nieosiągalny, 278niszczenie, 110odwołanie, 102osiągalny, 278

miękko, 278silnie, 278

słabo, 278złudnie, 278

rzucany, 182serializacja, 508tworzenie, 68, 102wyjątku, 182

Object, 121, 296metody, 121

object clone(), 121ObjectOutputStream, 509obsługa wyjątku, 188, 198

rzucanego, 188obszar

edytora, 31nawigatora, 31projektu, 30zadań, 31

obustronnie domknięty przedział, 362odejmowanie, 69odraczanie w nieskończoność, 312odśmiecania proces, 278odśmiecanie, 110, 113odwołanie, 102

do obiektu, 113miękkie, 278silne, 278słabe, 278złudne, 279

of(), 358offer(), 365ogon kolejki, 223, 365ogólna metoda, 232ograniczenie

argumentów typu rzeczywistego, 224dolne, 226górne, 224

typu rekurencyjne, 227ONE, 260opakowująca klasa, 134opakowywanie wartości typu, 342operacja

wejścia-wyjścia, 487, 504, 524, 540na zakresach listy, 348

operand, 65, 66, 67, 68, 69, 70operator, 62, 65, 66

alternatywa warunkowa, 66arytmetyczny, 18binarny, 65bitowa koniunkcja, 65

Page 65: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

SKOROWIDZ

615

bitowe dopełnienie, 66bitowy, 66dodawanie, 65dopełnienie

logiczne, 71bitowe, 71

dostęp do składowej, 68dostępu, 105, 113dzielenie, 67indeks tablicy, 65koniunkcja

logiczna, 67warunkowa, 66

logiczna koniunkcja, 67logiczne dopełnienie, 67logiczny, 67, 68łączenie ciągów znaków, 69łączność

lewostronna, 71prawostronna, 71

mnożenie, 68new, 102, 113nierówność, 67odejmowanie, 69postdekrementacja, 68postinkrementacja, 68predekrementacja, 68, 71preinkrementacja, 68, 71priorytet, 70przeciążanie, 19przedrostkowy, 65przesunięcia, 19

w lewo, 67w prawo bez znaku, 70w prawo ze znakiem, 69

przypisanie, 65, 71złożone, 66, 71

przyrostkowy, 65relacyjne sprawdzenie typu, 69relacyjny, 68, 69reszta z dzielenia, 69równość, 67rzutowanie, 66, 71trójskładnikowy, 65tworzenie obiektu, 68, 71unarny, 65

minus, 70, 71plus, 70, 71

warunek, 66warunkowa

alternatywa, 66koniunkcja, 66

warunkowy, 18, 71włączający, 66, 68wyłączający, 66, 67wywołanie metody, 68wzrostkowy, 65

opróżnienie zawartości buforów, 478OR, 391Oracle, 18ordinal(), 49, 241osiągalny obiekt, 278outputList(), 228OutputStream, 485, 487, 491, 540OutputStreamWriter, 525Override, 209

Ppackage, 59, 169, 171package-private, 99paczka

właściwości, 419zasobów, 416

w formie listy, 421nadrzędna łańcuch, 418

pakiet, 169, 171, 178, 198, 263bez nazwy, 171instrukcja, 171logging, 266nazwa, 170podrzędny, 171upakowany, 263

pakowanie automatyczne, 342parameterized type, 220parametr, 74, 112, 135

typu, 221, 222metody ogólnej, 233nieograniczony, 224ograniczony, 224widoczność, 226zasięg, 226

parametryczność, 135parent, 465parseBoolean(), 269parseFloat(), 272

Page 66: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

616

parsowanie, 269partycja, 469Pattern, 449, 461pętla, 76, 81, 86

do-while, 81, 84for, 81, 82nieskończona, 86

przerwanie, 86while, 19, 81, 87, 341zagnieżdżona, 88zmienna sterująca, 82

PhantomReference, 279, 284pierwiastek kwadratowy, 250PipedInputStream, 494PipedOutputStream, 494platforma, 17, 19, 20, 56

Android, 21kolekcji, 268

języka Java, 219plik

binarny, 492JAR, 54, 178, 263, 267Java ARchive, 54klasy, 20

główny, 54manifestu, 54tymczasowy, 473właściwości, 419, 443wyjściowy, 25

plus unarny, 70, 71płytkie

klonowanie, 121, 123kopiowanie, 121

początkowa pojemność, 348podrzędny typ, 135podstawowa klasa opakowująca, 267

Character, 270Point, 230pojemność, 303, 376

początkowa, 348pokrywanie metody, 118, 124, 130, 132pole, 58, 59, 112, 333, 479

chronione, 99deklarowanie, 59dostęp, 104, 113finalne puste, 72identyfikator, 59instancji, 61, 105, 112

konstrukcja inicjalizująca, 93, 98

klasy, 62, 112inicjalizowanie, 62konstrukcja inicjalizująca, 93

package-private, 99postać kanonicza, 378poziom dostępu, 105private, 99, 105protected, 99prywatne, 99, 105, 117

w ramach pakietu, 99public, 99, 105publiczne, 99, 105tablicowe, 61tylko do odczytu, 72typ, 59wartość, 62zaciemnianie, 105, 113

polimorfizm, Patrz wielopostaciowośćporównywanie

łańcuchów znaków, 429tekstów, 429

porządek, 336alfabetyczny, 336leksykograficzny, 336naturalny, 336słownikowy, Patrz porządek alfabetyczny

porządkowa wartość, 241POSITIVE_INFINITY, 271posortowana mapa, 528postcondition, 205postdekrementacja, 68postinkrementacja, 68poziom dostępu, 105, 112

chroniony, 112prywatny, 112prywatny w ramach pakietu, 112publiczny, 112

pozycja kursora, 347późne wiązanie, 138precision(), 257precondition, 204precyzja, 255predefiniowana klasa znaków, 454predekrementacja, 68, 71preemptive scheduling, 311preferencja, 443, 461

biblioteka, 444preinkrementacja, 68, 71

Page 67: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

SKOROWIDZ

617

previous(), 347previousIndex(), 347primitive wrapper classes, 267print(), 520printBalance(), 73, 77, 109println(), 24, 520printReport(), 109PrintStream, 519, 522priority, 312PriorityQueue, 336, 366, 367priorytet, 311, 312

operatora, 70private, 59, 99, 112problem

bazowy, 108kruchości klasy bazowej, 132wiszącego else, 79

profilowanie kodu, 151projektowanie zgodnie z kontraktem, 203, 244Properties, 390, 443property, 419protected, 59, 99, 112, 122przechwytywana grupa, 454przeciążanie, 135

konstruktora, 92, 112metody, 91, 112, 119

przedziałczasowy, 311jednostronnie otwarty, 359niedomknięty, 362obustronnie domknięty, 362

przeglądarka klasy, 289przekazująca metoda, 133przekazywanie, 133

przez wartość, 108przenośność, 20przerwanie, 86przestarzały element, 209przestrzeń nazw, 169przesunięcie

w lewo, 67w prawo

bez znaku, 70ze znakiem, 69

przetwarzanie adnotacji, 217przodek, 121przyczyna, 183przypisanie, 65, 71

złożone, 66, 71

pseudokod, 36, 56przekształcenie na kod, 38

public, 18, 59, 99, 112pula wątków, 397punkt kodowy, 523puste pole finalne, 72put(), 378putBack(), 43

Qqueue, 223, 365Queue, 223, 335, 365

Rrace condition, 318Random, 447, 461random(), 249, 251, 461RandomAccessFile, 474, 476, 479, 540range(), 358rank(), 41read(), 501, 504Reader, 524, 525readLine(), 85ready(), 525ReentrantLock, 410refaktoryzacja, 87Reference, 279ReferenceQueue, 279, 280referencja wsteczna, 455Reflection API, 289refleksja, 142, 289, 333regex, 449regexp, 449reification, 230rejestrator, 174rekord, 479rekurencja, 107, 113rekurencyjne ograniczenie typu, 227relacja „jest”, 116relacyjne sprawdzenie typu, 69relacyjny operator, 68, 69remainder(), 257, 261remove(), 341, 344reset(), 487ResourceBundle, 418reszta z dzielenia, 69Retention, 215

Page 68: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

618

return, 59, 89, 90this, 109

rnd(), 251rodziny nazwa, 416root set of references, 277round robin scheduling, 311round(), 249RoundingMode, 257rozgłaszanie zdarzeń, 423rozpakowywanie, 343rozszerzanie klasy, 115, 121, 134równość, 67RTTI, 141, 289run(), 307, 315Runnable, 307, 334runtime type identification, Patrz RTTIRuntimeException, 184, 198rzucany obiekt, 182rzucenie

instancji, 187wyjątku, 186, 198, 315

kod sprzątający po, 192kod sprzątający przed, 194ostatnie, 191

rzutowanie, 66, 71, 252w dół, 140, 143w górę, 136, 143

Sscale(), 257ScheduledExecutorService, 460ScrambledInputStream, 501ScrambledOutputStream, 498sealed(), 263sekcja

inicjalizacyjna, 82test, 82uaktualnienia, 82

sekcja krytyczna, 319sekwencja, 344

ucieczki, 63Unicode, 63

sekwencja znaków, 334selektor

wyrażenie, 80semafor, 406semaphore, 406

separator, 49, 58, 464, 465Serializable, 513serializacja obiektu, 508

domyślna, 508nieograniczona, 508własna, 513

serialver, 512Servlet API, 21serwlet, 21set, 100, 351Set, 335, 357, 364set(), 433setFirstName(), 101setLastName(), 101setName(), 101setScale(), 257setter, 100setText(), 427setTopCard(), 44Shape, 139Sheridan Mike, 18short, 18, 59, 60, 252Short, 267showUsage(), 83shuffle(), 43, 448signum(), 249silne odwołanie, 278silnia, 107sin(), 250sinus kąta, 250skala, 255składnia, 18, 63

ucieczki, 63składowa dostęp, 68skrót, 66słabe odwołanie, 278słowo zastrzeżone, 58SoftReference, 279, 280SortedMap, 335, 384SortedSet, 335, 358, 364sortowanie, 364

bąbelkowe, 205specyfikator formatu, 521split(), 217, 301sprawdzanie identyczności, 124sprzątający kod, 192, 194sqrt(), 250Stack, 390

Page 69: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

SKOROWIDZ

619

StackTraceElement[] getStackTrace(), 183stała, 73

fazy kompilacji, 73typu RoundingMode, 258

standardowa biblioteka klas, 20, 335standardowe

wejście, 23, 25, 334wejście-wyjście, 23wyjście, 23, 25, 334

standardowy błąd, 23, 334starvation, 312static, 59, 73, 93, 112, 157statyczna klasa składowa, 157sterta, 102, 113stos, 365

wyjątków, 315wywołań metod, 107, 113

strefa czasowa, 430strictfp, 18, 59, 253StrictMath, 253String, 59, 297, 301, 336, 429StringBuffer, 125, 301struktura danych, 57, 223strumień, 485

filtrowany, 497, 501klasa, 485, 486wejściowy, 485

dekompresujący dane, 486filtrowany, 501

wyjściowy, 485filtrowany, 497kompresujący dane, 486

Stub, 215submit(), 402Subset, 160subSet(), 359subtract(), 257, 261Sun Microsystems, 17, 18super, 59, 117super(), 117SuppressWarnings, 209, 211Swing, 423switch, 18, 59, 80, 202swobodny dostęp, 474sygnatura metody, 74symbol wieloznaczny, 222, 228synchronizacja, 319, 320, 327, 410

synchronizator, 406, 460bariera

cykliczna, 406wymiany, 406

semafor, 406zatrzask zliczający w dół, 406

synchronized, 18, 59, 410syntetyczna zmienna, 165synthetic variable, 165System, 304System.err, 25System.out, 24, 25system plików, 463szeregowania algorytm, 311szeregowanie

karuzelowe, 311wyprzedzające, 311

�ścieżka, 464

bezwzględna, 465nadrzędna, 465nazwa, 464normalizowanie, 465względna, 465

środowiskoleksykalne, 166programistyczne, 56

Eclipse, 56, Patrz EclipseIDE, 56, Patrz IDEJDK, Patrz JDKNetBeans, 56, Patrz NetBeans

wykonawcze, 20, 56

TT childValue(T parentValue), 331tablica, 61, 82

dwuwymiarowa, 61, 104, 113inicjalizacja, 104

element, 61implementacja, 103indeks, 65, 82inicjalizowanie pól, 64jednowymiarowa, 61, 113kowariancja, 230metoda klasy Arrays, 387

Page 70: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

620

tablicatworzenie, 103uściślanie, 230wartości, 113wyszukiwanie, 388

tablicowy typ, 222tailSet(), 359tan(), 250tangens kąta, 250Target, 214TEN, 260this, 59, 93, 105, 112, 113, 164Thread, 307, 312, 334ThreadGroup, 307, 334Threading, 307ThreadLocal, 307, 329, 334threads, 307throw, 59, 186, 187, 198Throwable, 198Throwable(), 183throwables, 182throws, 59, 186, 187, 189, 198toDegrees(), 250, 253token, 238, 269, 319Token, 238toLowerCase(), 271topCard(), 44top-level classes, 157toRadians(), 250, 253toString(), 121, 129, 132, 238, 257, 261, 269, 301

pokrywanie, 240toUpperCase(), 271transient, 18, 59, 510TreeMap, 336, 373, 386TreeSet, 336, 351, 352true, 59, 63, 78TRUE, 268try, 18, 59, 188, 189, 192, 198tworzenie obiektu, 68, 71, 102typ, 58

abstrakcyjny, 152adnotacji, 212, 333

Retention, 215Stub, 215Target, 214

całkowitoliczbowy, 70char, 60konkretny, 221

kowariantny, 142liczbowy, 60, 70literału, 63logiczny, 60ogólny, 221, 245

surowy, 222własny, 222

ograniczenie rekurencyjne, 227parametryzowany, 220, 221, 227

konkretny, 222podrzędny, 135, 228podstawowy, 60pola, 59, 62surowy, 222, 228tablicowy, 222wyliczeniowy, 81, 233, 234, 245, 333

enum, Patrz enumwynikowy, 74znakowy, 60

Uuchwyt, 102, 113, 182, 478ukrywanie

implementacji, 102informacji, 99, 112

unarnyminus, 70, 71plus, 70, 71

unchecked, 211exception, 184

unia klas znaków, 454Unicode, 60, 414, 429, 461, 523unikalny identyfikator strumienia, 512unnamed package, 171UNNECESSARY, 258UP, 258upakowany pakiet, 263upcasting, 136uporządkowana mapa, 384uporządkowany zbiór, 358ustawienia konfiguracyjne, 443usuwanie, 231

nieużytków, 382uściślanie, 230

tablica, 230UTF, 523

Page 71: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

SKOROWIDZ

621

VvalueOf(), 241, 269values(), 371variant, 415Vector, 390void, 59, 74, 89volatile, 59, 323

Wwait(), 121, 323wartość

bezwzględna, 248, 250pola, 62porządkowa, 241specjalna, 251zlokalizowana, 419

warunek, 66, 323końcowy, 205początkowy, 204wyścigu, 318

warunkowaalternatywa, 66koniunkcja, 66

warunkowy operator, 71wątek, 307, 320, 334

potomka, 330pula, 397rodzica, 330synchronizacja, 319zmienna lokalna, 329

wczesne wiązanie, 138WeakHashMap, 336, 382WeakReference, 279, 283weryfikator kodu bajtowego, 20węzeł, 349

inode, 393klasy Preferences, 444

węzły powiązane, 349while, 18, 19, 59, 81, 83, 85, 87, 341wiązanie

późne, 138wczesne, 138

widoczność parametrów typu, 226widok, 348wielokrotne dziedziczenie implementacji, 120wielopostaciowość, 19, 115, 134, 135, 156, 227wieloznaczny symbol, 222

wiersz poleceń, 23argument, 23

wirtualnysystem plików, 463kursor, 426

withdraw(), 75własny typ ogólny, 222właściwość, 340włączający operator, 66, 68włączanie asercji, 245wolna zmienna, 166wpis, 369wrapper class, 134write(), 498, 504, 525Writer, 524wskaźnik, 19

pliku, 476wskrzeszenie, 284współbieżna aplikacja, 397współbieżnie wykonywane wątki, 311współbieżność, 460

narzędzia wspomagające, 397współbieżny kod, 408współczynnik zapełnienia, 376wsteczna referencja, 455wyciek pamięci, 110, 113wyjątek, 180, 181, 198

fazy wykonania, 184kontrolowany, 184, 189, 198niekontrolowany, 184, 198rzucenie, 198

wykonawca, 398wyłączający operator, 66, 67wyrażenie, 62

logiczne, 83proste, 62, 65regularne, 449złożone, 65

wyszukiwaniebinarne, 388liniowe, 388w fazie

kompilacji, 173wykonania, 173

wyścigu warunek, 318wywołanie

metody, 62, 68, 77, 106, 113rekurencyjne, 107zwrotne, 134

Page 72: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano

JAVA. PRZYGOTOWANIE DO PROGRAMOWANIA NA PLATFORM� ANDROID

622

wzajemne wykluczanie, 319wzorzec, 441, 449, 461

projektowy Dekorator, 134

XXlet, 21XOR, 391

Zzaciemnianie pola, 105, 113zadanie, 398zagłodzenie wątku, 312zakleszczenie, 327zakończenie wiersza, 453zaokrąglenie, 258

liczby, 249zapełnienia współczynnik, 376zarządzanie zasobami automatyczne, 196zasięg, 62

parametrów typu, 226zatrzask zliczający w dół, 406zbiór, 351

bitowy, 356uporządkowany, 358

zdarzenie rozgłaszanie, 423ZERO, 260

zestaw znaków, 523, 528automatycznie wykrywany, 528

ziarno, 447zintegrowane środowisko programistyczne IDE,

Patrz IDEzłożone przypisanie, 66złudne odwołanie, 279zmienna, 59, 62, 112

atomowa, 413, 460lokalna, 76

deklaracja, 76wątku, 329

nazwa, 76odwołania, 103sterująca pętlą, 82syntetyczna, 165wielowartościowa, 61wolna, 166

zmienny klucz, 380znacznik Javadoc, 50znak

dopasowania granic, 455liczby, 249, 250separatora, 464

zone, 433

żywotność, 327

Page 73: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano
Page 74: Java. Przygotowanie do programowania na platformę Android...java.lang, java.lang.ref i java.math. Interfejsy API do wykonywania oblicze matematycznych W rozdziale 2. zaprezentowano