Esistono due metodi per controllare l'uguaglianza fra due oggetti BigDecimal, ovvero BigDecimal.equals(BigDecimal) e BigDecimal.compareTo(BigDecimal), entrambi validi, ma con controindicazioni diverse a seconda dei casi.

Andiamo subito a vedere il primo caso, ovvero il metodo BigDecimal.equals(BigDecimal). Sicuramente di questo metodo possiamo apprezzare l'immediatezza dell'applicazione, ritornando un valore booleano, pronto per l'uso in caso di operazioni condizionali, ma al contempo nasconde dei tranelli insidiosi. Il valore true è infatti ricavato solo per oggetti non solo di uguale valore nominale, ma anche con uguali costrutti formali, come il fattore di scala e il MathContext con cui vengono inizializzati entrambi gli oggetti. Esempio classico di errore che possiamo avere:

package com.rudylab;

import java.math.*;

public class BigDecimalDemo {

public static void main(String[] args) {

        // creo 2 oggetti BigDecimal a zero 
        BigDecimal bg1, bg2;

        bg1 = new BigDecimal(0);
        bg2 = new BigDecimal(0);

        System.out.println(bg1.equals(bg2));
        System.out.println(bg1.equals(BigDecimal.ZERO));
    }
}

In questo caso avremo due output, il primo caso sarà vero, il secondo falso.

true
false

Quindi, nel nostro caso possiamo avere un riscontro non veritiero nell'esito, dovuto a due oggetti con valore effettivo uguale (new BigDecimal(0) e BigDecimal.ZERO), ma formalmente diverso.Questo è dovuto al fatto che la equals() compara tutti i campi dell'oggetto, formato da un valore intero e la scala. Il costruttore di default, infatti, assegna il valore 2 alla scala, mentre nel rappresentativo statico BigDecimal.ZERO (come anche per ONE e TEN), la scala è a zero.

Se volete provare a divertirvi, utilizzate anche costruttori con lo stesso valore iniziale e alternate due valori di scala diversi, i quali non influiscono sul valore in se e per se, ma sulla precisione del risultato decimale.

Quando abbiamo bisogno del risultato matematico puro, possiamo utilizzare il metodo BigDecimal.compareTo(BigDecimal), il quale è molto più preciso nel significato, ma ha bisogno di un costrutto un po' più complesso. Infatti non ritorna un valore booleano, ma un int che necessita di interpretazione, poichè (come avviene infatti per convenzione in tutti gli override del metodo in questione) ha tre diversi risultati a seconda della comparazione stessa: 0 in caso di uguaglianza, 1 in caso il primo oggetto sia maggiore, -1 se è il secondo (ovvero l'oggetto della funzione) ad essere maggiore. Nel nostro caso quindi dovremo anche controllare che il risultato sia uguale a zero per completare la nostra funzione.

Ecco qui l'esempio precedente rivisto:

package com.rudylab;

import java.math.*;

public class BigDecimalDemo {

public static void main(String[] args) {

        // creo 2 oggetti BigDecimal a zero
        BigDecimal bg1, bg2;

        bg1 = new BigDecimal(0);
        bg2 = new BigDecimal(0);

        System.out.println(bg1.compareTo(bg2) == 0);
        System.out.println(bg1.compareTo(BigDecimal.ZERO) == 0);
    }
}

Produrrà il seguente risultato:

true
true

Quindi il metodo compareTo() ci permette di valutare l'uguaglianza di due oggetti BigDecimal con ottima precisione, a differenza del precedente che si limitava a comparare i contenuti dell'oggetto. Inoltre utilizzare gli oggetti statici già pronti, ci permette di non dover ogni volta instanziare oggetti in memoria che poi andranno ad aumentare soltanto il lavoro del garbage collector. Chiaramente il metodo compareTo() ci impone di aumentare la logica a livello di codice (va comunque interpretato il risultato), ma allo stesso tempo ci permette anche il confronto matematico fra due oggetti, utilizzando gli operatori == e !=.

Per maggiori informazioni:

docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html

www.tutorialspoint.com/java/math/bigdecimal_compareto.htm

 
© 2014 • Rudylab
Questo blog non rappresenta una testata giornalistica, in quanto viene aggiornato senza alcuna periodicità. Non può, pertanto, considerarsi un prodotto editoriale, ai sensi della legge n. 62 del 7/03/2001.