How to Choose Right Types in Java
- Effective Java Item 61: Prefer primitive types to boxed primitives
- avoid null check and potentially NullPointerException
- Avoid auto-box and unbox
- Prefer Collection over Array
- Avoid use pair, use custom named class instead.
Avoid using primitive data types to represent domain ideas: Primitive Obsession
- Avoid using primitives to represent time, use java.time types: Instant or Duration
- Avoid use Joda in new code.
- Item 62: Avoid strings where other types are more appropriate
- Strings are poor substitutes for enum types, aggregate types, for capabilities
- timeoutInSeconds > Duration
Prefer Immutable Types
- Choose an Immutable type unless specific need for mutation
- Use immutable type in declaration: immutability is semantics, not an implementation detail.
How General/Specific in parameter or return types?
- For parameters, use the most general type
- For return types, use the most specific type
Collections
- Use ArrayList instead of LinkedList in most cases.
- LinkedList uses much more space.
- Use set-like type unless duplicate elements are possible
- Use a bi-map-like type unless values are not unique
- Only use sorted-like types if the data must be sorted as they come with additional runtime overhead.
Avoid semantic-free types
- The built-in functions: (Supplier, Consumer, BiFunction etc) are essentially semantic-free.
- Create custom function types with meaningful names if needed.