Review:
Effective Java, Second Edition, by Joshua Bloch
| Publisher: |
Addison-Wesley |
| Copyright: |
2008 |
| Printing: |
October 2009 |
| ISBN: |
0-321-35668-3 |
| Format: |
Trade paperback |
| Pages: |
319 |
Guy Steele, in the forward to this book, writes:
Programs, unlike spoken sentences and unlike most books and magazines,
are likely to be changed over time. It's typically not enough to
produce code that operates effectively and is readily understood by
other persons; one must also organize the code so that it is easy to
modify. There may be ten ways to write code for some task
T. Of those ten ways, seven will be awkward, inefficient, or
puzzling. Of the other three, which is most likely to be similar to
the code needed for the task T in next year's software
release?
Teaching this, as well as how to avoid being awkward, inefficient, or
puzzling, is the goal of this book. Clearly communicating effective,
idiomatic, and maintainable usage to a newcomer to a programming language
is one of the hardest types of programming books to write. Books like
this are therefore quite scarce. Most introductory texts do try to
communicate some degree of basic usage, but they rarely go far beyond the
syntax, and when they do that usage is rarely both well-defended and
inobvious. Bloch takes the concept quite far indeed, going deep not only
into the Java language but also into object-oriented software construction
in general.
Effective Java is modeled after
Effective C++ by Scott
Meyers, a book I've not read (due to the lack of need for C++ in my
programming life), but which I've heard a great deal about. This means
the book is organized into 78 numbered items, each of which provides
specific advice and analysis about one area of Java. Examples include
item 16, "Favor composition over inheritance," or item 33, "Use
EnumMap instead of ordinal indexing." As you can see, they run the
gamut from high-level design principles to specific coding techniques.
This sort of book demands a lot of the author. Everyone has a coding
style, and everyone can make usage recommendations, but the merits or lack
thereof of specific recommendations are often only visible with
substantial later experience. More than any other type of programming
language book, this sort of usage guide must be written by a language
expert with years of experience with both good and bad code in the
language. This is where
Effective Java shines. Joshua Bloch led
the design and implementation of significant portions of the Java core
libraries at Sun and is currently the chief Java architect at Google, but
even without knowing that background, his expertise is obvious. Every
item in this book is backed up with specific examples and justification,
and Bloch quotes extensively from the Java core library to illustrate both
the advantages of the techniques he describes and the problems that result
when they're not followed.
This is not an introductory book, which is one of the things that makes it
so efficient and concise. It's a book aimed at the intermediate or
advanced Java programmer and assumes you already know the language and the
basic pitfalls. There are only a few items in here that would be obvious
to most experienced programmers, and even there Bloch ties them back to
specific issues in Java in ways that are illuminating. I would not have
expected to learn something new from a chapter on a hoary old problem like
avoiding
float and
double for precise values, but I did:
Bloch discusses the available alternatives within Java and their tradeoffs
and then makes useful specific recommendations.
If, like me, you're an experienced programmer already but relatively new
to Java, you still should not read this book first. You need a general
introduction to the language and libraries and a few projects under your
belt before you can appreciate it. (I personally started with
Thinking in Java by Bruce Eckel and it
served me well, although on several points of style Bloch disagrees with
advice in Eckel's book, and I find Bloch's arguments convincing.) But I
think this is one of the best possible choices for your second book on
Java, in large part because Bloch will head off bad design and style
decisions that you don't realize you're making and catch them before they
become entrenched. I'm glad I read it as soon as I knew the language well
enough to absorb it, and it's the sort of book that I'm likely to re-read
sections of whenever I work on Java code related to those topics.
It's not entirely obvious that you should take my advice about this sort
of book, since I'm not a Java expert and don't have those years of
experience with it. But I've checked the recommendation with other
programmers I know who are experts, and I've never heard anything but
praise for it. It's also one of the books recommended in
Coders at Work, and Bloch is one of the
people interviewed there, which carries a lot of weight with me. And,
apart from that, any long-time programmer who cares about their craft
builds an internal sense of aesthetics around what a well-written program
should look like and finds themselves recognizing a similar sense in other
people's code, even in languages with which they're not familiar. Bloch's
recommendations and analysis
feel right; one can immediately see
how they improve maintainability and robustness, and some of the
techniques he shows are elegant and beautiful.
This is not a general programming book. It's specifically focused on the
Java language, and much of it deals with specific suggestions on how to
use Java's core libraries and language features. If you're not going to
be writing code in Java, I can't really recommend it. But one of the
things I loved about it is that, while talking about Java, Bloch also
talks about object-oriented software construction: techniques for
extending foreign libraries one does not control, API design, and the
proper use of inheritance, among other topics.. That advice is some of
the best object-oriented software design advice I've ever read. There
isn't enough of it to recommend the book to people with no interest in
Java, but this book has even made my C and Perl code better, and has
helped me grasp the tradeoff between inheritance and composition in a
deeper way than I ever had before. It's a lovely side bonus.
If you're writing Java, read this book. If you're learning Java, don't
read it first, but read it second, and more than once, or alongside a
project where you can apply the advice. It's dense and efficient in the
information that it conveys, which means there's more in a couple pages
here than in thirty or forty pages of some of the sprawling introductory
programming books. I did read it cover to cover, which is one of the
better ways to get a sense of Bloch's more general advice on software
construction, but you'll hit information overload and will want to return
to it piecemeal to fully absorb it.
And do get the second edition. I'm sure the first edition is available
cheap used, but the additions of enums and generics to the Java language
are hugely important and provide some of the most elegant and graceful
techniques in the book.
Rating: 9 out of 10