== 1. Leak through the constructor ==
  leaky.size() after the caller clears its own list : 0

== 2. Leak through the getter ==
  leaky2.getNames() = [asha, ravi, intruder]

== 3. The defensive version ==
  safe.size() after the caller clears its list : 2
  safe.getNames().add(...) -> UnsupportedOperationException

== 4. unmodifiableList is a VIEW; List.copyOf is a SNAPSHOT ==
  source   = [a, b, c]
  view     = [a, b, c]
  snapshot = [a, b]

== 5. copyOf is shallow: the ELEMENTS are still shared ==
  frozen.get(0) = x-mutated
