C'è un buon modo per mantenere un riferimento a un oggetto creato in un costruttore che deve essere passato al super costruttore di una classe estesa (diverso da quello che lo rende accessibile dalla super classe o passarlo nel costruttore come parametro)?Mantenere riferimento al nuovo oggetto passato in super costruttore
Vorrei chiarire con un esempio. Prendete questa classe (che non posso modificare e che non mi dà l'accesso a foo):
class TestA {
TestA(Object foo) {}
}
Ora, vorrei estende questa classe come segue:
class TestB extends TestA {
Object myCopyOfFoo;
TestB() {
super(new Object());
}
}
C'è un buon modo per memorizzare il creato new Object()
in myCopyOfFoo
?
Nessuno di questi tre idee funzionano:
TestB() {
myCopyOfFoo = new Object();
super(myCopyOfFoo);
}
(Errore: chiamata al costruttore deve essere la prima istruzione in un costruttore)
TestB() {
super(myCopyOfFoo = new Object());
}
(Errore: non può fare riferimento a un myCopyOfFoo campo di istanza invocando esplicitamente un costruttore)
TestB() {
super(makeFoo());
}
Object makeFoo() {
myCopyOfFoo = new Object();
return myCopyOfFoo;
}
(Errore: impossibile fare riferimento a un Metodo nstance mentre invocando esplicitamente un costruttore)
Credo che avrei potuto fare quanto segue, ma non è né thread-safe né elegante:
static Object tempFoo;
TestB() {
super(tempFoo = new Object());
myCopyOfFoo = tempFoo;
}
Qualcuno ha un'idea migliore per me? E perché mai le mie prime due idee non sono legittime?
Questo appare come una buona soluzione che si inserisce in realtà il mio codice bene, dal momento che sto già utilizzando il secondo costruttore privato, in molti casi comunque. Sono tentato di segno di spunta già questa risposta, ma sembra ancora come un sacco di codice.Ne dubito, ma vediamo se ci sono suggerimenti ancora più brevi. Ma grazie già! –
@Markus: ho un potenziale suggerimento se il tuo caso * real * effettivamente prende già un parametro e crea una copia. Se il codice che hai fornito è realmente rappresentativo (cioè sta creando un nuovo oggetto dal nulla), il mio altro suggerimento non sarebbe di aiuto. Lo modificherò comunque. –