I have just finished Joshua Bloch’s Effective Java Programming Language Guide and I can confidently say it is brilliant. This book will not introduce Java to the uninitiated, but it does illuminate the dusty and frankly perverse corners of a very powerful language. Although it is a dense read, it is a resource I will be returning to again and again.
With his many citings of the official Java spec, Bloch’s authority is quickly established. Anyone that explains the uses and abuses of such common, but mysterious object properties as serialVersionUID and hashCode already has won me over.
Bloch’s real gift is in making these opaque features understandable and putting them in to a context an average programmer is likely to understand. For instance, all Java objects have a clone() method that’s meant to quickly and effeciently create new copies of an instantiated object. However, correctly implementing a clone() method is far trickier than it looks. And the same goes for the Serializable interface.
In many ways, Bloch complements the Gang of Four’s Design Patterns. He extends the higher order approach to object-oriented programming into the Java context and provides concrete advice (e.g. favor object composition to inheritence, limit your APIs expose to the minimum, use the Singleton pattern for effeciency and comparison correctness, etc.).
What this book isn’t is a how-to guide to anything. This is programming practices book and it rates as highly as any I’ve read.