You are previewing Effective Java™.
O'Reilly logo
Effective Java™

Book Description

Are you looking for a deeper understanding of the Java™ programming language so that you can write code that is clearer, more correct, more robust, and more reusable? Look no further! Effective Java™, Second Edition, brings together seventy-eight indispensable programmer’s rules of thumb: working, best-practice solutions for the programming challenges you encounter every day.

This highly anticipated new edition of the classic, Jolt Award-winning work has been thoroughly updated to cover Java SE 5 and Java SE 6 features introduced since the first edition. Bloch explores new design patterns and language idioms, showing you how to make the most of features ranging from generics to enums, annotations to autoboxing.

Each chapter in the book consists of several “items” presented in the form of a short, standalone essay that provides specific advice, insight into Java platform subtleties, and outstanding code examples. The comprehensive descriptions and explanations for each item illuminate what to do, what not to do, and why.

Highlights include:

  • New coverage of generics, enums, annotations, autoboxing, the for-each loop, varargs, concurrency utilities, and much more

  • Updated techniques and best practices on classic topics, including objects, classes, libraries, methods, and serialization

  • How to avoid the traps and pitfalls of commonly misunderstood subtleties of the language

  • Focus on the language and its most fundamental libraries: java.lang, java.util, and, to a lesser extent, java.util.concurrent and

  • Simply put, Effective Java™, Second Edition, presents the most practical, authoritative guidelines available for writing efficient, well-designed programs.

    Table of Contents

    1. Copyright
      1. Dedication
    2. Praise for the First Edition
    3. The Java™ Series
    4. Foreword
    5. Preface
      1. Preface to the Second Edition
      2. Preface to the First Edition
    6. Acknowledgments
      1. Acknowledgments for the Second Edition
      2. Acknowledgments for the First Edition
    7. 1. Introduction
    8. 2. Creating and Destroying Objects
      1. Item 1: Consider static factory methods instead of constructors
      2. Item 2: Consider a builder when faced with many constructor parameters
      3. Item 3: Enforce the singleton property with a private constructor or an enum type
      4. Item 4: Enforce noninstantiability with a private constructor
      5. Item 5: Avoid creating unnecessary objects
      6. Item 6: Eliminate obsolete object references
      7. Item 7: Avoid finalizers
    9. 3. Methods Common to All Objects
      1. Item 8: Obey the general contract when overriding equals
      2. Item 9: Always override hashCode when you override equals
      3. Item 10: Always override toString
      4. Item 11: Override clone judiciously
      5. Item 12: Consider implementing Comparable
    10. 4. Classes and Interfaces
      1. Item 13: Minimize the accessibility of classes and members
      2. Item 14: In public classes, use accessor methods, not public fields
      3. Item 15: Minimize mutability
      4. Item 16: Favor composition over inheritance
      5. Item 17: Design and document for inheritance or else prohibit it
      6. Item 18: Prefer interfaces to abstract classes
      7. Item 19: Use interfaces only to define types
      8. Item 20: Prefer class hierarchies to tagged classes
      9. Item 21: Use function objects to represent strategies
      10. Item 22: Favor static member classes over nonstatic
    11. 5. Generics
      1. Item 23: Don’t use raw types in new code
      2. Item 24: Eliminate unchecked warnings
      3. Item 25: Prefer lists to arrays
      4. Item 26: Favor generic types
      5. Item 27: Favor generic methods
      6. Item 28: Use bounded wildcards to increase API flexibility
      7. Item 29: Consider typesafe heterogeneous containers
    12. 6. Enums and Annotations
      1. Item 30: Use enums instead of int constants
      2. Item 31: Use instance fields instead of ordinals
      3. Item 32: Use EnumSet instead of bit fields
      4. Item 33: Use EnumMap instead of ordinal indexing
      5. Item 34: Emulate extensible enums with interfaces
      6. Item 35: Prefer annotations to naming patterns
      7. Item 36: Consistently use the Override annotation
      8. Item 37: Use marker interfaces to define types
    13. 7. Methods
      1. Item 38: Check parameters for validity
      2. Item 39: Make defensive copies when needed
      3. Item 40: Design method signatures carefully
      4. Item 41: Use overloading judiciously
      5. Item 42: Use varargs judiciously
      6. Item 43: Return empty arrays or collections, not nulls
      7. Item 44: Write doc comments for all exposed API elements
    14. 8. General Programming
      1. Item 45: Minimize the scope of local variables
      2. Item 46: Prefer for-each loops to traditional for loops
      3. Item 47: Know and use the libraries
      4. Item 48: Avoid float and double if exact answers are required
      5. Item 49: Prefer primitive types to boxed primitives
      6. Item 50: Avoid strings where other types are more appropriate
      7. Item 51: Beware the performance of string concatenation
      8. Item 52: Refer to objects by their interfaces
      9. Item 53: Prefer interfaces to reflection
      10. Item 54: Use native methods judiciously
      11. Item 55: Optimize judiciously
      12. Item 56: Adhere to generally accepted naming conventions
    15. 9. Exceptions
      1. Item 57: Use exceptions only for exceptional conditions
      2. Item 58: Use checked exceptions for recoverable conditions and runtime exceptions for programming errors
      3. Item 59: Avoid unnecessary use of checked exceptions
      4. Item 60: Favor the use of standard exceptions
      5. Item 61: Throw exceptions appropriate to the abstraction
      6. Item 62: Document all exceptions thrown by each method
      7. Item 63: Include failure-capture information in detail messages
      8. Item 64: Strive for failure atomicity
      9. Item 65: Don’t ignore exceptions
    16. 10. Concurrency
      1. Item 66: Synchronize access to shared mutable data
      2. Item 67: Avoid excessive synchronization
      3. Item 68: Prefer executors and tasks to threads
      4. Item 69: Prefer concurrency utilities to wait and notify
      5. Item 70: Document thread safety
      6. Item 71: Use lazy initialization judiciously
      7. Item 72: Don’t depend on the thread scheduler
      8. Item 73: Avoid thread groups
    17. 11. Serialization
      1. Item 74: Implement Serializable judiciously
      2. Item 75: Consider using a custom serialized form
      3. Item 76: Write readObject methods defensively
      4. Item 77: For instance control, prefer enum types to readResolve
      5. Item 78: Consider serialization proxies instead of serialized instances
    18. Items Corresponding to First Edition
    19. References