Cosa voglio ottenere: Ho bisogno di ottenere un id (unico) di esecuzione per "qualsiasi oggetto" (per le classi sia in java SE, le classi che ho creato o classi fornite da altre terze parti ... qualsiasi istanza di una classe).
Idealmente dovrebbe essere facile come:
Map<Object, UUID> objId = new HashMap<>();
MyClassFoo foo = new MyClassFoo();
UUID fooId = objId.getOrElse(foo, UUID.randomUUID());
if (!objId.containsKey(foo)) {
objId.put(foo, fooId);
}
// From here onwards whenever I need the runtime ID for foo I can get it from the map objId
Il problema:
Questo non funzionerà con oggetti mutabili poiché il mio oggetto può continuare a cambiare da qui il suo codice hash, e tutti conosciamo i problemi che si potrebbero presentare quando si lavora con una mappa usando un oggetto mutabile come chiave.
Inoltre tale approccio non funziona a causa di limitazioni come: non è possibile utilizzare un ArrayList come chiave se ArrayList è un elenco di elenchi che contiene se stesso, poiché la mappa tenterà di utilizzare il suo hashCode. L'implementazione del codice hash per ArrayList richiede il calcolo dell'hashCode di tutti gli oggetti contenuti che causano un overflow dello stack per gli elenchi autonomi.
Ciò di cui ho bisogno dalla community:
Ho bisogno di sapere più (o un paio di buone proposte di alternative a quella mappa) un modo efficace per ottenere ciò che voglio. Ho considerato un List<Pair<Object, UUID>>
ordinato e faccio una ricerca binaria su di esso ogni volta che ho bisogno dell'ID per un oggetto, ma oltre a rendere l'implementazione un po 'più complessa sono anche preoccupato dell'impatto sulle prestazioni di tale cambiamento (dato che tale la lista può contenere da poche coppie di oggetti fino a diversi milioni).
Ho fatto i miei compiti a casa ? Penso di sì, oltre a considerare possibili alternative (come quella sopra menzionata), ho cercato di trovare un'implementazione diversa di una mappa che soddisfi le mie esigenze, ma tutte sembrano utilizzare l'hashCode dell'oggetto chiave.
Questa è una domanda basata sull'opinione? Beh ... sì, ma non mi piacerebbe che fosse etichettato come tale, dal momento che ciò che sto chiedendo sono alternative per risolvere il mio problema e le implicazioni / aspetti della performance da considerare per l'implementazione di tali proposte.
P.S: Sto lavorando nel linguaggio Java ma il concetto del problema può essere applicato indipendentemente da quello.