Copyright
Preface
- Post-Java-8 Features in this Book
- This is Only an eBook
- Colophon
- Acknowledgements
- Dedication
Introduction
- Goals
- Language Design Errors
- Popularity
- Android Programmers
- Book Updates
- The New Java “Release Cadence”
- What About User Interfaces?
- JDK HTML Documentation
- Tested Examples
- Coding Standards
- Bug Reports
- Source Code
What is an Object?
- The Progress of Abstraction
- An Object Has an Interface
- Objects Provide Services
- The Hidden Implementation
- Reusing the Implementation
- Inheritance
- Interchangeable Objects with Polymorphism
- The Singly-Rooted Hierarchy
- Collections
- Object Creation & Lifetime
- Exception Handling: Dealing with Errors
- Summary
Installing Java and the Book Examples
- Editors
- The Shell
- Installing Java
- Verify Your Installation
- Installing and Running the Book Examples
Objects Everywhere
- You Manipulate Objects with References
- You Must Create All the Objects
- Comments
- You Never Need to Destroy an Object
- Creating New Data Types:
class - Methods, Arguments, and Return Values
- Writing a Java Program
- Your First Java Program
- Coding Style
- Summary
Operators
- Using Java Operators
- Precedence
- Assignment
- Mathematical Operators
- Auto Increment and Decrement
- Relational Operators
- Logical Operators
- Literals
- Bitwise Operators
- Shift Operators
- Ternary
if-elseOperator StringOperator + and +=- Common Pitfalls When Using Operators
- Casting Operators
- Java Has No “sizeof”
- A Compendium of Operators
- Summary
Control Flow
trueandfalseif-else- Iteration Statements
- For-in Syntax
returnbreakandcontinue- The Infamous “Goto”
switch- Switching on Strings
- Summary
Housekeeping
- Guaranteed Initialization with the Constructor
- Method Overloading
- Zero-Argument Constructors
- The
thisKeyword - Cleanup: Finalization and Garbage Collection
- Member Initialization
- Constructor Initialization
- Array Initialization
- Enumerated Types
- New Feature: Local Variable Type Inference
- Summary
Implementation Hiding
package: the Library Unit- Java Access Specifiers
- Interface and Implementation
- Class Access
- New Feature: Modules
- Summary
Reuse
- Composition Syntax
- Inheritance Syntax
- Delegation
- Combining Composition and Inheritance
- Choosing Composition vs. Inheritance
protected- Upcasting
- The
finalKeyword - Initialization and Class Loading
- Summary
Polymorphism
- Upcasting Revisited
- The Twist
- Constructors and Polymorphism
- Covariant Return Types
- Designing with Inheritance
- Summary
Interfaces
- Abstract Classes and Methods
- Defining Interfaces
- Abstract Classes vs. Interfaces
- Complete Decoupling
- Combining Multiple Interfaces
- Extending an Interface with Inheritance
- Adapting to an Interface
- Fields in Interfaces
- Nesting Interfaces
- Interfaces and Factories
- New Feature:
privateMethods in Interfaces - New Feature: Sealed Classes and Interfaces
- Summary
Inner Classes
- Creating Inner Classes
- The Link to the Outer Class
- Using
.thisand.new - Inner Classes and Upcasting
- Inner Classes in Methods and Scopes
- Anonymous Inner Classes
- Nested Classes
- Why Inner Classes?
- Inheriting from Inner Classes
- Can Inner Classes Be Overridden?
- Local Inner Classes
- Inner-Class Identifiers
- Summary
Collections
- Generics and Type-Safe Collections
- Basic Concepts
- Adding Groups of Elements
- Printing Collections
ListIteratorsLinkedListStackSetMap- New Feature: Records
QueueCollectionvs.Iterator- for-in and Iterators
- Summary
Functional Programming
- Old vs. New
- Lambda Expressions
- Method References
- Functional Interfaces
- Higher-Order Functions
- Closures
- Function Composition
- Currying and Partial Evaluation
- Pure Functional Programming
- Summary
Streams
- Java 8 Stream Support
- Stream Creation
- Intermediate Operations
- Optional
- Terminal Operations
- Summary
Exceptions
- Concepts
- Basic Exceptions
- Catching an Exception
- Creating Your Own Exceptions
- The Exception Specification
- Catching Any Exception
- Standard Java Exceptions
- New Feature: Better
NullPointerExceptionReporting - Performing Cleanup with
finally - Exception Restrictions
- Constructors
- Try-With-Resources
- Exception Matching
- Alternative Approaches
- Exception Guidelines
- Summary
Validating Your Code
- Testing
- Preconditions
- Test-Driven Development
- Logging
- Debugging
- Benchmarking
- Profiling and Optimizing
- Style Checking
- Static Error Analysis
- Code Reviews
- Pair Programming
- Refactoring
- Continuous Integration
- Summary
Files
- File and Directory Paths
- Directories
- File Systems
- Watching a
Path - Finding Files
- Reading & Writing Files
- Summary
Strings
- Immutable
Strings - Overloading
+vs.StringBuilder - Unintended Recursion
- Operations on
Strings - Formatting Output
- New Feature: Text Blocks
- Regular Expressions
- Scanning Input
StringTokenizer- Summary
Reflection
- The Need for Reflection
- The
ClassObject - Checking Before a Cast
- Registered Factories
Instanceofvs.ClassEquivalence- Runtime Class Information
- Dynamic Proxies
- Using Optional
- Interfaces and Type Information
- Summary
Generics
- Comparison with C++
- Simple Generics
- Generic Interfaces
- Generic Methods
- Building Complex Models
- The Mystery of Erasure
- Compensating for Erasure
- Bounds
- Wildcards
- Issues
- Self-Bounded Types
- Dynamic Type Safety
- Exceptions
- Mixins
- Latent Typing
- Compensating for the Lack of (Direct) Latent Typing
- Assisted Latent Typing in Java 8
- Summary: Is Casting Really So Bad?
Arrays
- Why Arrays are Special
- Arrays are First-Class Objects
- Returning an Array
- Multidimensional Arrays
- Arrays and Generics
Arrays.fill()Arrays.setAll()- Incremental Generators
- Random Generators
- Generics and Primitive Arrays
- Modifying Existing Array Elements
- An Aside On Parallelism
ArraysUtilities- Copying an Array
- Comparing Arrays
Streams and Arrays- Sorting Arrays
- Searching with
Arrays.binarySearch() - Accumulating with
parallelPrefix() - Summary
Enumerations
- Basic
enumFeatures - Adding Methods to an
enum enums inswitchStatements- The Mystery of
values() - Implements, not Inherits
- Random Selection
- Using Interfaces for Organization
- Using
EnumSetInstead of Flags - Using
EnumMap - Constant-Specific Methods
- Multiple Dispatching
- New Features to Support Pattern Matching
- New Feature: Arrow in
switch - New Feature:
case nullinswitch - New Feature:
switchas an Expression - New Feature: Smart Casts
- New Feature: Pattern Matching
- Summary
Annotations
- Basic Syntax
- Writing Annotation Processors
- Using
javacto Process Annotations - Annotation-Based Unit Testing
- Summary
Concurrent Programming
- The Terminology Problem
- Concurrency Superpowers
- Concurrency is for Speed
- The Four Maxims of Java Concurrency
- The Brutal Truth
- The Rest of the Chapter
- Parallel Streams
- Creating and Running Tasks
- Terminating Long-Running Tasks
CompletableFutures- Deadlock
- Constructors are not Thread-Safe
- Effort, Complexity, Cost
- Summary
Patterns
- The Pattern Concept
- Singleton
- Classifying Patterns
- Template Method
- Fronting for an Implementation
- Factories: Encapsulating Object Creation
- Function Objects
- Changing the Interface
- Interpreter: Runtime Flexibility
- Callbacks
- Multiple Dispatching
- Pattern Refactoring
- Summary
Appendix: Supplements
- On Java 8 Example Code
- Hands-On Java eSeminar
Appendix: Programming Guidelines
- Design
- Implementation
Appendix: Javadoc
- Syntax
- Embedded HTML
- Some Example Tags
- Documentation Example
Appendix: Passing and Returning Objects
- Passing References
- Making Local Copies
- Controlling Cloneability
- Immutable Classes
- Summary
Appendix: I/O Streams
- Types of
InputStream - Types of
OutputStream - Adding Attributes and Useful Interfaces
Readers &Writers- Off By Itself:
RandomAccessFile - Typical Uses of I/O Streams
- Summary
Appendix: Standard I/O
- Reading from Standard Input
- Changing
System.outto aPrintWriter - Redirecting Standard I/O
- Process Control
Appendix: New I/O
ByteBuffers- Converting Data
- Fetching Primitives
- View Buffers
- Data Manipulation with Buffers
- Memory-Mapped Files
- File Locking
Appendix: Understanding equals() and hashCode()
- A Canonical
equals() - Hashing and Hash Codes
- Tuning a
HashMap
Appendix: Collection Topics
- Sample Data
ListBehaviorSetBehavior- Using Functional Operations with any
Map - Selecting Parts of a
Map - Filling Collections
- Custom
CollectionandMapusing Flyweight CollectionFunctionality- Optional Operations
Sets and Storage Order- Queues
- Understanding
Maps - Utilities
- Holding References
- Java 1.0/1.1 Collections
- Summary
Appendix: Low-Level Concurrency
- What is a Thread?
- Catching Exceptions
- Sharing Resources
- The
volatileKeyword - Atomicity
- Critical Sections
- Library Components
- Summary
Appendix: Data Compression
- Simple Compression with GZIP
- Multifile Storage with Zip
- Java Archives (Jars)
Appendix: Object Serialization
- Overview
- Finding the Class
- Controlling Serialization
- Using Persistence
Appendix: Benefits and Costs of Static Type Checking
- Foreword to the 2021 Edition
- Foreword to the Original Edition
- Static Type Checking vs. Testing
- How to Argue about Typing
- The Cost of Productivity
- Static vs. Dynamic
Appendix: The Positive Legacy of C++ and Java
Appendix: Becoming a Programmer
- How I Got Started in Programming
- A Career in Computing
- The Mythical 5%
- Writing Software Is Like … Writing
- Programming as Typing
- Do What You Love
