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; >> } >> } >> > > >
