|
|
|
|
Ce n'est pas pour répondre à batmat (car le topic date de 2003), mais parce que je me posais la question, et que je n'ai trouvé que cette question sans réponse sur ce forum.
Aussi, le prochain qui cherchera (in y en a ?), trouvera sa réponse. Il n'y a, en théorie, aucun moyen de connaître l'adresse mémoire d'un objet Java, sauf qu'il existe une fonction particulière : System.identityHashCode(Object o) Elle appelle la fonction native Object.hashCode() sur l'objet o (et non celle éventuellement surdéfinie). Et il se trouve qu'actuellement toutes les implémentations des JVM retournent l'adresse mémoire de l'objet. Mais il peut exister quelque part dans ce bas monde (surtout maintenant qu'il est OpenSource) une JVM qui ne souhaite pas procéder ainsi. Et elle aurait raison, car voici le rapport de bug, et la documentation de SUN traitant du problème que cela soulève : Rapport de bug : http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6321873 Documentation : http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#hashCode() Pour les flemmards, il en résulte que System.identityHashCode() ne peut pas servir à identifier un objet de façon unique (surtout sur un système 64 bits). Une méthode pour identifier un objet de façon unique (car c'était là mon problème à la base), est de créer sa propre classe :
import java.math.BigInteger;
abstract public class Identifiable implements java.lang.Cloneable {
private static BigInteger count = BigInteger.ZERO;
private BigInteger ID = null;
public String uniqueID() {
if(ID == null) {
ID = Identifiable.count
= Identifiable.count.add(BigInteger.ONE);
return getClass().getName()+"@"+ID;
}
public Object clone() throws OutOfMemoryError {
Identifiable copy;
try {
copy = (Identifiable) super.clone();
copy.ID = null;
return copy;
} catch (CloneNotSupportedException ex) {
throw new InternalError(ex.toString());
}
}
}
A noter, qu'il suffirait même de retourner le BigInteger ID à la place d'une String, car ils sont tous uniques. Cette classe résoud non seulement les problèmes de non unicité de System.identityHashCode() mais empêche également la réutilisation d'un identifiant déjà attribué à un objet détruit (par le GC). plop! |
| 27/07 05h53 | [Webmaster] Protéger les adresses email contre les bots | Webmaster |
| 07/09 15h05 | [Firefox][GreaseMonkey] Personnaliser les pages web | Mozilla Firefox |
| 01/12 01h39 | [Javascript] convertisseur d'unités de mesures scientifiques | Javascript |
| 08/11 10h32 | [Javascript] Lien aléatoire / Choisir un lien au hasard | Javascript |
| 29/07 12h05 | GRUB - La structure de fichier de configuration | Linux |
| 08/05 07h30 | Java et string | 6 |
| 22/02 14h29 | Utilisation de « java.io.StreamTokenizer » ? | 1 |
| 10/11 11h38 | [javascript] objet string + comparaison | 1 |
| 23/05 20h12 | [java] classe Struct | 7 |
![]() | Java Runtime Environment - Java Runtime Environment (JRE) installe la machine virtuelle Java, permettant de jouer en ligne, de discuter avec des... | Catégorie: Java Licence: Open Source |
![]() | Streamripper - De nombreux fichiers audio circulent sur Internet en streaming surtout via les radios internet. Alors pour en profiter au... | Catégorie: Téléchargement Licence: Freeware/gratuit |
![]() | Java Tools - Java Tools est un IDE très léger pour la création, la compilation, l'exécution et le débogage des applications Java et des... | Catégorie: Java Licence: Freeware/gratuit |
![]() | Radio Recorder - Radio Recorder est un outil permettant d'enregistrer les radios diffusées en streaming sur Internet, dans le plus grand... | Catégorie: Podcasting/Streaming Licence: Shareware |
![]() | Sony STRDE400S | Catégorie: Ampli tuner | |
![]() | Sony STRDG500 Black | Catégorie: Ampli tuner | |
![]() | Sony STRDG700S | Catégorie: Ampli tuner | |
![]() | Strike Force Hydra | Catégorie: Jeu Playstation | 3.30 € PriceMinister |