S tou unikátností identityHashCode to není tak samozřejmé, dokumentace k 
System.identityHashCode() říká
"Returns the same hash code for the given object as would be returned by the 
default method hashCode()"
a v dokumentaci k Object.hashCode() je na začátku odstavce šalamounská věta:
"As much as is reasonably practical, the hashCode method defined by class 
Object does return distinct integers for distinct objects."

Zabývá se tím bug http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6321873 a 
samotného mne překvapilo, jak rychle vyprodukuje program výstup.

Osobně nepovažuji za špatné spoléhat na jedinečnost tam, kde to nepřinese škodu 
nebo např. při výpisu do logu.
V uvedeném případě to ale může být problém, protože if (foo == ihc) by se v 
případě neidentických objektů se stejným hashem splnilo a poskytlo nesprávnou 
hodnotu.
Takže asi fakt přes WeakReference.
Anebo, pokud jsi element zjednodušil na Object, ale je to ve skutečnosti nějaká 
třída, kterou máš v moci, zavést do ní vlastní kritérium jedinečnosti 
(počítadlo).
A nemůžeš tu logiku dát do Tool.casoveNarocnaMetoda?

Tomáš



================================================
...with Ultimate flying is so easy...
http://www.frisbee.cz    http://www.peaceegg.net
================================================





______________________________________________________________
> Od: "Jaroslav Hurdes" <[email protected]>
> Komu: Java <[email protected]>
> Datum: 29.06.2010 11:02
> Předmět: Re: Porovnani objektu
>
>Podle tohoto:
>System.identityHashCode(), which is guaranteed to return distinct integers for 
>distinct objects within a JVM
>
>by mela vracet pro kazdou instanci objektu jinou hodnotu. Takze by to melo 
>chodit, za predpokladu, ze porovnavate identicke objekty a ne ekvivalentni (se 
>stejnou hodnotou, ale objekt je jiny). Jinak muzete pouzit tridy vyuzivajici 
>Weak reference a nebo proste pred volanim cyklu inicializovat nejakou cache a 
>po skonceni cyklu si ji explicitne uklidit
>
>Neco.initializeCache();
>while(...) {
>     neco.dejHodnotu(...);
>}
>Neco.cleanCache();
>
>Jaroslav Hurdes
>
>Dne 29.6.2010 9:45, [email protected] napsal(a):
>> mam tridu (smyslena, oholena jen na reprezentaci problemu):
>>
>> public class Neco implements INekohoJineho {
>>   public String dejHodnotu(Object element){
>>          String hodnota = Tool.casoveNarocnaMetoda(element);
>>          return hodnota;
>>   }
>> }
>>
>> metoda dejHodnotu je volana v cyklu frameworku nade mnou a jsou i pripady,
>> kdy je nekolikrat po sobe volana se stejnou instanci element. Hodne by se
>> program zrychlil, kdybych si uchovaval posledni instanci element se kterou
>> bylo volano a jaka pri ni byla vypoctena "hodnota". Problem je, ze si
>> nemuzu dovolit drzet uvnitr tridy Neco referenci na element, protoze to
>> nema kdo uklidit a zivotnost tridy Neco je vyrazne vyssi nez element.
>>
>> Napada me misto uchovat jenom System.identityHashCode(element) misto
>> samotne reference na element, ale nemuzu se dopatrat jestli a z ceho
>> vychazi System.identityHashCode(). Vzdy jsem myslel, ze v zajmu rychlosti
>> jde o nativni implementaci, ktera proste vrati adresu instance na heapu.
>> Pak by to bylo bezpecne, ale jistej si nejsem.
>>
>> jak by to teda pak vypadalo :
>>
>> public class Neco implements INekohoJineho {
>>     private int ihc = Integer.MIN_VALUE;
>>     private String hodnota = null;
>>    public String dejHodnotu(Object element){
>>          int foo = System.identityHashCode(element);
>>          if (foo == ihc) return hodnota;
>>          ihc = foo;
>>          hodnota = Tool.casoveNarocnaMetoda(element);
>>          return hodnota;
>>   }
>> }
>>
>
>
>

Odpovedet emailem