2014-07-17 6 views
8

PMD mi avverte di evitare l'istanziazione booleana (per motivi di efficienza). Ho qualcosa di similePerché evitare l'istanziazione booleana è una buona idea?

Boolean variable = new Boolean(somestringIGotRepresentingABoolean); 

E io dovrei utilizzare questo

Boolean variable = Boolean.valueOf(somestringIGotRepresentingABoolean); 

Perché è meglio?

risposta

11

Il motivo è che il nuovo booleano restituisce sempre una nuova istanza. Poiché le istanze booleane sono immutabili, non ha senso avere più di 2 istanze. Uno per falso e uno per vero.

Prova questa e vedrete

Boolean boolean1 = new Boolean("true"); 
Boolean boolean2 = new Boolean("true"); 
Boolean boolean3 = new Boolean("true"); 

System.out.println(System.identityHashCode(boolean1)); 
System.out.println(System.identityHashCode(boolean2)); 
System.out.println(System.identityHashCode(boolean3)); 

Boolean valueOf1 = Boolean.valueOf("true"); 
Boolean valueOf2 = Boolean.valueOf("true"); 

System.out.println(System.identityHashCode(valueOf1)); 
System.out.println(System.identityHashCode(valueOf2)); 
9

Dalla documentazione, si può leggere:

new Boolean(boolean value) 

alloca un oggetto booleano che rappresenta l'argomento di valore.

Nota: raramente è opportuno utilizzare questo costruttore. A meno che non sia necessaria una nuova istanza, il valore di fabbrica staticoOf (booleano) è generalmente una scelta migliore. È probabile che produca prestazioni significativamente migliori in termini di spazio e tempo.

4

In Java booleano (come String) è immutabile. Ciò significa che se si utilizza

Boolean x = new Boolean(true); 
x = false; 

x punterà a un oggetto diverso dopo "x = falso" rispetto a prima. Quindi, se si utilizza il metodo Boolean.valueOf(), Java si prenderà cura del fatto che ci sono solo due oggetti booleani al massimo, uno che rappresenta il vero e l'altro che rappresenta il falso. Se si utilizza .valueOf (true) verrà restituito un handle all'oggetto true e se si utilizza .valueOf (false) verrà restituito un handle all'oggetto falso. In questo modo non crei oggetti inutili e quindi non dovranno essere cancellati dal garbage collector.

Se si utilizza "new Boolean()", questo non funziona e Java creerà un nuovo oggetto ogni volta. Quindi avrai una tonnellata di oggetti inutili che probabilmente verranno liberati abbastanza rapidamente e che devono essere ripuliti dal garbage collector. Quindi questo ti costa più memoria (per tutti gli oggetti), tempo per l'allocazione (quando si creano nuovi booleani) e tempo per la deallocazione (quando gli oggetti vengono catturati dal garbage collector), senza dare alcun vantaggio.