While preparing for recent job interviews, I've become painfully aware that my Java knowledge, while OK, is a bit lacking. I've never formally been taught Java, and have picked it up from hacking and a few text books. Consequently, my understanding is somewhat fractured.
What I'd like to know, then, is whether anyone can suggest a good reference book or site to get me up to speed with how to do modern Java programming. What I need are examples of good practice, including how to properly design Java applications from a test-driven perspective. Examples of decent Java patterns at a lower level (error handling, scope and size of methods, the Java idiom) would also be useful. Any suggestions?