Su StackOverflow ho trovato più consigli per rimanere con BigDecimal
in Java invece di reinventare la ruota.
Nonostante ciò, ho deciso di creare la mia classe personalizzata, e vorrei chiedere se fosse una buona idea e pro o contro sul mio design in comparsione a BigDecimal. I motivi per scegliere l'implementazione personalizzata e le caratteristiche del mio design sono:
- nessun costruttore double / float come in BigDecimal (rischio di errore) -
long
internamente con 8 posizioni decimali - questo riduce da min / max a ~ 10 miliardi ma il sistema è mirato alla criptovaluta in modo tipico i valori sono piccoli. - nessuna differenza in "0.0" e "0.00" come BigDecimal
- semplice compatibilità SQL con la colonna BIGINT
- connessione dura a oggetto / codice valuta - non può creare quantità senza valuta e inoltre non può fare aritmetica / comparsione di due valori in valute diverse
- Controllo della creazione di valori possibili da non traboccare a lungo (da -10 miliardi a 10 miliardi)
- protezione da overflow interna sui calcoli
Pensi che sia una buona ragione per scegliere l'implementazione custem invece di BigDecimal?
Per ridurre al minimo i rischi, copro molte situazioni per unit test e uso anche BigDecimal per la conversione iniziale da stringa:
BigDecimal decimal = new BigDecimal(value);
... check MIN/MAX allowed values ...
BigDecimal multiplied = decimal.multiply(new BigDecimal(String.valueOf(DECIMAL_DIVIDER)));
long internalResult = multiplied.toBigInteger().longValue();
return new Amount(internalResult, cryptoCurrency.getInternalCode());