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
Questo è ciò che dice Java Note autoboxing:
Preferisco tipi primitivi
Utilizzare i tipi primitivi in cui non c'è bisogno di oggetti per due motivi .
- I tipi primitivi possono essere molto più veloci dei tipi corrispondenti di wrapper e non sono mai più lenti.
- L'immutabilità (non può essere modificata dopo la creazione) dei tipi di wrapper può rendere impossibile l'utilizzo.
- Ci può essere un comportamento inaspettato che coinvolge == (confronta riferimenti) e. Equals() (confronta valori). Vedere il riferimento sotto per esempi.
La regola generale è: sempre usano primitive, se possibile.
In alcuni casi questo non è possibile, come le raccolte, quindi utilizzare solo i wrapper.
Non è necessario evitare l'autoboxing se si parla di prestazioni, JVM dovrebbe gestirlo. L'unica cosa che dovresti considerare è una leggibilità del tuo codice.
È 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()
eDouble.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 undouble
, 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.
La boxing automatico deve essere evitata. Può causare errori a causa del sovraccarico e ha un impatto sulle prestazioni. Tuttavia, potrebbe non essere un problema nella tua applicazione. Ma sii consapevole dell'impatto.
Qui il mio post a che: https://effective-java.com/2010/05/the-advantages-and-traps-of-autoboxing/
- 1. Perché dovrebbe @@ class_variables essere evitato in Ruby?
- 2. L'uso della riflessione dovrebbe essere evitato in Go?
- 3. Cosa C++ caratteristiche dovrebbe essere evitato per lo sviluppo embedded
- 4. Può essere evitato il rehashing in hashmap?
- 5. Quando si verifica automaticamente il boxing automatico?
- 6. Java firmato zero e boxing
- 7. Java auto boxing/unboxing wierdness
- 8. Plugin di Eclipse: completamento automatico come dovrebbe essere
- 9. NullPointerException attraverso il comportamento di auto-boxing dell'operatore ternario Java
- 10. Qual è il significato di "Boxing" in C# (al contrario di Java)?
- 11. Dovrebbe essere in un namespace?
- 12. Perché pos_tag() è così dolorosamente lento e può essere evitato?
- 13. WebView si espande all'infinito - come può essere evitato?
- 14. Dove dovrebbe essere Android.mk?
- 15. Come dovrebbe essere il corpo della richiesta?
- 16. Quanto estensibile dovrebbe essere il codice?
- 17. Cosa dovrebbe essere hadoop.tmp.dir?
- 18. dovrebbe essere chiuso Class.getResourceAstream?
- 19. Perché il compilatore/JVM non può semplicemente rendere automatico il boxing "funziona"?
- 20. Boxing & Unboxing
- 21. C#: Come dovrebbe essere implementato ToString()?
- 22. Boxing vs Unboxing
- 23. Qual è la differenza tra Boxing e AutoBoxing in Java?
- 24. java: perché non dovrebbe essere permesso di sfuggire al costruttore?
- 25. Anche il boxing e l'unboxing stanno trasmettendo?
- 26. Perché alcune lingue richiedono Boxing e Unboxing?
- 27. Il servizio WCF in genere dovrebbe essere singleton o no?
- 28. Quale dovrebbe essere il tipo iteratore in questo modello C++?
- 29. Dovrebbe essere incluso Gemfile.lock in .gitignore?
- 30. Questo bug dovrebbe essere risolto?
specifico comportamento imprevisto comprende NullPointerExceptions quando unboxing. –
sorprese autoboxing: http://www.theserverside.com/news/thread.tss?thread_id=27129 –
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