113 votes

Comment obtenez-vous la "référence d'objet" d'un objet en java quand toString () et hashCode () ont été surchargés?

Je voudrais imprimer la "référence de l'objet" d'un objet en Java pour des fins de débogage. I. e. assurez-vous que l'objet est le même (ou autre) en fonction de la situation.

Le problème est que cette classe hérite d'une autre classe, qui a remplacé à la fois les méthodes toString() et hashCode() qui doit normalement me donner l'id.

Exemple de situation: L'exécution d'une application multi-thread, où j'ai (en cours de développement) voulez vérifier si tous les threads utiliser la même instance d'un objet de ressource ou pas.

112voto

TofuBeer Points 32441

Exactement ce que vous prévoyez faire avec elle (ce que vous voulez faire une différence avec ce que vous aurez besoin de faire appel).

hashCode,tel que défini dans la documentation javadoc dit:

Autant qu'il est raisonnablement pratique, le hashCode de la méthode définie par la classe L'objet n'retour distincts entiers pour des objets distincts. (C'est généralement mis en œuvre par la conversion de l'adresse interne de l'objet en entier, mais ce la mise en œuvre technique n'est pas exigé par les JavaTM de programmation les langues.)

Donc, si vous utilisez le hashCode pour savoir si c'est un objet unique dans la mémoire qui n'est pas une bonne façon de le faire.

Système.identityHashCode effectue les opérations suivantes:

Renvoie le même code de hachage pour l' objet donné que serait retourné par par défaut, la méthode hashCode(), si ou pas la classe de l'objet remplace hashCode(). Le code de hachage pour la référence nulle est égale à zéro.

Qui, pour ce que vous faites ressemble à ce que vous voulez... mais ce que vous voulez faire peut ne pas être en sécurité en fonction de la façon dont la bibliothèque est mis en œuvre.

54voto

Nicolai Points 1265

Voici comment je l'ai résolu:

 Integer.toHexString(System.identityHashCode(object));
 

8voto

noahlz Points 4731

Double est égal à == sera toujours vérifier fondée sur l'identité de l'objet, indépendamment de l'objet de la mise en œuvre de hashCode ou égal. De cours - assurez-vous que les références de l'objet de la comparaison sont volatile (en 1.5+ JVM).

Si vous devez vraiment avoir l'Objet original toString résultat (même si c'est pas la meilleure solution pour votre exemple de cas d'utilisation), les Communes Lang bibliothèque a une méthode ObjectUtils.identityToString(Objet) qui permettra de faire ce que vous voulez. À partir de la JavaDoc:

public static java.lang.String identityToString(java.lang.Object object)

Obtient le toString qui serait produit par Objet, si une classe n'a pas substituer toString lui-même. null retourner la valeur null.

 ObjectUtils.identityToString(null)         = null
 ObjectUtils.identityToString("")           = "java.lang.String@1e23"
 ObjectUtils.identityToString(Boolean.TRUE) = "java.lang.Boolean@7fa"

5voto

Robin Points 15032

Vous ne pouvez pas vous en toute sécurité, faire ce que vous voulez puisque le défaut hashCode() ne peut pas renvoyer l'adresse, et a été mentionné, plusieurs objets avec le même hashCode sont possibles. La seule façon d'accomplir ce que vous voulez, c'est de remplacer le hashCode() méthode pour que les objets en question et de garantir qu'ils fournissent tous des valeurs uniques. Si cela est faisable dans votre situation c'est une autre question.

Pour l'anecdote, j'ai connu plusieurs objets avec le même défaut hashcode IBM VM en cours d'exécution dans un serveur. Nous avons eu un défaut où les objets de la mettre dans une mise en cache distant serait écrasé à cause de cela. Qui a été une révélation pour moi à ce point depuis que j'ai assumé la valeur par défaut hashcode a été les objets de la mémoire d'adresse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X