716
Capítulo 17 Estructuras de datos
17.2 Clases de envoltura de tipos para los tipos primitivos
Cada uno de los tipos primitivos (que se enlistan en el apéndice D, Tipos primitivos) tiene su correspondiente
clase de envoltura de tipo
(en el paquete
java.lang
). Estas clases se llaman
Bolean
,
Byte
,
Character
,
Double
,
Float
,
Integer
,
Long
y
Short
. Cada clase de envoltura de tipo nos permite manipular los valores de tipos
primitivos como objetos. Muchas de las estructuras de datos que desarrollamos o reutilizamos en los capítu-
los 17 a 19 manipulan y comparten objetos
Object
. Estas clases no pueden manipular variables de tipos primi-
tivos, pero sí pueden manipular objetos de las clases de envoltura de tipos, ya que en última instancia, cada clase
se deriva de
Object
.
Cada una de las clases de envoltura de tipos numéricos (
Byte
,
Short
,
Integer
,
Long
,
Float
y
Double
)
extiende a la clase
Number
. Además, las clases de envoltura de tipos son
final
, por lo que no podemos extenderlas.
Los tipos primitivos no tienen métodos, por lo que los métodos relacionados con un tipo primitivo se
encuentran en la clase de envoltura de tipo correspondiente (por ejemplo, el método
parseInt
, que convierte
un objeto
String
en un valor
int
, se encuentra en la clase
Integer
). Si necesita manipular un valor primitivo
en su programa, primero consulte la documentación para las clases de envoltura de tipos; el método que necesite
tal vez ya esté declarado.
17.3 Autoboxing y autounboxing
Antes de Java SE 5, si queríamos insertar un valor primitivo en una estructura de datos que pudiera almacenar
sólo objetos
Object
, teníamos que crear un nuevo objeto de la clase de envoltura de tipo correspondiente, y
después insertar este objeto en la colección. De manera similar, si queríamos obtener un objeto de una clase de
envoltura de tipo de una colección y manipular su valor primitivo, teníamos que invocar un método en el objeto
para obtener su correspondiente valor de tipo primitivo. Por ejemplo, suponga que desea agregar un
int
a un
arreglo que almacene sólo referencias a objetos
Integer
. Antes de Java SE 5, teníamos que “envolver” un valor
int
en un objeto
Integer
antes de agregar el entero al arreglo y “desenvolver” el valor
int
del objeto
Integer
para obtener el valor del arreglo, como en
Integer[] arregloEntero =
new
Integer[
5
];
// crea arregloEntero
// asigna Integer 10 a enteroArreglo[ 0 ]
arregloEntero[
0
] =
new
Integer(
10
);
// obtiene valor int de Integer
int
valor = arregloEntero[
0
].intValue();
Observe que el valor primitivo
int
10
se utiliza para inicializar un objeto
Integer
. Esto logra el resultado desea-
do, pero requiere código adicional y es pesado. Después necesitamos invocar el método
intValue
de la clase
Integer
para obtener el valor
int
en el objeto
Integer
.
Java SE 5 simplifi có la conversión entre valores de tipos primitivos y los objetos de envoltura de tipos, al no
requerir código adicional de parte del programador. Java SE 5 introdujo dos nuevas conversiones: la conversión
boxing y la conversión unboxing. Una
conversión boxing
convierte un valor de un tipo primitivo en un objeto
de la clase de envoltura de tipo correspondiente. Una
conversión unboxing
convierte un objeto de una clase de
envoltura de tipo en un valor del tipo primitivo correspondiente. Estas conversiones se pueden realizar de manera
automática (a lo cual se le conoce como
autoboxing
y
autounboxing
). Por ejemplo, las instrucciones anteriores
se pueden reescribir como
Integer[] arregloEntero =
new
Integer[
5
];
// crea arregloEntero
arregloEntero[
0
] =
10
;
// asigna Integer 10 a arregloEntero[ 0 ]
int
valor = arregloEntero[
0
];
// obtiene valor int de Integer
En este caso, la conversión autoboxing ocurre cuando se asigna un valor
int
(
10
) a
arregloEntero[
0
]
, ya
que
arregloEntero
almacena referencias a objetos
Integer
, no valores primitivos
int
. La conversión auto-
unboxing ocurre cuando se asigna
arregloEntero[
0
]
la variable
int
valor
, ya que esta variable almacena un
valor
int
, no una referencia a un objeto
Integer
. Las conversiones autoboxing y autounboxing también ocurren
en las instrucciones de control; la condición de una instrucción de control se puede evaluar como un tipo primi-
tivo
boolean
o un tipo de referencia
Boolean
. Muchos de los ejemplos de este capítulo utilizan estas conversiones
para almacenar valores primitivos en, y para obtenerlos de, las estructuras de datos que sólo almacenan referencias
a objetos
Object
.
17_MAQ_CAP_17_DEITEL.indd716
4/19/081:30:01AM