== 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