Effective Java (2nd Edition) by Joshua Bloch