1. Creating and Destroying Objects
    1. Consider static factory method instead of constructor
    2. Consider a builder when faced with many constructor parameters
    3. Enforce the singleton property with a private constructor or an enum type
    4. Enforce noninstantiability with a private constructor
    5. Avoid creating unnecessary objects
    6. Eliminate obsolete object references
    7. Avoid finalizers
  2. Method Common to All Object
    1. Obey the general contract when overriding equals
    2. Always override hashCode when you override equals
    3. Always override toString
    4. Override clone judiciously
    5. Consider implementing Comparable
  3. Classes and Interfaces
    1. Minimize the accessibility of the classes and members
    2. In public classes, use public accessor method, not public fields
    3. Minimize mutability
    4. Favor composition over inheritance
    5. Design or document inheritance or else prohibit it
    6. Prefer interfaces to abstract classes
    7. Use interfaces only to define types
    8. Prefer class hierarchies to tagged classes
    9. Use function objects to represent strategies
    10. Favor static member classes over nonstatic
  4. Generics
    1. Don't use raw types in new code
    2. Eliminate unchecked warnings
    3. Prefer lists to arrays
    4. Favor generic types
    5. Favor generic methods
    6. Use bounded wildcards to increase API flexibility
    7. Consider typesafe heterogenous containers
  5. Enums and Annotations
    1. Use enum instead of int constants
    2. Use instance fields instead of ordinals
    3. Use EnumSet instead of bit fields
    4. Use EnumMap instead of ordinal indexing
    5. Emulate extensible enums with interfaces
    6. Prefer annotations to naming pattern
    7. Use marker interface to define types
  6. Methods
    1. Check parameters for validity
    2. Make defensive copy when needed
    3. Design method signatures carefully
    4. Use overloading judiciously
    5. Use varargs judiciously
    6. Return empty arrays or collection, not null
    7. Write doc comments for all exposed API elements
  7. General Programming
    1. Minimize the scope of local variables
    2. Prefer for-each loops to traditional for loops
    3. Know and use the libraries
    4. Avoid use float and double if exact answers are required
    5. Prefer primitive types to boxed primitives
    6. Avoid strings when other types are more appropriate
    7. Beware of the performance of string concatenation
    8. Refer to objects by their interfaces
    9. Prefer interfaces to reflection
    10. Use native methods judiciously
    11. Optimize judiciously
    12. Adhere to generally accepted naming conventions
  8. Exceptions
    1. Use exceptions only for exceptional condition
    2. Use checked exceptions for recoverable conditions and runtime exceptions for programming errors
    3. Avoid unnecessary use of checked exceptions
    4. Favor the use of standard exceptions
    5. Throw exceptions appropriate to the abstraction
    6. Document all the exception thrown by each method
    7. Include failure-capture information in detail messages
    8. Strive for failure atomicity
    9. Don't ignore exceptions
  9. Concurrency
    1. Synchronize access to shared mutable data
    2. Prefer executors and tasks to threads
    3. Prefer concurrent utilities to wait and notify
    4. Document thread safety
    5. Use lazy initialization judiciously
    6. Don't depend on thread scheduler
    7. Avoid thread group
  10. Serialization
    1. Implement Serializable judiciously
    2. Consider use a custom serialized form
    3. Write readObject methods defensively
    4. For instance control, prefer enum types to readResolve
    5. Consider serialization proxies instead of serialized instances