When I was writing the last post, I realized how much I used to be in awe of Effective Java [Bloch, 2017]. It was a book that covered what no other did. It wasn't just coding -- there're plenty of books where one could learn "Your first Java Program" and beyond, and throw an air punch. It wasn't also about language syntax and semantics -- Java Complete Reference [Schildt, 2017] fitted the bill there*, or OOPs (every other Java book started with OOPs concepts). Rather, Effective Java covered the basics of writing elegant Java code, and as a by-product, also underlined how easy was it to be swayed away by 'convention'. I wouldn't recommend it as a Java learner's first book. But it should very well be one's second Java book and the one that she/he would keep revisiting throughout the programming career.
Ever since I've picked it up again, it's become tough to keep it aside. With each of its topic, I realize, over time, how much have I drifted away from the delight of writing good code, and how much do I need to still learn. Go read it now if you haven't had a chance yet. What's more, the much-awaited 3/E, which covers Java 7, 8 and 9, is out now!
While on this topic, let me talk about another one of my favourite books on Java -- Thinking in Java [Eckel, 1998].
This is the book which I considered as a Java developer's Bible at one point in time. Since there are no new editions after the 4/E, the syntactical parts might be a bit obsolete now. But still, in my opinion, it's the best book to get one's (Java & OOPS) fundamentals in place.
* I have always found Java Complete Reference a bit too elaborate to my liking. Most of which is about the language syntax and semantics. All of that might have been useful in the early days of the Internet when it wasn't that easy to look up things online. But I doubt if that's needed now.