Impression unique de l'identité de l'objet à des fins de débogage en Java
Commençons avec le code.
Future<MyResult> obj = getFuture();
debugLog.println("Handling future: " + System.identityHashCode(obj);
et puis quelque chose d'autre-même, ou peut-être le même morceau de code exécuté à nouveau, éventuellement dans le thread différent.
Future<MyResult> obj = getFuture();
debugLog.println("Handling future: " + System.identityHashCode(obj);
Maintenant ci-dessus, si obj est le même objet, le débogage de tirages sera le même, évidemment. Mais si ils sont différents, il y a encore une chance de hash collision, de sorte que l'impression peut être même, même pour des objets différents. De sorte d'avoir le même résultat (ou, plus généralement, de la même chaîne) ne garantit pas le même objet.
Question: Est-il un moyen en Java pour obtenir l'id unique chaîne pour objet arbitraire? Ou plus formellement, donner static String Id.str(Object o)
méthode afin que, de sorte que c'est toujours vrai:
final Object obj1 = ...;
final String firstId = Id.str(obj1);
//arbitrary time passes, garbage collections happen etc.
//firstId and obj1 are same variables as above
(firstId.equals(Id.str.obj2)) == (obj1 == obj2)
OriginalL'auteur hyde | 2013-01-24
Vous devez vous connecter pour publier un commentaire.
Je pense, qu'en fait il n'y a pas une méthode quelconque (c'est à dire la technique) qui vous garantira une telle unicité de l'IDENTIFIANT d'objet. Le seul but de cette identification - est une méthode pour répondre à cet objet de données dans la mémoire. Dans le cas où cet objet meurt, et puis être supprimées de la mémoire par GC, personne ne va limiter système à l'utilisation de son ancienne adresse de l'espace pour placer de nouvelles données de l'objet.
Mais en fait, pendant une brève période, parmi tous les objets disponibles, qui ont toutes les références à l'intérieur de votre programme,
System.identityHashCode(obj)
sera effectivement vous donner unique identité de l'objet. C'est parce que cehashCode
est calculée à l'aide de l'objet dans l'emplacement mémoire. Cependant, il est une implémentation de la fonctionnalité, qui n'est pas documentée et de la garantie pour les étrangers Jvm.Aussi, vous pouvez lire ce fameux QA: Java: Comment faire pour obtenir l'IDENTIFIANT unique d'un objet qui remplace hashCode()?
OriginalL'auteur Andremoniy
En supposant qu'il n'est pas important pour cet ID pour être le hashcode ensuite, vous pouvez garantir un ID unique par le fait d'avoir une classe Singleton la génération de l'ID qui sont affectés à chaque objet. Vous pouvez ensuite utiliser cet identifiant plutôt que le hashcode.
Quel est votre objectif, il existe peut-être mieux solitions?
Désolé, je dois avoir manqué où il a dit ça, j'ai été en supposant qu'il est en train de définir les classes et peut donc mettre ce qu'il aime chez eux.
Ainsi, un objet est ce qui est implicite dans la question: en regardant les logs et voir imprimé Id. Évidemment il y a des solutions, telles que l'impression de certains cas spécifiques données d'identification lorsqu'ils sont disponibles. Mais quand le type est quelque chose comme
Future<>
, c'est dur. Donc je me demande si une solution générique existe.Désolé, pas de sens à étendre cette ligne, comme l'indique clairement, ce n'est pas ce que vous voulez, mais étant donné que l'Avenir est générique, j'ai été en déduire que c'était le type du résultat retourné vous vous préoccupiez et tort supposé ceux qui allaient être de vos objets. Si vous en avez besoin pour travailler sur n'importe quelle et toutes les classes, en particulier, y compris ceux que vous n'avez pas produit alors ce n'est pas possible et la probabilité de collision augmente à mesure que vous n'avez pas de point de vue de la hashcode implémentations.
OriginalL'auteur codeghost