Practical use.
WHAT TO USE FOR BUILDS
An established build tool, with dependencies declared and versions pinned.
WHAT TO STRUCTURE WITH
Packages reflecting the domain, not technical layers alone.
WHAT TO PREFER
Composition over inheritance Immutability where practical Interfaces defining contracts
WHY IMMUTABILITY
It removes a class of concurrency bugs entirely.
WHAT TO USE FOR ABSENT VALUES
The optional type, rather than returning nothing.
WHY
It makes absence explicit in the signature.
WHAT TO BE CAREFUL WITH
Checked exceptions, which are frequently caught and ignored Deep inheritance hierarchies Over-engineering with patterns that add no value
WHAT TO USE FOR COLLECTIONS
The standard collections, and the stream facilities for transformation.
WHAT TO TEST WITH
The standard testing framework, with a mocking library where needed.
WHAT TO MEASURE
Memory and garbage collection behaviour, under load.
WHY
Garbage collection pauses are the commonest performance surprise.
WHAT TO CONFIGURE
Heap sizing appropriate to the workload and the machine.