public class App {
private final A a;
private final Server server;
public App(){
a = new A(this); //Bad, this is escaping before it's initialized.
}
@Subscribe //This event fires some time after App is finished constructing.
public void registerStuff(RegisterEvent event){
server = event.getServer(); //Not possible due to final field and this not being the constructor, is there such thing as a lazy final?
a.register();
}
}
public class A {
private final App app;
private final BuilderSpec spec;
public A(App app){
this.app = app;
this.spec = app.getServer().builder(this.app).build();
}
public void register(){
app.getServer().doStuff(this.app, this.spec);
}
}
Ho letto un po 'di ciò che "questo" fuga è e rendersi conto che il codice precedente è male, come ho idea di cosa i processi esterni stanno facendo con questo riferimento, quindi non dovrebbe essere passato al di fuori del costruttore fino a quando non viene costruito.Prevenire "questa" fuga in corso d'opera con campi finali
Tuttavia, a causa dei campi finali in App e A, non vedo davvero come posso inizializzarlo in seguito, o pigramente. Rendere i campi definitivi meno importanti di quelli che scappano? Non ne sono sicuro.
Non è automaticamente male, e quello che hai va bene. Devi solo fare attenzione che il tuo oggetto sia in uno stato consistente prima di passare 'this' fuori dal costruttore. Deve essere evitato, sì, ma se si ha una dipendenza circolare (come si fa) e ciò che entrambi gli elementi devono essere "definitivi", non c'è alternativa. –
Avere una tale dipendenza circolare non è molto buona immagino ... no ?? – Codebender
Le dipendenze circolari di @AbishekManoharan sono perfettamente naturali. Si verificano tutto il tempo in modo completamente organico e fanno certamente parte della normale modellazione OO. –