2011-09-30 9 views
9

Desidero chiedere se è necessario evitare il box automatico in Java. Come ci sono casi in cui un metodo si aspetta un tipo primitivo 'double' e si passa un oggetto 'Double' come parametro, dovrebbe essere evitato in quanto il compilatore disattiva l'oggetto passato e potrebbe essere pesante?dovrebbe essere evitato il boxing automatico in Java

risposta

7

Questo è ciò che dice Java Note autoboxing:

Preferisco tipi primitivi

Utilizzare i tipi primitivi in ​​cui non c'è bisogno di oggetti per due motivi .

  1. I tipi primitivi possono essere molto più veloci dei tipi corrispondenti di wrapper e non sono mai più lenti.
  2. L'immutabilità (non può essere modificata dopo la creazione) dei tipi di wrapper può rendere impossibile l'utilizzo.
  3. Ci può essere un comportamento inaspettato che coinvolge == (confronta riferimenti) e. Equals() (confronta valori). Vedere il riferimento sotto per esempi.
+1

specifico comportamento imprevisto comprende NullPointerExceptions quando unboxing. –

+0

sorprese autoboxing: http://www.theserverside.com/news/thread.tss?thread_id=27129 –

+0

sì, ma la domanda era su 'autoboxing'. Se chiedesse "dovrei usare le primitive sulle classi wrapper" allora ovviamente hai ragione, altrimenti la stessa autoboxing non influisce sulle prestazioni delle JVM moderne - almeno da quello che so. – Kris

4

La regola generale è: sempre usano primitive, se possibile.

In alcuni casi questo non è possibile, come le raccolte, quindi utilizzare solo i wrapper.

1

Non è necessario evitare l'autoboxing se si parla di prestazioni, JVM dovrebbe gestirlo. L'unica cosa che dovresti considerare è una leggibilità del tuo codice.

4

È una scelta di design e non banale per ogni caso.

Ci sono diversi elementi che potrebbe influenzare la vostra decisione:

Vantaggi:

  • Auto-boxing e auto-unboxing può rendere il codice più facile da leggere:

    Lasciando fuori tutto il necessario .doubleValue() e Double.valueOf() riduce il visu tutto il rumore e può rendere il tuo codice più facile da leggere.

  • Auto-boxing consente di utilizzare facilmente le collezioni di valori primitivi (come ad esempio un List<Double>, ...)

Svantaggi:

  • eccessiva, inutile auto-boxe e auto-unboxing può ostacolare la vostra prestazione.

    Ad esempio, se si dispone di un'API che restituisce un double e un altro API che aspetta un double, ma gestire il valore come Doppio in mezzo, allora si sta facendo inutile auto-boxing .

  • auto-unboxing può introdurre un NullPointerException dove non l'aspetti:

    public void frobnicate(Double d) { 
        double result = d/2; 
        // ... 
    } 
    
  • utilizzando collezioni di valori di auto-boxed utilizza molto più memoria di un paragonabile double[] per esempio.

Problemi correlati