Effective Java
Creating and Destroying Objects
Static Factory Method instead of Constructors
- Names improve readability
- Different methods for different use cases
- Only one constructor with same signature
- Caching possible
- Can return subtype
- Java8 allows static methods
- Allow service provider frameworks
- e.g. JDBC, DriverManager.getConnection
- Also great for test fixtures
- of(), from()...
Builder for many Constructor Parameters
- Static factories and constructors don't scale for large number of optional parameters
- Telescoping constructor as an anti pattern
- Devs might confuse parameters with same type (compiler doesn't care(
- JavaBeans pattern
- Empty contructor + setters
- Creates partially inconsistent objects during creation
- Builder pattern instead
- Create builder, set values (fluent), call build()
- E.g. as static member class
Builder for Class Hierarchies
- Implement using a generic type with a recursive type paramter
- Builder<T extends Builder<T>>
- Use parent builder type in subclasses
- Beware: Problematic for other JVM languages (Kotlin, Scale)
- See Testcontainers GenericContianer
Builder for Class Hierarchies
- Implement using a generic type with a recursive type paramter
- Builder<T extends Builder<T>>
- Use parent builder type in subclasses
- Beware: Problematic for other JVM languages (Kotlin, Scale)
- See Testcontainers GenericContianer
Singleton
- Public static field
- Easy to implement, but strong coupling
- Static factory method
- Singleton becomes implementation detail
- Use factory or runtime checking for testability?
- Single-element enum
- Simple to implement
- Strong guarantees
Can find improve the existing codebase? Examples?
Effective Java
By Kevin Wittek
Effective Java
- 1,134