Perché Java definisce i valori BigInteger / BigDecimal di 10?

4

Domanda forse leggermente a sinistra di campo - ma sono curioso della logica alla base del perché le classi BigInteger / BigDecimal di Java sentano la necessità di definire una costante di TEN?

Esempio preso da java.math.BigInteger:

/**
 * The BigInteger constant zero.
 *
 * @since   1.2
 */
public static final BigInteger ZERO = new BigInteger(new int[0], 0);

/**
 * The BigInteger constant one.
 *
 * @since   1.2
 */
public static final BigInteger ONE = valueOf(1);

/**
 * The BigInteger constant two.  (Not exported.)
 */
private static final BigInteger TWO = valueOf(2);

/**
 * The BigInteger constant ten.
 *
 * @since   1.5
 */
public static final BigInteger TEN = valueOf(10);

Ora sto assumendo che potrebbe essere qualcosa a che fare con l'uso nelle funzioni di ridimensionamento o simili, ma mi ha fatto incuriosire - soprattutto perché TEN sembra apparire per la prima volta in 1.5 mentre ONE e ZERO esistevano molto prima (posso anche guarda perché 1 e 0 sarebbero più immediatamente utili di 10)

Qualcuno lo sa?

    
posta f1dave 30.07.2015 - 04:36
fonte

1 risposta

6

BigInteger e BigDecimal sono oggetti immutabili. Una volta istanziato, se vuoi fare qualcosa con esso, crei un nuovo oggetto. Questo non è un problema per dire, e in realtà evita molti altri problemi (specialmente durante il threading), ei numeri tendono ad essere cose che sono costanti - non li cambi.

È molto comune che il codice che sta lavorando con BigDecimal e BigInteger abbia bisogno di usare i valori 0, 1, 2 e 10. Se questi non erano definiti come costanti nella classe, i programmatori si trovavano spesso a creare istanze di istanza di tali oggetti ancora e ancora. Questo può essere un problema perché significa che stai creando oggetti inutilmente dove ci sono oggetti perfettamente accettabili e comunemente usati.

Una volta ho lavorato su una base di codice in cui venivano spesso utilizzati miglia e chilometri. Prima di una pulizia, avevamo una dozzina di posti diversi in cui c'era un static BigDecimal MILES_IN_ONE_KM = new BigDecimal("0.621371") in un modo, forma, forma o altro - fortunatamente c'erano solo quelli e erano statici piuttosto che essere creati ogni volta che ci convertivamo da una distanza unità ad un altro ...

Questo è un caso piuttosto speciale del Pool di oggetti Pattern. Altri esempi possono essere trovati in cache intera (primaria utilizzata in box / unboxing) e Colore classe in cui sono definiti elementi come" ROSSO "e" BLU ".

Assegnando questi oggetti di uso comune nella classe, fornisce un costo piuttosto basso per far fluttuare alcuni oggetti extra piuttosto che creare e distruggere i punteggi ogni volta che si desidera moltiplicare un numero per 10 o aggiungere 1.

    
risposta data 30.07.2015 - 04:51
fonte

Leggi altre domande sui tag