La mia situazione particolare è legata a Java, ma credo che questa sia una domanda OOP più generale della solo programmazione Java.
La domanda: i metodi "mutator" dovrebbero eseguire copie profonde o superficiali ?
Un esempio:
Supponiamo che il mio oggetto abbia la seguente struttura:
public class MyObj {
ArrayList<Integer> myList;
//constructors, etc.
public void setMyList(ArrayList<Integer> list) {
this.myList = list; //Option 1
//OR
this.myList = new ArrayList<Integer>(list); //Option 2
}
}
La mia ipotesi è che l'opzione 2 sia la migliore. Questo perché impedisce ad una classe esterna di avere accesso diretto alla lista di MyObj
. Ad esempio, se l'ho fatto:
public class SomeOtherClass {
public static void main(String[] args) {
ArrayList<Integer> exampleList = new ArrayList<>(Arrays.asList(1, 2, 3));
MyObj a = new MyObj();
a.setMyList(exampleList);
exampleList.add(4);
}
}
Alla fine di main
, l'opzione 1 significa che a.myList
contiene 4
, mentre l'opzione 2 significa a.myList
è ancora composta da 1, 2, 3
. Per me, il secondo sembra preferibile.
Esiste uno standard / convenzione riguardo a questa situazione?