Respuestas:
Otros han mencionado que ciertas construcciones como Collections
requieren objetos y que los objetos tienen más gastos generales que sus contrapartes primitivas (memoria y boxeo).
Otra consideración es:
Puede ser útil inicializar objetos null
o enviar null
parámetros a un método / constructor para indicar el estado o la función. Esto no se puede hacer con primitivas.
Muchos programadores inicializan los números en 0 (predeterminado) o -1 para indicar esto, pero dependiendo del escenario, esto puede ser incorrecto o engañoso.
Esto también preparará el escenario para NullPointerException
cuando algo se esté usando incorrectamente, lo cual es mucho más amigable para el programador que algún error arbitrario en el futuro.
Generalmente, debe usar tipos primitivos a menos que necesite un objeto por alguna razón (por ejemplo, para poner en una colección). Incluso entonces, considere un enfoque diferente que no requiera un objeto si desea maximizar el rendimiento numérico. Esto es aconsejado por la documentación , y este artículo demuestra cómo el autoempaquetado puede causar una gran diferencia de rendimiento.
Integer
es más legible que int
.
En mi opinión, si los miembros de mi clase son variables contenedoras, no depende de los valores predeterminados, que es un comportamiento amigable para los desarrolladores.
1.
class Person {
int SSN ; // gets initialized to zero by default
}
2.
class PersonBetter {
Integer SSN; //gets initialized to null by default
}
En el primer caso, no puede mantener el valor del SSN sin inicializar. Puede doler si no está comprobando si el valor se estableció antes de intentar usarlo.
En el segundo caso, puede mantener SSN inicializado con nulo. Lo que puede llevar a NullPointerException, pero es mejor que insertar sin saberlo valores predeterminados (cero) como SSN en la base de datos cada vez que intente usarlo sin inicializar el campo SSN.
PersonBuilder
crea un que arroja una excepción si el SSN no está configurado antes de llamar a "build" para obtener la Person
instancia. Creo que este tipo de cosas es excesivo, pero es lo que promueve el lenguaje Java para los patrones adecuados.
Solo usaría los tipos de envoltura si es necesario.
Al usarlos no se gana mucho, además del hecho de que lo son Objects
.
Y pierde gastos generales en el uso de la memoria y el tiempo dedicado a boxear / unboxing.
Prácticamente me encontré con una situación en la que se puede explicar el uso de la clase contenedora.
Creé una clase de servicio que tenía una long
variable de tipo
long
, cuando no se inicializa, se establecerá en 0, esto será confuso para el usuario cuando se muestre en la GUI Long
, cuando no se inicializa, se establecerá en null
, este valor nulo no se mostrará en la GUI.Esto también se aplica Boolean
cuando los valores pueden ser más confusos cuando usamos primitivos boolean
(ya que el valor predeterminado es falso).
Las colecciones son el caso típico de los objetos contenedores simples de Java. Sin embargo, podría considerar darle al Wrapper un significado más específico en el código (objeto de valor).
En mi humilde opinión, casi siempre hay una ventaja en el uso de objetos de valor cuando se reduce a la legibilidad y el mantenimiento del código. Envolver estructuras de datos simples dentro de objetos cuando tienen ciertas responsabilidades a menudo simplifica el código. Esto es algo muy importante en el diseño basado en dominios .
Por supuesto, existe el problema del rendimiento, pero tiendo a ignorarlo hasta que tenga la posibilidad de medir el rendimiento con los datos adecuados y realizar acciones más dirigidas hacia el área problemática. También podría ser más fácil comprender el problema de rendimiento si el código también es fácil de comprender.
El rendimiento de aplicaciones dominadas por cálculos numéricos puede beneficiarse enormemente del uso de primitivas.
tipos primitivos, se usa el operador ==, pero para el envoltorio, la opción preferida es llamar al método equals ().
"Tipos primitivos considerados dañinos" porque mezclan "la semántica de procedimiento en un modelo orientado a objetos uniforme.
Muchos programadores inicializan los números en 0 (predeterminado) o -1 para indicar esto, pero dependiendo del escenario, esto puede ser incorrecto o engañoso.
Si desea utilizar Colecciones, debe utilizar las clases Wrapper.
Los tipos primitivos se utilizan para matrices. Además, para representar datos que no tienen comportamiento, por ejemplo, un contador o una condición booleana.
Desde el autoboxing, la frontera de "cuándo usar primitivo o envoltorio" se ha vuelto bastante confusa.
Pero recuerde, los Wrappers son objetos, por lo que obtiene todas las características elegantes de Java. Por ejemplo, puede utilizar la reflexión para crear objetos Integer, pero no valores int. Las clases contenedoras también tienen métodos como valueOf.
Si desea crear un tipo de valor. Algo como ProductSKU o AirportCode.
Cuando un tipo primitivo (cadena en mis ejemplos) define la igualdad, querrá anular la igualdad.
Los valores primitivos en Java no son objeto. Para manipular estos valores como objeto, el paquete java.lang proporciona una clase contenedora para cada uno de los tipos de datos primitivos.
Todas las clases de Wrapper son finales. El objeto de todas las clases contenedoras que se pueden iniciar son inmutables, lo que significa que el valor en el objeto contenedor no se puede cambiar.
Aunque, la clase void se considera una clase contenedora, pero no envuelve ningún valor primitivo y no es iniciable. No tiene un constructor público, solo denota un objeto de clase que representa la palabra clave void.