Esiste un metodo hashCode () che può essere utilizzato per il controllo dello stato?

1

Ho pensato a un modo semplice ed efficace per combinare stati con eventi per rendere più efficiente la gestione degli eventi. La mia idea di controllo dello stato coinvolge oggetti di stato che contengono riferimenti a variabili mutabili in un oggetto.

Immagino che usare una sorta di hashCode () per un oggetto e il controllo tra i due stati sia più efficiente di iterare sul contenuto di un oggetto State e confrontarlo con lo stato di destinazione.

Il problema è che hashCode () non è calcolato in base allo stato. Esiste un metodo simile a hashCode () che posso utilizzare per confrontare due stati senza confrontare i loro contenuti direttamente ed è economico sull'utilizzo della CPU?

Modifica: non mi sono reso conto che hashCode () si trova su una base per stato.

    
posta AMDG 02.06.2015 - 17:55
fonte

2 risposte

3

Stai cercando hashCode() più alcune ottimizzazioni e spese generali associate ad esso trovate in altre classi Java.

Se il codice hash è diverso, lo stato è diverso. Questo fa parte del contratto di hashCode() . Tuttavia, confrontare due codici hash generati al volo per due oggetti è altrettanto costoso (e forse anche di più perché lo stato completo deve essere interrogato per creare il codice hash mentre .equals(T object) può essere salvato presto).

Quindi, vai al caching del codice hash una volta che lo hai calcolato, quindi devi solo generarlo una volta. Tuttavia, questo 'genera solo una volta' è 'solo generarlo una volta per stato'. Se l'oggetto è immutabile, è possibile memorizzarlo nella cache non appena richiesto e restituire il valore memorizzato nella cache per sempre. Questo può essere visto in String .hashCode () . String restituirà il codice hash calcolato se è già stato calcolato.

Tuttavia, se l'oggetto è mutabile, ogni volta che si muta l'oggetto sarà necessario invalidare il codice hash che è stato generato in precedenza. È qui che arriva il sovraccarico.

Tutto ciò che è stato detto, la cosa semplice e comprensibile da fare che non aggiunge complessità al tuo codice è usare equals(T object) . Prova prima i campi mutati più probabili e lascia che l'ottimizzatore JIT faccia il suo lavoro.

    
risposta data 02.06.2015 - 18:01
fonte
1

Non è del tutto chiaro cosa stai cercando. Ma se si desidera rilevare eventi di cambiamento di stato senza paragoni laboriosi, è un modello ben collaudato utilizzare un indicatore di versione. Questo può essere semplice come un contatore che viene incrementato ogni volta che vengono modificati tutti i dati rilevanti.

A seconda dello scopo potresti incontrare una delle due classi di problemi. Il primo è il problema AA. Il metodo set di proprietà con il valore A viene chiamato con il valore A. Un'implementazione ingenua registra una modifica (incrementando il contatore della versione) ma non cambia nulla. Il secondo è il problema ABA o ABC. Se un metodo set viene chiamato due volte prima che un "meccanismo di monitoraggio" visiti di nuovo l'oggetto, mancherà allo stato B e potrebbe (nel caso ABA) perdere completamente che si sia verificata una modifica "realmente".

Potrebbe non avere importanza. Potrebbe rendere il programma leggermente meno efficiente (causando aggiornamenti della schermata che di fatto non cambiano nulla) o una logica di interruzione peggiore.

    
risposta data 02.06.2015 - 18:28
fonte

Leggi altre domande sui tag