Classi personalizzate per importo monetario (valore monetario) anziché BigDecimal

5

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());
    
posta Piotr Müller 09.02.2014 - 18:28
fonte

1 risposta

3

Le tue ragioni per creare una classe personalizzata sono perfettamente valide. Se il tuo sistema funzionava solo con una singola valuta, l'argomento per la creazione di una classe personalizzata sarebbe molto più debole. Ma con più valute, penso che una classe personalizzata sia quasi un must.

Si noti che la classe personalizzata potrebbe utilizzare un BigDecimal internamente per contenere l'importo, se è una buona corrispondenza per ciò che è effettivamente necessario fare. Se long corrisponde meglio al tuo modello, prosegui.

    
risposta data 09.02.2014 - 20:39
fonte

Leggi altre domande sui tag