Book description
Diese umfassende Einführung in die professionelle Java-Programmierung vermittelt Ihnen das notwendige Wissen, um stabile und erweiterbare Softwaresysteme auf Java-SE-Basis zu bauen. Praxisnahe Beispiele helfen dabei, das Gelernte rasch umzusetzen.Die Neuauflage wurde durchgehend überarbeitet, aktualisiert und erweitert. Natürlich darf das aktuelle Java 9 nicht fehlen.
Table of contents
- Cover
- Die Autorin
- Titel
- Impressum
- Inhaltsübersicht
- Inhaltsverzeichnis
- Vorwort zur 4. Auflage
- 1 Einleitung
-
I Java-Grundlagen, Analyse und Design
- 2 Professionelle Arbeitsumgebung
- 2.1 Vorteile von IDEs am Beispiel von Eclipse
- 2.2 Projektorganisation
- 2.2.1 Projektstruktur in Eclipse
- 2.2.2 Projektstruktur für Maven und Gradle
- 2.3 Einsatz von Versionsverwaltungen
- 2.3.1 Arbeiten mit zentralen Versionsverwaltungen
- 2.3.2 Dezentrale Versionsverwaltungen
- 2.3.3 VCS und DVCS im Vergleich
- 2.4 Einsatz eines Unit-Test-Frameworks
- 2.4.1 Das JUnit-Framework
- 2.4.2 Vorteile von Unit Tests
- 2.5 Debugging
- 2.5.1 Fehlersuche mit einem Debugger
- 2.5.2 Remote Debugging
- 2.6 Deployment von Java-Applikationen
- 2.6.1 Das JAR-Tool im Kurzüberblick
- 2.6.2 JAR inspizieren und ändern, Inhalt extrahieren
- 2.6.3 Metainformationen und das Manifest
- 2.6.4 Inspizieren einer JAR-Datei
- 2.7 Einsatz eines IDE-unabhängigen Build-Prozesses
- 2.7.1 Maven im Überblick
- 2.7.2 Builds mit Gradle
- 2.7.3 Vorteile von Maven und Gradle
- 2.8 Weiterführende Literatur
- 3 Objektorientiertes Design
- 3.1 OO-Grundlagen
- 3.1.1 Grundbegriffe
- 3.1.2 Beispielentwurf: Ein Zähler
- 3.1.3 Vom imperativen zum objektorientierten Entwurf
- 3.1.4 Diskussion der OO-Grundgedanken
- 3.1.5 Wissenswertes zum Objektzustand
- 3.2 Grundlegende OO-Techniken
- 3.2.1 Schnittstellen (Interfaces)
- 3.2.2 Basisklassen und abstrakte Basisklassen
- 3.2.3 Interfaces und abstrakte Basisklassen
- 3.3 Wissenswertes zu Vererbung
- 3.3.1 Probleme durch Vererbung
- 3.3.2 Delegation statt Vererbung
- 3.4 Fortgeschrittenere OO-Techniken
- 3.4.1 Read-only-Interface
- 3.4.2 Immutable-Klasse
- 3.4.3 Marker-Interface
- 3.4.4 Konstantensammlungen und Aufzählungen
- 3.4.5 Value Object (Data Transfer Object)
- 3.5 Prinzipien guten OO-Designs
- 3.5.1 Geheimnisprinzip nach Parnas
- 3.5.2 Law of Demeter
- 3.5.3 SOLID-Prinzipien
- 3.6 Formen der Varianz
- 3.6.1 Grundlagen der Varianz
- 3.6.2 Kovariante Rückgabewerte
- 3.7 Generische Typen (Generics)
- 3.7.1 Einführung
- 3.7.2 Generics und Auswirkungen der Type Erasure
- 3.8 Weiterführende Literatur
- 4 Java-Grundlagen
- 4.1 Die Klasse Object
- 4.1.1 Die Methode toString()
- 4.1.2 Die Methode equals()
- 4.2 Primitive Typen und Wrapper-Klassen
- 4.2.1 Grundlagen
- 4.2.2 Konvertierung von Werten
- 4.2.3 Wissenswertes zu Auto-Boxing und Auto-Unboxing
- 4.2.4 Ausgabe und Verarbeitung von Zahlen
- 4.3 Stringverarbeitung
- 4.3.1 Die Klasse String
- 4.3.2 Die Klassen StringBuffer und StringBuilder
- 4.3.3 Ausgaben mit format() und printf()
- 4.3.4 Die Methode split() und reguläre Ausdrücke
- 4.4 Datumsverarbeitung
- 4.4.1 Fallstricke der Datums-APIs
- 4.4.2 Das Date-API
- 4.4.3 Das Calendar-API
- 4.5 Varianten innerer Klassen
- 4.6 Ein- und Ausgabe (I/O)
- 4.6.1 Dateibehandlung und die Klasse File
- 4.6.2 Ein- und Ausgabestreams im Überblick
- 4.6.3 Zeichencodierungen bei der Ein- und Ausgabe
- 4.6.4 Speichern und Laden von Daten und Objekten
- 4.6.5 Dateiverarbeitung in JDK 7
- 4.6.6 Erweiterungen im NIO und der Klasse Files in JDK 8
- 4.7 Fehlerbehandlung
- 4.7.1 Einstieg in die Fehlerbehandlung
- 4.7.2 Checked Exceptions und Unchecked Exceptions
- 4.7.3 Exception Handling und Ressourcenfreigabe
- 4.7.4 Besonderheiten beim Exception Handling mit JDK 7
- 4.7.5 Assertions
- 4.8 Weiterführende Literatur
- 5 Lambdas, Methodenreferenzen und Defaultmethoden
- 5.1 Einstieg in Lambdas
- 5.1.1 Syntax von Lambdas
- 5.1.2 Functional Interfaces und SAM-Typen
- 5.1.3 Exceptions in Lambdas
- 5.2 Syntaxerweiterungen in Interfaces
- 5.2.1 Defaultmethoden
- 5.2.2 Statische Methoden in Interfaces
- 5.3 Methodenreferenzen
- 5.4 Externe vs. interne Iteration
- 5.5 Wichtige Functional Interfaces für Collections
- 5.5.1 Das Interface Predicate<T>
- 5.5.2 Das Interface UnaryOperator<T>
- 5.5.3 Fazit
-
II Bausteine stabiler Java-Applikationen
- 6 Das Collections-Framework
- 6.1 Datenstrukturen und Containerklasse
- 6.1.1 Wahl einer geeigneten Datenstruktur
- 6.1.2 Arrays
- 6.1.3 Das Interface Collection
- 6.1.4 Das Interface Iterator
- 6.1.5 Listen und das Interface List
- 6.1.6 Mengen und das Interface Set
- 6.1.7 Grundlagen von hashbasierten Containern
- 6.1.8 Grundlagen automatisch sortierender Container
- 6.1.9 Die Methoden equals(), hashCode() und compareTo() im Zusammenspiel
- 6.1.10 Schlüssel-Wert-Abbildungen und das Interface Map
- 6.1.11 Erweiterungen am Beispiel der Klasse HashMap
- 6.1.12 Erweiterungen im Interface Map mit JDK 8
- 6.1.13 Entscheidungshilfe zur Wahl von Datenstrukturen
- 6.2 Suchen und Sortieren
- 6.2.1 Suchen
- 6.2.2 Sortieren von Arrays und Listen
- 6.2.3 Sortieren mit Komparatoren
- 6.2.4 Erweiterungen im Interface Comparator mit JDK 8
- 6.3 Utility-Klassen und Hilfsmethoden
- 6.3.1 Nützliche Hilfsmethoden
- 6.3.2 Dekorierer synchronized, unmodifiable und checked
- 6.3.3 Vordefinierte Algorithmen in der Klasse Collections
- 6.4 Containerklassen: Generics und Varianz
- 6.5 Die Klasse Optional
- 6.5.1 Grundlagen zur Klasse Optional
- 6.5.2 Weiterführendes Beispiel und Diskussion
- 6.5.3 Verkettete Methodenaufrufe
- 6.6 Fallstricke im Collections-Framework
- 6.6.1 Wissenswertes zu Arrays
- 6.6.2 Wissenswertes zu Stack, Queue und Deque
- 6.7 Weiterführende Literatur
- 7 Bulk Operations on Collections
- 7.1 Streams
- 7.1.1 Streams erzeugen – Create Operations
- 7.1.2 Intermediate und Terminal Operations im Überblick
- 7.1.3 Zustandslose Intermediate Operations
- 7.1.4 Zustandsbehaftete Intermediate Operations
- 7.1.5 Terminal Operations
- 7.1.6 Wissenswertes zur Parallelverarbeitung
- 7.2 Filter-Map-Reduce
- 7.2.1 Herkömmliche Realisierung
- 7.2.2 Filter-Map-Reduce mit JDK 8
- 7.3 Praxisbeispiele
- 7.3.1 Aufbereiten von Gruppierungen und Histogrammen
- 7.3.2 Maps nach Wert sortieren
- 7.3.3 Verarbeitung von ZIP-Dateien
- 8 Applikationsbausteine
- 8.1 Einsatz von Bibliotheken
- 8.2 Google Guava im Kurzüberblick
- 8.2.1 String-Aktionen
- 8.2.2 Stringkonkatenation und -extraktion
- 8.2.3 Erweiterungen für Collections
- 8.2.4 Weitere Utility-Funktionalitäten
- 8.3 Wertebereichs- und Parameterprüfungen
- 8.3.1 Prüfung einfacher Wertebereiche und Wertemengen
- 8.3.2 Prüfung komplexerer Wertebereiche
- 8.4 Logging-Frameworks
- 8.4.1 Apache log4j2
- 8.4.2 Tipps und Tricks zum Einsatz von Logging mit log4j2
- 8.5 Konfigurationsparameter und -dateien
- 8.5.1 Einlesen von Kommandozeilenparametern
- 8.5.2 Verarbeitung von Properties
- 8.5.3 Die Klasse Preferences
- 8.5.4 Weitere Möglichkeiten zur Konfigurationsverwaltung
- 9 Multithreading
- 9.1 Threads und Runnables
- 9.1.1 Definition der auszuführenden Aufgabe
- 9.1.2 Start, Ausführung und Ende von Threads
- 9.1.3 Lebenszyklus von Threads und Thread-Zustände
- 9.1.4 Unterbrechungswünsche durch Aufruf von interrupt()
- 9.2 Zusammenarbeit von Threads
- 9.2.1 Konkurrierende Datenzugriffe
- 9.2.2 Locks, Monitore und kritische Bereiche
- 9.2.3 Deadlocks und Starvation
- 9.2.4 Kritische Bereiche und das Interface Lock
- 9.3 Kommunikation von Threads
- 9.3.1 Kommunikation mit Synchronisation
- 9.3.2 Kommunikation über die Methoden wait(), notify() und notifyAll()
- 9.3.3 Abstimmung von Threads
- 9.3.4 Unerwartete IllegalMonitorStateExceptions
- 9.4 Das Java-Memory-Modell
- 9.4.1 Sichtbarkeit
- 9.4.2 Atomarität
- 9.4.3 Reorderings
- 9.5 Besonderheiten bei Threads
- 9.5.1 Verschiedene Arten von Threads
- 9.5.2 Exceptions in Threads
- 9.5.3 Sicheres Beenden von Threads
- 9.5.4 Zeitgesteuerte Ausführung
- 9.6 Die Concurrency Utilities
- 9.6.1 Concurrent Collections
- 9.6.2 Das Executor-Framework
- 9.6.3 Das Fork-Join-Framework
- 9.6.4 Erweiterungen im Bereich Concurrency mit JDK 8
- 9.7 Weiterführende Literatur
- 10 Fortgeschrittene Java-Themen
- 10.1 Crashkurs Reflection
- 10.1.1 Grundlagen
- 10.1.2 Zugriff auf Methoden und Attribute
- 10.1.3 Spezialfälle
- 10.1.4 Type Erasure und Typinformationen bei Generics
- 10.2 Annotations
- 10.2.1 Einführung in Annotations
- 10.2.2 Standard-Annotations des JDKs
- 10.2.3 Definition eigener Annotations
- 10.2.4 Annotation zur Laufzeit auslesen
- 10.3 Serialisierung
- 10.3.1 Grundlagen der Serialisierung
- 10.3.2 Die Serialisierung anpassen
- 10.3.3 Versionsverwaltung der Serialisierung
- 10.3.4 Optimierung der Serialisierung
- 10.4 Garbage Collection
- 10.4.1 Grundlagen zur Garbage Collection
- 10.4.2 Herkömmliche Algorithmen zur Garbage Collection
- 10.4.3 Einflussfaktoren auf die Garbage Collection
- 10.4.4 Der Garbage Collector »G1«
- 10.4.5 Memory Leaks: Gibt es die auch in Java?!
- 10.5 Dynamic Proxies
- 10.5.1 Statischer Proxy
- 10.5.2 Dynamischer Proxy
- 10.6 »Nashorn« – die JavaScript-Engine
- 10.7 Weiterführende Literatur
- 11 Datumsverarbeitung seit JDK 8
- 11.1 Überblick über die neu eingeführten Typen
- 11.1.1 Neue Aufzählungen, Klassen und Interfaces
- 11.1.2 Die Aufzählungen DayOfWeek und Month
- 11.1.3 Die Klassen MonthDay, YearMonth und Year
- 11.1.4 Die Klasse Instant
- 11.1.5 Die Klasse Duration
- 11.1.6 Die Aufzählung ChronoUnit
- 11.1.7 Die Klassen LocalDate, LocalTime und LocalDateTime
- 11.1.8 Die Klasse Period
- 11.1.9 Die Klasse ZonedDateTime
- 11.1.10 Zeitzonen und die Klassen ZoneId und ZoneOffset
- 11.1.11 Die Klasse Clock
- 11.1.12 Formatierung und Parsing
- 11.2 Datumsarithmetik
- 11.3 Interoperabilität mit Legacy-Code
- 12 GUIs mit JavaFX
- 12.1 Einführung – JavaFX im Überblick
- 12.1.1 Grundsätzliche Konzepte
- 12.1.2 Layoutmanagement
- 12.2 Deklarativer Aufbau des GUIs
- 12.2.1 Deklarative Beschreibung von GUIs
- 12.2.2 Hello-World-Beispiel mit FXML
- 12.2.3 Diskussion: Design und Funktionalität strikt trennen
- 12.3 Rich-Client Experience
- 12.3.1 Gestaltung mit CSS
- 12.3.2 Effekte
- 12.3.3 Animationen
- 12.3.4 Zeichnen in JavaFX-Komponenten
- 12.4 Properties, Bindings und Observable Collections
- 12.4.1 Properties
- 12.4.2 Bindings
- 12.4.3 Observable Collections
- 12.4.4 Dynamisches Filtern von ObservableList
- 12.5 Wichtige Bedienelemente
- 12.5.1 Dialoge
- 12.5.2 Formatierte Eingabe in TextFields
- 12.5.3 Die Bedienelemente ComboBox und ListView
- 12.5.4 Tabellen und das Bedienelement TableView
- 12.5.5 Das Bedienelement TreeTableView
- 12.5.6 Menüs
- 12.6 Multithreading in JavaFX
- 12.6.1 Das Interface Worker
- 12.6.2 Die Klasse Task<V>
- 12.7 Von Swing zu JavaFX
- 12.7.1 JavaFX in Swing einbinden
- 12.7.2 Swing in JavaFX einbinden
- 12.8 Weiterführende Literatur
- 13 Basiswissen Internationalisierung
- 13.1 Internationalisierung im Überblick
- 13.1.1 Grundlagen und Normen
- 13.1.2 Die Klasse Locale
- 13.1.3 Die Klasse PropertyResourceBundle
- 13.1.4 Formatierte Ein- und Ausgabe
- 13.1.5 Zahlen und die Klasse NumberFormat
- 13.1.6 Datumswerte und die Klasse DateFormat
- 13.1.7 Textmeldungen und die Klasse MessageFormat
- 13.1.8 Stringvergleiche mit der Klasse Collator
- 13.2 Programmbausteine zur Internationalisierung
- 13.2.1 Unterstützung mehrerer Datumsformate
- 13.2.2 Nutzung mehrerer Sprachdateien
-
III Neuerungen in Java 9
- 14 Ergänzungen in Java 9
- 14.1 Syntaxerweiterungen
- 14.1.1 Anonyme innere Klassen und der Diamond Operator
- 14.1.2 Erweiterung der @Deprecated-Annotation
- 14.1.3 Private Methoden in Interfaces
- 14.2 Neues und Änderungen im JDK
- 14.2.1 Das neue Process-API
- 14.2.2 Neuerungen im Stream-API
- 14.2.3 Erweiterungen rund um die Klasse Optional
- 14.2.4 Erweiterungen in der Klasse InputStream
- 14.2.5 Erweiterungen in der Klasse Objects
- 14.2.6 Erweiterungen in der Klasse CompletableFuture
- 14.2.7 Collection-Factory-Methoden
- 14.3 Änderungen in der JVM
- 14.3.1 Garbage Collection
- 14.3.2 Browser-Plugin ist deprecated
- 14.3.3 Änderung des Versionsschemas
- 14.3.4 HTML5 Javadoc
- 14.3.5 Java + REPL => jshell
- 14.4 Fazit
- 15 Modularisierung mit Project Jigsaw
- 15.1 Grundlagen
- 15.1.1 Begrifflichkeiten
- 15.1.2 Ziele von Project Jigsaw
- 15.2 Modularisierung im Überblick
- 15.2.1 Grundlagen zu Project Jigsaw
- 15.2.2 Beispiel mit zwei Modulen
- 15.2.3 Packaging
- 15.2.4 Linking
- 15.2.5 Abhängigkeiten und Modulgraphen
- 15.2.6 Module des JDKs einbinden
- 15.2.7 Arten von Modulen
- 15.3 Sichtbarkeiten und Zugriffsschutz
- 15.3.1 Sichtbarkeiten
- 15.3.2 Zugriffsschutz und Reflection
- 15.4 Kompatibilität und Migration
- 15.4.1 Kompatibilitätsmodus
- 15.4.2 Migrationsszenarien
- 15.4.3 Fallstrick bei der Bottom-up-Migration
- 15.4.4 Beispiel: Migration mit Automatic Modules
- 15.4.5 Beispiel: Automatic und Unnamed Module
- 15.4.6 Mögliche Schwierigkeiten bei Migrationen
- 15.4.7 Fazit
- 15.5 Zusammenfassung
-
IV Fallstricke und Lösungen im Praxisalltag
- 16 Bad Smells
- 16.1 Programmdesign
- 16.1.1 Bad Smell: Verwenden von Magic Numbers
- 16.1.2 Bad Smell: Konstanten in Interfaces definieren
- 16.1.3 Bad Smell: Zusammengehörende Konstanten nicht als Typ definiert
- 16.1.4 Bad Smell: Programmcode im Logging-Code
- 16.1.5 Bad Smell: Dominanter Logging-Code
- 16.1.6 Bad Smell: Unvollständige Betrachtung aller Alternativen
- 16.1.7 Bad Smell: Unvollständige Änderungen nach Copy-Paste
- 16.1.8 Bad Smell: Casts auf unbekannte Subtypen
- 16.1.9 Bad Smell: Pre-/Post-Increment in komplexeren Statements
- 16.1.10 Bad Smell: Keine Klammern um Blöcke
- 16.1.11 Bad Smell: Mehrere aufeinanderfolgende Parameter gleichen Typs
- 16.1.12 Bad Smell: Grundloser Einsatz von Reflection
- 16.1.13 Bad Smell: System.exit() mitten im Programm
- 16.1.14 Bad Smell: Variablendeklaration nicht im kleinstmöglichen Sichtbarkeitsbereich
- 16.2 Klassendesign
- 16.2.1 Bad Smell: Unnötigerweise veränderliche Attribute
- 16.2.2 Bad Smell: Herausgabe von this im Konstruktor
- 16.2.3 Bad Smell: Aufruf abstrakter Methoden im Konstruktor
- 16.2.4 Bad Smell: Referenzierung von Subklassen in Basisklassen
- 16.2.5 Bad Smell: Mix abstrakter und konkreter Basisklassen
- 16.2.6 Bad Smell: Öffentlicher Defaultkonstruktor lediglich zum Zugriff auf Hilfsmethoden
- 16.3 Fehlerbehandlung und Exception Handling
- 16.3.1 Bad Smell: Unbehandelte Exception
- 16.3.2 Bad Smell: Unpassender Exception-Typ
- 16.3.3 Bad Smell: Exceptions zur Steuerung des Kontrollflusses
- 16.3.4 Bad Smell: Fangen der allgemeinsten Exception
- 16.3.5 Bad Smell: Rückgabe von null statt Exception im Fehlerfall
- 16.3.6 Bad Smell: Unbedachte Rückgabe von null
- 16.3.7 Bad Smell: Sonderbehandlung von Randfällen
- 16.3.8 Bad Smell: Keine Gültigkeitsprüfung von Eingabeparametern
- 16.3.9 Bad Smell: Fehlerhafte Fehlerbehandlung
- 16.3.10 Bad Smell: I/O ohne finally oder ARM
- 16.3.11 Bad Smell: Resource Leaks durch Exceptions im Konstruktor
- 16.4 Häufige Fallstricke
- 16.5 Weiterführende Literatur
- 17 Refactorings
- 17.1 Refactorings am Beispiel
- 17.2 Das Standardvorgehen
- 17.3 Kombination von Basis-Refactorings
- 17.3.1 Refactoring-Beispiel: Ausgangslage und Ziel
- 17.3.2 Auflösen der Abhängigkeiten
- 17.3.3 Vereinfachungen
- 17.3.4 Verlagern von Funktionalität
- 17.4 Der Refactoring-Katalog
- 17.4.1 Reduziere die Sichtbarkeit von Attributen
- 17.4.2 Minimiere veränderliche Attribute
- 17.4.3 Reduziere die Sichtbarkeit von Methoden
- 17.4.4 Ersetze Mutator- durch Business-Methode
- 17.4.5 Minimiere Zustandsänderungen
- 17.4.6 Führe ein Interface ein
- 17.4.7 Spalte ein Interface auf
- 17.4.8 Führe ein Read-only-Interface ein
- 17.4.9 Führe ein Read-Write-Interface ein
- 17.4.10 Lagere Funktionalität in Hilfsmethoden aus
- 17.4.11 Trenne Informationsbeschaffung und -verarbeitung
- 17.4.12 Wandle Konstantensammlung in enum um
- 17.4.13 Entferne Exceptions zur Steuerung des Kontrollflusses
- 17.4.14 Wandle in Utility-Klasse mit statischen Hilfsmethoden um
- 17.4.15 Löse if-else / instanceof durch Polymorphie auf
- 17.5 Defensives Programmieren
- 17.5.1 Führe eine Zustandsprüfung ein
- 17.5.2 Überprüfe Eingabeparameter
- 17.6 Falllstricke bei Refactorings
- 17.7 Weiterführende Literatur
- 18 Entwurfsmuster
- 18.1 Erzeugungsmuster
- 18.1.1 Erzeugungsmethode
- 18.1.2 Fabrikmethode (Factory method)
- 18.1.3 Erbauer (Builder)
- 18.1.4 Singleton
- 18.1.5 Prototyp (Prototype)
- 18.2 Strukturmuster
- 18.2.1 Fassade (Façade)
- 18.2.2 Adapter
- 18.2.3 Dekorierer (Decorator)
- 18.2.4 Kompositum (Composite)
- 18.3 Verhaltensmuster
- 18.3.1 Iterator
- 18.3.2 Null-Objekt (Null Object)
- 18.3.3 Schablonenmethode (Template method)
- 18.3.4 Strategie (Strategy)
- 18.3.5 Befehl (Command)
- 18.3.6 Proxy
- 18.3.7 Beobachter (Observer)
- 18.3.8 MVC-Architektur
- 18.4 Weiterführende Literatur
-
V Qualitätssicherungsmaßnahmen
- 19 Programmierstil und Coding Conventions
- 19.1 Grundregeln eines guten Programmierstils
- 19.1.1 Keep It Human-Readable
- 19.1.2 Keep It Simple And Short (KISS)
- 19.1.3 Keep It Natural
- 19.1.4 Keep It Clean
- 19.2 Die Psychologie beim Sourcecode-Layout
- 19.2.1 Gesetz der Ähnlichkeit
- 19.2.2 Gesetz der Nähe
- 19.3 Coding Conventions
- 19.3.1 Grundlegende Namens- und Formatierungsregeln
- 19.3.2 Namensgebung
- 19.3.3 Dokumentation
- 19.3.4 Programmdesign
- 19.3.5 Klassendesign
- 19.3.6 Parameterlisten
- 19.3.7 Logik und Kontrollfluss
- 19.4 Sourcecode-Prüfung mit Tools
- 19.4.1 Metriken
- 19.4.2 Sourcecode-Prüfung im Build-Prozess
- 20 Unit Tests
- 20.1 Testen im Überblick
- 20.1.1 Was versteht man unter Testen?
- 20.1.2 Testarten im Überblick
- 20.1.3 Zuständigkeiten beim Testen
- 20.1.4 Testen und Qualität
- 20.2 Wissenswertes zu Testfällen
- 20.2.1 Testfälle mit JUnit 4 definieren
- 20.2.2 Problem der Kombinatorik
- 20.3 Motivation für Unit Tests aus der Praxis
- 20.4 JUnit Rules und parametrierte Tests
- 20.4.1 JUnit Rules im Überblick
- 20.4.2 Parametrierte Tests
- 20.5 Fortgeschrittene Unit-Test-Techniken
- 20.5.1 Stellvertreterobjekte / Test-Doubles
- 20.5.2 Vorarbeiten für das Testen mit Stubs und Mocks
- 20.5.3 Die Technik EXTRACT AND OVERRIDE
- 20.5.4 Einstieg in das Testen mit Mocks und Mockito
- 20.5.5 Abhängigkeiten mit Mockito auflösen
- 20.5.6 Unit Tests von privaten Methoden
- 20.6 Unit Tests mit Threads und Timing
- 20.6.1 Funktionale Erweiterung: Aggregation und Versand
- 20.6.2 Test der Aggregation und des Versands
- 20.6.3 Test des nebenläufigen Versands
- 20.7 Test Smells
- 20.8 Nützliche Tools für Unit Tests
- 20.8.1 Hamcrest
- 20.8.2 MoreUnit
- 20.8.3 Infinitest
- 20.8.4 JaCoCo
- 20.8.5 EclEmma
- 20.9 Ausblick auf JUnit 5
- 20.9.1 Einführendes Beispiel
- 20.9.2 Wichtige Neuerungen in JUnit 5 im Überblick
- 20.10 Weiterführende Literatur
- 21 Codereviews
- 21.1 Definition
- 21.2 Probleme und Tipps zur Durchführung
- 21.3 Vorteile von Codereviews
- 21.4 Codereview-Checkliste
- 22 Optimierungen
- 22.1 Grundlagen
- 22.1.1 Optimierungsebenen und Einflussfaktoren
- 22.1.2 Optimierungstechniken
- 22.1.3 CPU-bound-Optimierungsebenen am Beispiel
- 22.1.4 Messungen – Erkennen kritischer Bereiche
- 22.1.5 Abschätzungen mit der O-Notation
- 22.2 Einsatz geeigneter Datenstrukturen
- 22.2.1 Einfluss von Arrays und Listen
- 22.2.2 Optimierungen für Set und Map
- 22.2.3 Design eines Zugriffsinterface
- 22.3 Lazy Initialization
- 22.3.1 Lazy Initialization am Beispiel
- 22.3.2 Konsequenzen des Einsatzes der Lazy Initialization
- 22.3.3 Lazy Initialization mithilfe des PROXY-Musters
- 22.4 Optimierungen am Beispiel
- 22.5 I/O-bound-Optimierungen
- 22.5.1 Technik – Wahl passender Strategien
- 22.5.2 Technik – Caching und Pooling
- 22.5.3 Technik – Vermeidung unnötiger Aktionen
- 22.6 Memory-bound-Optimierungen
- 22.6.1 Technik – Wahl passender Strategien
- 22.6.2 Technik – Caching und Pooling
- 22.6.3 Optimierungen der Stringverarbeitung
- 22.6.4 Technik – Vermeidung unnötiger Aktionen
- 22.7 CPU-bound-Optimierungen
- 22.7.1 Technik – Wahl passender Strategien
- 22.7.2 Technik – Caching und Pooling
- 22.7.3 Technik – Vermeidung unnötiger Aktionen
- 22.8 Weiterführende Literatur
- 23 Schlussgedanken
- VI Anhang
- Literaturverzeichnis
- Index
- Fußnoten
Product information
- Title: Der Weg zum Java-Profi, 4th Edition
- Author(s):
- Release date: November 2017
- Publisher(s): dpunkt
- ISBN: 9783864904837
You might also like
book
Der Weg zum Java-Profi, 5th Edition
Dieses Buch bietet eine umfassende Einführung in die professionelle Java-Entwicklung und vermittelt Ihnen das notwendige Wissen, …
book
Der Java-Profi: Persistenzlösungen und REST-Services
• Erweiterung des Java-Profis für Datenbankprogrammierung• Erfolgsautor Michael Inden• Professionelle Entwicklung von Datenbankanwendungen
book
Gute Gestaltung verstehen, beurteilen und sicher beauftragen
»Das Logo muss größer!« ist unter Grafikdesigern weltweit ein running gag, der ihre Zusammenarbeit mit Auftraggebern …
book
Subjekt werden
Die Frage nach dem Subjekt politischen Handelns bildet eines der aktuellen Themen politischer Philosophie, nachdem sich …