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