2013-02-12 23 views
8

Esiste una libreria BigDecimal con le operazioni di base di BigDecimal che consente valori nulli?libreria java per BigDecimal che consente valori nulli

Null deve essere considerato come 0 per scopi matematici.

Non voglio eseguire tutti i controlli Null per possibili valori nulli.

Non consentire mai valori nulli nel database, nell'applicazione o nella vista e inizializzare tutto con new BigDecimal(0) o eseguire controlli nulli su ogni utilizzo per valori nullable.

Qualcosa di simile:

public static BigDecimal add(final BigDecimal value, final BigDecimal augend) 
{ 
    if (value == null) 
     return augend; 
    else if (augend == null) 
     return value; 
    else 
     return value.add(augend); 
} 

public static BigDecimal multiply(final BigDecimal value, final BigDecimal multiplicand) 
{ 
    if (value == null || multiplicand == null) 
     return null; 

    return value.multiply(multiplicand); 
} 

risposta

13

Salvare la codifica, non consentire valori null nel database. Imposta il valore predefinito zero.

Per quanto riguarda new BigDecimal(0): no, utilizzare BigDecimal.ZERO.

+1

+1 per 'BigDecimal.Zero'. Mai controllato. – djmj

+0

Con le risposte date ho deciso di non consentire valori nulli per i miei decimali nel database. Stavo già pensando a molto tempo per consentire o meno, e tenere traccia dello stato nullo era solo uno spreco di tempo per la codifica. – djmj

+0

Il piccolo overhead per la creazione di una funzione comparabile a virgola mobile per scopi di interfaccia grafica è un commercio equo. – djmj

5

credo non vedo il punto della biblioteca il controllo di nulla. Certo, la biblioteca non getterà un NPE, ma alla fine il chiamante dovrà controllarlo. Che cosa farà il chiamante del tuo multiplo sopra? Non può semplicemente usare l'output. Dovrà verificare se il valore restituito è nullo a un certo punto prima che possa fare qualcosa con il valore.

Inoltre, per qualsiasi applicazione che abbia mai scritto, un valore null è molto diverso da zero. Non vorrei usare uno che considerava nulla come zero.

Se il tuo requisito è che i valori nulli non sono consentiti nel tuo DB, dovrei controllare i valori nulli nel tuo livello DAO prima di scrivere nel DB.

+0

In un JSF vedere la sua molto utile se i dati possono essere nulli controllati, per visualizzare altre informazioni per l'utente. Attualmente non sto usando questo al livello DAO dove tutto è controllato per valori nulli. Attualmente solo alcuni test per visualizzare solo i dati relativi. – djmj

+0

Ah ok. Allora forse alcuni metodi statici come quello che hai sopra potrebbero salvarti qualche problema. Dubito che avrai molta fortuna a trovare una libreria BigDecimal che tratta null come zero o che non genererà un NPE quando uno degli argomenti in esso contenuti è nullo. – Kyle

+1

Converti i valori nulli a zero ovunque li ottieni; non lasciare solo i null lì. –

6

Avevo un problema simile (non relativo a un database, ma solo per riassumere un paio di BigDecimals eventualmente nulli). Non hai trovato qualsiasi libreria, quindi abbiamo dovuto scrivere il seguente funzione di me stesso:

public static BigDecimal add(BigDecimal... addends) { 
    BigDecimal sum = BigDecimal.ZERO; 
    if (addends != null) { 
     for (BigDecimal addend : addends) { 
      if (addend == null) { 
       addend = BigDecimal.ZERO; 
      } 
      sum = sum.add(addend); 
     } 
    } 
    return sum; 
} 

Lo stesso in Java 8:

public static BigDecimal add(BigDecimal... addends) { 
    if (addends == null) { 
     return BigDecimal.ZERO; 
    } 
    return Arrays.stream(addends) 
      .filter(Objects::nonNull) 
      .reduce(BigDecimal.ZERO, BigDecimal::add); 
}