"JAVA. Uniwersalne techniki programowania"
Identyfikator Librowy: 149595
Spis treści
Wstęp 10
1. Klasy 14
1.1. Abstrakcja i hermetyzacja 16
1.2. Enumeracje 18
1.3. Definiowanie klas 23
1.4. Wykorzystanie składowych statycznych 26
1.5. Przeciążanie metod i konstruktorów 27
1.6. Klasy i obiekty niezmienne 28
1.7. Inicjowanie 29
1.8. Singletony 36
1.9. Klasy opakowujące typy proste 37
2. Ponowne wykorzystanie klas 42
2.1. Dziedziczenie 44
2.2. Konwersje referencyjne 49
2.3. Stwierdzanie typu 51
2.4. Dziedziczenie w Javie 53
2.5. Przedefiniowanie metod 53
2.6. Kowariancja typów wyników 57
2.7. Przedefiniowanie metod w wyliczeniach 58
2.8. Przedefiniowanie a wyjątki 59
2.9. Przedefiniowanie a przeciążanie, przesłanianie i pokrywanie 60
2.10. Adnotacja @override 61
2.11. Metody wirtualne i polimorfizm 63
2.12. Kompozycja 68
2.13. Kompozycja a dziedziczenie 69
2.14. Reguły ponownego wykorzystania klas 72
3. Wyjątki 74
3.1. Obsługa wyjątków 76
3.2. Zgłaszanie wyjątków 84
3.3. Ponowne zgłaszanie wyjątków 86
3.4. Niskopoziomowe przyczyny i łańcuchowanie wyjątków 91
3.5. Wykorzystanie informacji o śladzie stosu 92
4. Interfejsy i klasy wewnętrzne 94
4.1. Metody i klasy abstrakcyjne 96
4.2. Pojęcie interfejsu 98
4.3. Problem wielodziedziczenia 98
4.4. Definiowanie i implementowanie interfejsów 100
4.5. Interfejsy jako typy danych 103
4.6. Implementacja metod w interfejsach 107
4.7. Mixiny 108
4.8. Właściwości metod domyślnych 109
4.9. Prywatne metody w interfejsach 112
4.10. Pojęcie klasy wewnętrznej 114
4.11. Przykładowe zastosowanie klasy wewnętrznej 115
4.12. Anonimowe klasy wewnętrzne 118
4.13. Lokalne klasy wewnętrzne 120
5. Typy i metody sparametryzowane (generics) 124
5.1. Definiowanie typów sparametryzowanych. Typy surowe i czyszczenie typów 126
5.2. Ograniczenia parametrów typu 129
5.3. Restrykcje 130
5.4. Metody sparametryzowane 132
5.5. Uniwersalne argumenty typu 132
6. Elementy programowania funkcyjnego w Javie 8. Przegląd pragmatyczny 138
6.1. O programowaniu funkcyjnym 140
6.2. Interfejsy na pomoc 141
6.3. Lambda-wyrażenia: pierwsze spotkanie 142
6.4. O gotowych interfejsach funkcyjnych 145
6.5. O przetwarzaniu strumieniowym 146
7. Lambda-wyrażenia 150
7.1. Interfejsy funkcyjne i lambda-wyrażenia 152
7.2. Składnia i cechy lambda-wyrażeń 153
7.3. Referencje do metod i konstruktorów 159
7.4. Gotowe interfejsy funkcyjne 162
7.5. Interfejsy z pakietu java.util.function a wyjątki kontrolowane 170
7.6. Lambda-wyrażenia i obiekty typu Optional 173
8. Proste narzędzia 178
8.1. Analiza składniowa tekstów i wyrażenia regularne 180
8.2. Uproszczenia stosowania wyrażeń regularnych w klasach String i Scanner 192
8.3. Działania na liczbach 200
8.4. Daty i czas 205
8.4.1. Tradycyjna klasa Calendar i operacje na datach 205
8.4.2. Daty i czas w Javie 8 – elementy nowego API 211
8.5. Formatowanie liczb i dat 218
8.6. Metody tablicowe 223
9. Kolekcje 226
9.1. Architektura kolekcji (JCF). Interfejsy i implementacje 228
9.2. Programowanie w kategoriach interfejsów 232
9.3. Ogólne operacje na kolekcjach 234
9.4. Operacje opcjonalne oraz wyjątki zgłaszane przez metody kolekcyjne 235
9.5. Przekształcanie kolekcji. Kolekcje z tablic 236
9.6. Przykłady ogólnych operacji na kolekcjach 238
9.7. Iterowanie po kolekcjach 244
9.7.1. Tradycyjny iterator i rozszerzone for 244
9.7.2. Iteracje wewnętrzne 248
9.7.3. Spliteratory 250
9.7.4. Konkurencyjne modyfikacje 257
9.8. Listy 259
9.8.1. Podstawowe implementacje i operacje 259
9.8.2. Szczególne implementacje list: niuanse metody Arrays.asList(...) 265
9.8.3. Iteratory listowe 268
9.8.4. Przykłady operacji na listach 270
9.9. Kolejki 274
9.10. Zbiory typu HashSet, metody hashCode() i equals() 277
9.11. Porównywanie i porządkowanie elementów kolekcji 284
9.12. Zbiory uporządkowane i nawigowalne 292
9.13. Mapy 294
9.13.1. Wprowadzenie 294
9.13.2. Implementacje i interfejsy. Ogólne operacje na mapach 297
9.13.3. Iterowanie po mapach 302
9.13.4. Użycie domyślnych metod interfejsu Map 305
9.13.5. Sortowanie map 308
9.14. Algorytmy, widoki, fabrykatory kolekcji 314
9.15. Własne implementacje kolekcji 317
10. Przetwarzanie strumieniowe 318
10.1. Pojęcie strumienia. Rodzaje i cechy operacji strumieniowych 320
10.2. Uzyskiwanie strumieni 322
10.3. Przegląd operacji na strumieniach 323
10.4. Filtrowanie i leniwość strumieni 326
10.5. Metoda forEach dla strumieni 327
10.6. Sortowanie strumieni 328
10.7. Redukcja 329
10.8. Proste kolektory 330
10.9. Kolektory budujące mapy 331
10.10. Generatory 333
10.11. Strumienie równoległe 335
10.12. Przykłady innych użytecznych metod 337
11. Wejście-wyjście 340
11.1. Programowanie wejścia-wyjścia: obraz ogólny 342
11.2. Abstrakcyjne strumienie wejścia-wyjścia. Operacje elementarne 343
11.3. Strumieniowe klasy przedmiotowe 347
11.4. Instrukcja try-with-resources. Automatyczne zarządzanie zasobami a obsługa tłumionych wyjątków 350
11.5. Strumieniowe klasy przetwarzające – przegląd 357
11.6. Buforowanie 360
11.7. Binarne strumienie wejścia-wyjścia 361
11.8. Kodowanie-dekodowanie przy użyciu strumieni wejścia-wyjścia 363
11.9. Serializacja obiektów 365
11.10. Potoki 370
11.11. Analiza składniowa strumieni – StreamTokenizer 372
11.12. Obiekty plikowe i klasa File 374
11.13. Wygodne metody klasy java.nio.fi le.Files 375
11.14. Skaner 379
11.15. Przeglądanie katalogów 382
11.16. Archiwa 391
11.17. Pliki o dostępie swobodnym 398
11.18. Nowe wejście-wyjście (NIO): przegląd 399
11.19. NIO: bufory 402
11.20. NIO: kanały i bufory. Kanały plikowe 407
11.21. Widoki buforów bajtowych 411
11.22. NIO: bufory – uporządkowanie bajtów (endianess) 415
11.23. NIO: bufory znakowe. Kodowanie i dekodowanie 417
11.24. NIO: operacje kanałowe na wielu buforach (scattering i gathering) 419
11.25. NIO: mapowanie plików 421
11.26. NIO: bezpośrednie transfery kanałowe 425
12. Programowanie współbieżne i równoległe 426
12.1. Procesy i wątki 428
12.2. Uruchamianie równoległych działań. Tworzenie wątków 429
12.3. Zadania i wykonawcy 433
12.4. Zamykanie wykonawców. Oczekiwanie na zakończenie zadań i serwis kompletacji (CompletionService) 440
12.5. Zadania powtarzalne, opóźnione i okresowe 445
12.6. Wykonawcy a pule wątków 450
12.7. ForkJoinPool i zadania rekursywne 453
12.8. Kompletery typu CountedCompleter 464
12.9. CountedCompleter jako kontynuacja 470
12.10. Kiedy i jak używać zadań typu ForkJoinTask? Praktyczny przykład użycia kompleterów 474
12.11. Zadania kompletowalne (CompletableFuture) 479
12.12. Przerywanie zadań z zewnątrz i kończenie pracy wątków 492
12.13. Synchronizacja 499
12.14. Synchronizacja za pomocą jawnego ryglowania 508
12.15. Rygle do odczytu i zapisu: ReentrantReadWriteLock i StampedLock 511
12.16. Synchronizatory wyższego poziomu 515
12.17. Unikanie synchronizacji: struktura kodu, volatile, atomiki i konkurencyjne kolekcje 520
12.18. Koordynacja pracy wątków – mechanizm wait-notify 527
12.19. Koordynacja: warunki 533
13. Dynamiczna Java 536
13.1. Mechanizm refleksji 538
13.2. Uchwyty metod 544
13.3. Znaczenie refleksji – praktyczne przykłady 552
13.4. Refleksja a generics 559
13.5. Dynamiczne klasy proxy 563
13.6. JavaBeans 569
13.6.1. Koncepcja JavaBeans 569
13.6.2. Nasłuch i wetowanie zmian właściwości za pomocą obsługi zdarzeń 570
13.6.3. Introspekcja 576
13.7. Adnotacje 577
13.7.1. Istota adnotacji i sposoby ich definiowana 577
13.7.2. Przetwarzanie adnotacji w fazie wykonania 581
13.7.3. Przetwarzanie adnotacji w fazie kompilacji. Transformowanie kodu bajtowego 583
13.8. Skrypty w Javie 590
14. Lokalizacja i internacjonalizacja aplikacji 596
14.1. Lokalizacje 598
14.2. Jeszcze trochę o formatorach liczbowych 603
14.3. Waluty 604
14.4. Strefy czasowe 605
14.5. Kalendarze i zlokalizowane daty 607
14.6. Porównywanie i sortowanie napisów 608
14.7. Internacjonalizacja aplikacji i dodatkowe zasoby (resource bundle) 609
Literatura 615