Voglio mantenere una dipendenza disaccoppiata, ma allo stesso tempo, una volta passata alla funzione di costruzione, voglio consentire le modifiche solo attraverso Whatever
(nell'esempio seguente) perché la modifica della dipendenza dall'esterno invaliderebbe la stato dell'oggetto Whatever
che dipende da esso. Quindi tengo una copia, invece:
class Whatever{
private Dependency d;
public constructor(Dependency d){
this.d = d.clone();
}
// ...
}
Tuttavia la dipendenza è enorme quindi ho deciso di evitare la copia; Ho rimosso clone()
e ho spiegato chiaramente che una volta che la dipendenza viene passata a questa classe, non deve essere modificata dall'esterno.
La domanda è: esiste un modo per evitare la copia e allo stesso tempo mantenere l'incapsulamento corretto? E con l'incapsulamento corretto intendo immediatamente l'errore sui tentativi di accesso dall'esterno o evitando completamente la possibilità di accesso dall'esterno.
La mia ipotesi è che non posso. Non usando l'interpretazione OOP di Java / C # / etc.
Quindi chiedo anche, ci sono lingue che coprono un caso del genere? Come funzionano?
Un'opzione che potrei avere è la seguente, assumendo una lingua che fa conteggio dei riferimenti :
class Whatever{
private Dependency d;
public constructor(Dependency d){
this.d = d.isTheOnlyReference() ? d : d.clone();
}
// ...
}
new Whatever(new Dependency()); // no clone performed
Dependency d = new Dependency();
new Whatever(d); // clone performed, as Dependency has >= 1 references