2009-12-21 5 views
1

J'ai fait trois classes classA, classB et classC dans le même paquet. Maintenant, je fais trois objets de classe A dans la classe B et deux objets de classe A dans la classe C. Maintenant, comment puis-je suivre les choses à l'intérieur de la classe A?Comment obtenir l'instance de la classe

1) Combien d'objets de classe A ont été utilisés par classB et classC? 2) Comment puis-je obtenir le nom & référence des objets de la classe A qui sont dans la classe B et classC?

+0

Voulez-vous cela pour quelque chose de similaire à ce qu'un profileur fait? – GrayWizardx

Répondre

1

Vous ne pouvez pas, sauf si vous fournissez une référence au "propriétaire" au c'tor de chaque objet A.

2

Pour le nombre total de cas, vous pourriez avoir une variable statique dans la classe A. Une variable statique est une variable qui est basée sur la classe elle-même plutôt que l'instance et est définie comme ceci:

private static int totalInstances = 0; 

Ensuite, dans le constructeur de la classe A, vous devez simplement incrémenter cette variable et la décrémenter dans le destructeur.

Vous pouvez ensuite faire un accesseur pour cette variable

public int getTotalInstances(){ 
    return totalInstances; 
} 

Et vous serez alors en mesure d'obtenir le ammount total de cas comme ceci:

classA.getTotalInstances() 

Assurez-vous d'en faire la classe nom plutôt que le nom de l'instance.

Si vous voulez garder une trace des variables de référence, vous pouvez créer un tableau statique de variables de référence, et ajoutez la référence à chaque fois qu'un objet a été créé de la même manière que nous incrémentons les instances au total :)

+0

En dehors de la "Destructor", je suis d'accord. Vous pouvez mettre la décrémentation dans une méthode 'finally' surchargée, mais il n'y a pas de garantie qu'elle soit appelée immédiatement après la destruction de la dernière référence à cette instance. C'est à Big'GC de faire le ménage. –

0

Si vous l'avez fait comme ça:

public class B { 
    private a1 = new A(); 
    private a2 = new A(); 
    private a3 = new A(); 
} 

public class C { 
    private a1 = new A(); 
    private a2 = new A(); 
} 

, vous pouvez utiliser l'API de réflexion pour rechercher des membres de la classe de type A et compter tous les membres non nuls de ce type et reflètent les instances A pour obtenir l'objet noms (supposons, vous avez une sorte de A#getName() méthode).

Si vous l'avez fait comme ça (uniquement le code B):

public class B { 
    public B() { 
    new A(); 
    new A(); 
    new A(); 
    } 
} 

, il n'y a aucune chance de 'regarder une instance B' et dire, combien de a ont été créés. Le seul moyen est d'instrumenter la classe A comme le suggère Dominic. Mais ça ne vous dira pas, combien de A existent, juste combien de A ont été créés jusqu'à maintenant.

Si vous voulez plus de détails, utilisez l'un des nombreux profileurs.

Questions connexes