Effective Java

Duration: 4 days


Java is an easy platform in which to get started, but difficult to master. In this course, we have collected best practices and patterns to help Java programmers move from fluency to mastery.

We cover many of the best practices from Joshua Bloch’s book, but in addition, we have added examples of patterns and anti-patterns that we and our customers have experienced.


  • Learn how to write effective Java programs

  • Avoid common costly traps


Java programmers


Creating and destroying objects

  • Static factory methods

  • Builders

  • Singletons

  • How to avoid creating unnecessary objects?

Common object methods

  • Proper use of equals

  • Proper use of hashCode

  • Proper implementation of toString

  • Cloning objects

Mastering classes and interfaces

  • Accessibility of members and classes

  • Accessors vs. fields

  • Composition vs. inheritance

  • Proper use of Interfaces

  • Proper design of class hierarchies

  • Implementation strategies with function objects


  • Avoiding raw types

  • Factoring generic collections

  • Creating generic types and methods

  • The rule of PECS

  • Increasing API flexibility


  • Defining enumeration

  • Using annotations

  • Proper use of enumeration and annotations

Mastering methods

  • Designing method signatures

  • Validate parameters

  • Method overloading

  • Overloading, generics, and autoboxing

  • Default methods

  • Using variable lists of arguments

Programming techniques

  • For-each loops

  • Minimizing scope of local variables

  • Working with exact numbers

  • Strings vs. more meaningful classes

  • Interfaces vs. reflection

Working with exceptions

  • Handling exceptional conditions

  • Using standard exceptions

  • Unnecessary checked exceptions

  • Exceptions and abstractions

  • Capture failure information

Java NIO

  • High-speed I/O

  • Buffers

  • Channels

  • Schedulers

  • Proper use of NIO


  • Executors

  • Futures

  • BlockingQueue

  • CountdownLatch

  • Locks

  • Semaphores

  • Exchanges

  • Atomic variables

  • Callable

Java Lambda

  • Lambda syntax

  • Why Lambda?

  • Closures

  • Function composition

  • Monoids

  • Monads

Java Streaming

  • Essential concepts

  • Streaming functions

  • Parallelism and streaming

  • Streaming alternatives