Existe-t-il un bon moyen de conserver une référence à un objet créé dans un constructeur qui doit être passé au super constructeur d'une classe étendue (autre que de le rendre accessible depuis le super classe ou en le passant dans le constructeur en tant que paramètre)? Laissez-moi clarifier avec un exemple.Conserver la référence à un nouvel objet passé dans le super constructeur
Prenez cette classe (que je ne peux pas modifier et qui ne me donne pas accès à foo):
class TestA {
TestA(Object foo) {}
}
Maintenant, je voudrais cette classe étend comme suit:
class TestB extends TestA {
Object myCopyOfFoo;
TestB() {
super(new Object());
}
}
est-il un bon moyen de stocker le new Object()
créé dans myCopyOfFoo
?
Ni l'un de ces trois idées de travail:
TestB() {
myCopyOfFoo = new Object();
super(myCopyOfFoo);
}
(erreur: appel constructeur doit être la première instruction dans un constructeur)
TestB() {
super(myCopyOfFoo = new Object());
}
(erreur: ne peut pas se référer à un champ d'instance myCopyOfFoo tout en invoquant explicitement un constructeur)
TestB() {
super(makeFoo());
}
Object makeFoo() {
myCopyOfFoo = new Object();
return myCopyOfFoo;
}
(Erreur: ne peut pas faire référence à un i méthode de nstance en invoquant explicitement un constructeur)
Je suppose que je pouvais faire ce qui suit, mais il est ni thread-safe, ni élégant:
static Object tempFoo;
TestB() {
super(tempFoo = new Object());
myCopyOfFoo = tempFoo;
}
Quelqu'un at-il une meilleure idée pour moi? Et pourquoi diable mes deux premières idées ne sont-elles pas légitimes?
Cela ressemble à une bonne solution qui correspond effectivement mon code bien, puisque je suis déjà en utilisant le deuxième constructeur privé dans de nombreux cas de toute façon. Je suis tenté de cocher cette réponse, mais cela semble encore beaucoup de code.J'en doute, mais voyons s'il y a des suggestions encore plus courtes. Mais merci déjà! –
@Markus: J'ai une suggestion potentielle si votre cas * real * prend déjà un paramètre et crée une copie. Si le code que vous avez donné est vraiment représentatif (c'est-à-dire qu'il crée un nouvel objet à partir de rien) alors mon autre suggestion n'aiderait pas. Je vais le modifier cependant. –