I'd say if you create Immutable collection then you need to protect yourself from somebody modifying list that was given as an argument to constructor, you should protectively copy it.
public Immutable(List<Integer> values, String hello) {
this.values = Collections.unmodifiableList(new ArrayList<Integer>(values));
this.hello = hello;
}
I personally have long ago switched to Guava collections as there you can find interfaces for immutable collections. Your constructor would look like that:
public Immutable(ImmutableList<Integer> values, String hello) {
this.values = values;
this.hello = hello;
}
You'd be sure that argument you receive will not be modified by anyone.
It is usually a good idea to keep reference to immutable list within your immutable class as it then guarantees that you don't modify it by mistake.
Case (1) in my opinion makes sense only when factory method is the only way to create the immutable collection and even then it may break when someone refactors these classes. Unless there are other limitations it is always best to create self-sufficient classes.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…