2015-10-19 12 views
6

In java, BigInteger è immutabile ma voglio capire perché, poiché molte volte è usato per fare molti calcoli che possono produrre molti oggetti. Quindi, sembra intuitivo non renderlo immutabile. La situazione che mi viene in mente è qualcosa di simile alle operazioni con le stringhe e quindi all'opzione di StringBuilder. Dovrebbe esserci una controparte non immutabile di BigInteger? Penso che potrebbe essere utile in molte situazioni.Perché BigInteger in java è progettato per essere immutabile?

Modifica: conosco i vantaggi dell'immutabilità e di come è vantaggioso in molti casi. Volevo solo capire i vantaggi di BigInteger. Ho usato BigInteger per calcolare fattoriali di grandi numeri. Quindi, avrei preferito un BigInteger mutabile. Allo stesso modo, BigInteger verrà utilizzato per i calcoli in cui il risultato è molto più grande di int. Per altri casi c'è BigDecimal.

+0

È possibile utilizzare 'BitSet' come un' BigInteger '(ordinabile) mutabile. –

+1

Gli oggetti di breve durata sono economici e gli oggetti immutabili hanno molti vantaggi. – chrylis

+0

* "Penso che potrebbe essere utile in molte situazioni." * ... potrebbe essere importante per alcune situazioni critiche davvero super-performative, ma probabilmente non in tutte le situazioni complessive che si suppone. Ma, se si dispone davvero di un blocco di codice critico per le prestazioni profilattico, una classe compagna mutabile può essere la risposta. – scottb

risposta

11

Effective Java da Josh Bloch spiega i benefici di classi immutabili, in "Item 15: Ridurre al minimo Mutability":

classi immutabili sono più facili da progettare, implementare e utilizzare rispetto classi mutevoli. Sono meno soggetti a errore e sono più sicuri.

Un oggetto immutabile è semplice, perché l'oggetto può esistere solo in uno Stato - lo Stato è stato creato nel codice semplice tende ad avere un minor numero di bug.. Poiché l'oggetto non può essere modificato, è anche thread-safe senza sincronizzazione esterna.

Bloch risolve il problema di prestazioni con le classi immutabili, usando BigInteger come esempio:

L'unico vero svantaggio di classi immutabili è che essi richiedono un oggetto separato per ogni valore distinto. Creare questi oggetti può essere costoso, specialmente se sono grandi. [...]

Internamente, la classe immutabile può essere arbitrariamente intelligente. Ad esempio, BigInteger ha una "companion class" mutabile, privata del pacchetto, che utilizza per accelerare operazioni multistep come l'esponenziazione modulare. È molto più difficile utilizzare la classe companion mutabile piuttosto che utilizzare BigInteger per tutti i motivi illustrati in precedenza, ma per fortuna non è necessario: gli implementatori di BigInteger hanno fatto il duro lavoro per voi.

Quindi internamente, BigInteger già fa qualche ottimizzazione per voi. Se si desidera veramente un valore mutabile BigInteger, è possibile utilizzare uno BitSet, ma questo probabilmente rende il codice più complesso e più soggetto a errori. Dovresti utilizzare la soluzione più semplice possibile (BigInteger) a meno che tu non sia sicuro che l'uso di una versione mutabile ti darà un notevole guadagno in termini di prestazioni (vedi anche "Articolo 55: Ottimizza giudiziosamente" dallo stesso libro).

Problemi correlati