Preface What this book covers What you need for this book Who this book is for Conventions Reader feedback Customer support Downloading the example code Errata Piracy Questions Getting Started with Java 9 Getting started with Java Installing Java Installation on Windows Installation on MAC OS X Installation on Linux Setting JAVA_HOME Executing jshell Looking at the byte code Packaging classes into a JAR file Managing the running Java application Using an IDE NetBeans Eclipse IntelliJ IDE services IDE screen structure Editing files Managing projects Build the code and run it Debugging Java Summary The First Real Java Program - Sorting Names Getting started with sorting Bubble sort Getting started with project structure and build tools Make Ant Installing Ant Using Ant Maven Installing Maven Using Maven Gradle Installing Gradle Setting up the project with Maven Coding the sort Understanding the algorithm and language constructs Blocks Variables Types Arrays Expressions Loops Conditional execution Final variables Classes Inner, nested, local, and anonymous classes Packages Methods Interfaces Argument passing Fields Modifiers Object initializers and constructors Compiling and running the program Summary Optimizing the Sort - Making Code Professional The general sorting program A brief overview of various sorting algorithms Quick sort Project structure and build tools Maven dependency management Code the sort Creating the interfaces Creating BubbleSort Amending the interfaces Architectural considerations Creating unit tests Adding JUnit as dependency Writing the BubbleSortTest class Good unit tests A good unit test is readable Unit tests are fast Unit tests are deterministic Assertions should be as simple as possible Unit tests are isolated Unit tests cover the code Refactor the test Collections with wrong elements Handling exceptions Generics Test Driven Development Implementing QuickSort The partitioning class Recursive sorting Non-recursive sorting Implementing the API class Creating modules Why modules are needed What is a Java module Summary Mastermind - Creating a Game The Game The model of the game Java collections Interface collection Set Hash functions Method equals Method hashCode Implementing equals and hashCode HashSet EnumSet LinkedHashSet SortedSet NavigableSet TreeSet List LinkedList ArrayList Queue Deque Map HashMap IdentityHashMap Dependency injection Implementing the game ColorManager The class color JavaDoc and code comments Row Table Guesser UniqueGuesser GeneralGuesser The Game class Creating an integration test Summary Extending the Game - Run Parallel, Run Faster How to make Mastermind parallel Refactoring Processes Threads Fibers java.lang.Thread Pitfalls Deadlocks Race conditions Overused locks Starving ExecutorService ForkJoinPool Variable access The CPU heartbeat Volatile variables Synchronized block Wait and notify Lock Condition ReentrantLock ReentrantReadWriteLock Atomic classes BlockingQueue LinkedBlockingQueue LinkedBlockingDeque ArrayBlockingQueue LinkedTransferQueue IntervalGuesser ParallelGamePlayer Microbenchmarking Summary Making Our Game Professional - Do it as a Webapp Web and network IP TCP/IP DNS The HTTP protocol HTTP methods Status codes HTTP/2.0 Cookies Client server and web architecture Writing servlets Hello world servlet Java Server Pages HTML, CSS, and JavaScript Mastermind servlet Storing state HTTP session Storing state on the client Dependency injection with Guice The MastermindHandler class Storing state on the server The GameSessionSaver class Running the Jetty web servlet Logging Configurability Performance Log frameworks Java 9 logging Logging practice Other technologies Summary Building a Commercial Web Application Using REST The MyBusiness web shop Sample business architecture Microservices Service interface design JSON REST Model View Controller Spring framework Architecture of Spring Spring core Service classes Compiling and running the application Testing the application Integration test Application test Servlet filters Audit logging and AOP Dynamic proxy-based AOP Summary Extending Our E-Commerce Application The MyBusiness ordering Setting up the project Order controller and DTOs Consistency checker Annotations Annotation retention Annotation target Annotation parameters Repeatable annotations Annotation inheritance @Documented annotations JDK annotations Using reflection Getting annotations Invoking methods Setting fields Functional programming in Java Lambda Streams Functional interfaces Method references Scripting in Java 9 Summary Building an Accounting Application Using Reactive Programming Reactive... what? Reactive programming in a nutshell Reactive systems Responsive Resilient Elastic Message-driven Back-pressure Reactive streams Reactive programming in Java Implementing inventory Summary Finalizing Java Knowledge to a Professional Level Java deep technologies Java agent Polyglot programming Polyglot configuration Polyglot scripting Business DSL Problems with polyglot Annotation processing Programming in the enterprise Static code analysis Source code version control Software versioning Code review Knowledge base Issue tracking Testing Types of tests Test automation Black box versus white box Selecting libraries Fit for the purpose License Documentation Project alive Maturity Number of users The "I like it" factor Continuous integration and deployment Release management Code repository Walking up the ladder Summary