Design the boundary: isolate Java types, handle nulls, avoid reflection, and keep the core idiomatic.
Interop is easiest to maintain when it is treated as an architectural boundary, not a convenience hack.
For Java engineers, a useful checklist:
null defensively and decide on a clear nil convention.If you get the boundary right, you can use Java libraries aggressively without losing the benefits that brought you to Clojure in the first place.