Effective Java (!) may be a contender, as it teaches about avoiding mutable state, composition over inheritance, etc
Effective Java (!) may be a contender, as it teaches about avoiding mutable state, composition over inheritance, etc