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


Odpovedet emailem