Voglio solo un feedback su ciò che consideri il "design più elegante" per una situazione come questa.
Ho un oggetto che è immutabile con alcuni (alcuni) costruttori di copie per consentire la creazione di una versione simile ma modificata del mio oggetto immutabile. Quindi qualcosa di simile:
class ImmutableObject{
Fee fee;
Fi fi;
Fo fo;
public ImmutableObject(Fee fee, Fi fi, Fo fo){
this.Fee=fee;
this.fi=fi;
this.fo=fo;
}
public ImmutableObject(ImmutableObject cloneObj, Fee fee){
this.fi=cloneObj.fi;
this.fo=cloneObj.fo;
this.fee=fee;
}
public ImmutableObject(ImmutableObject cloneObj, Fi fi){
this.fee=cloneObj.fee;
this.fo=cloneObj.fo;
this.fi=fi
}
public ImmutableObject(ImmutableObject cloneObj, Fo fo){
this.fi=cloneObj.fi;
this.fee=cloneObj.fee;
this.fo=fo;
}
}
Ora sto espandendo questo creando una sottoclasse con un comportamento extra:
Class ImmutableChild extends ImmutableObject{
Fum fum;
ImmutableChild(Fee fee, Fi fi, Fo fo, Fum fum){
super(fee, fi, fo);
this.fum=fum;
}
Il problema è che ho una collezione di "ImmutableObjects" che contiene sia classi originali che secondarie. Quando provo a clonarli per ottenere un nuovo oggetto con un elemento modifid, i miei costruttori di copie creeranno sempre una classe di tipo genitore "ImmutableObject" e perdono completamente lo stato di "fum" se sto effettivamente clonando la classe child.
Posso facilmente refactoring questo per soddisfare qualsiasi soluzione che voglio, copiare costruttore, metodi clone ecc. Tuttavia, mentre posso ottenere il comportamento che voglio, non sono sicuro di ciò che sarebbe considerato sia soluzione elequant e non-ridimensionato. Qual è il metodo più pulito per consentire un metodo che creerà un "clone" del mio oggetto con un valore modificato che funziona bene con le classi per bambini che espandono la funzionalità?