identityHashCode() vraci pro ruzne objekty ruzne hodnoty, ale pouze v danem okamziku. Pokud napr. vytvorim objekt, ulozim si jeho identityHashCode(), pak jej zahodim a vytvorim novy objekt, tento novy objekt muze mit stejny identityHashCode. Dobry napad je pouziti referenci z java.lang.ref.
Z.T. -- Zdenek Tronicek FIT CTU in Prague Jaroslav Hurdes napsal(a): > 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, michal.niko...@elanor.cz 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; >> } >> } >> > >