2009-09-27 8 views

Répondre

5

Réponse courte: il n'y a pas moyen de faire cela en Java. Réponse: Le code qui se comporte différemment selon l'endroit où il est invoqué est presque toujours une mauvaise idée.

Réponse longue: Le code qui se comporte différemment selon l'endroit où il est invoqué est presque toujours une mauvaise idée. . C'est déroutant pour celui qui doit maintenir votre code, et cela nuit gravement à votre capacité de refactorisation. Par exemple, supposons que vous réalisiez que deux des instances instanciant votre objet ont essentiellement la même logique, donc vous décidez de factoriser les bits communs. Surprise! Maintenant, le code se comporte différemment car il est instancié ailleurs. Ajoutez simplement le paramètre et réparez les appelants. Cela vous fera gagner du temps à long terme.

1

L'interception d'appels de méthode (y compris les constructeurs) sans modification d'une tonne de code existant est une chose pour laquelle Aspect-oriented programming a été créé.

Pour commencer, consultez AspectJ. Avec AspectJ, vous pouvez définir un "pointcut" qui spécifie que vous voulez intercepter les appels constructeurs pour un certain objet ou un ensemble d'objets (en utilisant des caractères génériques si nécessaire), et dans le code d'interception ("advice"), vous recevrez un contexte de méthode, qui inclut des informations sur la méthode et l'objet appelant.

Vous pouvez même utiliser AspectJ pour ajouter des champs à vos objets afin de stocker la référence parente sans modifier leur code existant (cela s'appelle "introduction").

+0

Merci pour l'entrée, mais ajouter plus de librairies à la base de code n'est pas quelque chose que je veux faire. J'espérais une solution rapide et facile au problème en utilisant juste Java. – Andreas

+0

... ça devient Java! Désolé, je n'ai pas pu résister. Bonne chance! – JoshJordan

3

Si vous voulez connaître la classe invoquante, passez "this" en tant que paramètre au constructeur.

Thing thing = new Thing(this); 

Edit: Un IDE moderne permettant refactoring rendre ce très facile à faire.

+0

Cela indique également que «Chose» est un candidat pour une classe interne. – erickson