"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