Las líneas 19 a 21 utilizan el método
static
range
de la clase
EnumSet
(declarada en el paquete
java.
util
) para mostrar un rango de las constantes de la
enum Libro
. El método
range
recibe dos parámetros (la
primera y la última constantes
enum
en el rango) y devuelve un objeto
EnumSet
que contiene todas las constan-
tes entre estas dos constantes. Por ejemplo, la expresión
EnumSet.range( Libro.JHTP6
,
Libro.CPPHTP4
)
devuelve un objeto
EnumSet
que contiene
Libro.JHTP6
,
Libro.CHTP4
,
Libro.IW3HTP3
y
Libro.CPPHTP4
. La
instrucción
for
mejorada se puede utilizar con un objeto
EnumSet
, justo igual que como se utiliza con un arreglo,
por lo que las líneas 19 a 21 utilizan la instrucción
for
mejorada para mostrar el título y el año de copyright de
cada libro en el objeto
EnumSet
. La clase
EnumSet
proporciona varios métodos
static
más para crear conjuntos
de constantes
enum
del mismo tipo de
enum
. Para obtener más detalles de la clase
EnumSet
, visite
java.sun.
com/javase/6/docs/api/java/util/EnumSet.html
.
Error común de programación 8.6
En una declaración
enum
, es un error de sintaxis declarar constantes
enum
después de los constructores, campos y
métodos del tipo de
enum
en su declaración.
8.10 Recolección de basura y el método
finalize
Toda clase en Java tiene los métodos de la clase
Object
(paquete
java.lang
), uno de los cuales es el
método
fina-
lize
. Este método se utiliza raras veces. De hecho, buscamos a través de 6500 archivos de código fuente las clases
de la API de Java, y encontramos menos de 50 declaraciones del método
finalize
. Sin embargo, y como
finalize
forma parte de cada clase, hablaremos aquí sobre este método para que a usted se le facilite comprender su pro-
pósito planeado, en caso de que se lo encuentre en sus estudios o en la industria. Los detalles completos acerca
del método
finalize
están más allá del alcance de este libro, además de que la mayoría de los programadores
no deben usarlo; pronto veremos por qué. Aprenderá más acerca de la clase
Object
en el capítulo 9, Programa-
ción orientada a objetos: herencia.
Todo objeto que creamos utiliza varios recursos del sistema, como la memoria. Para evitar “fugas de recur-
sos”, requerimos una manera disciplinada de regresar los recursos al sistema cuando ya no se necesitan. La Máqui-
na Virtual de Java (JVM) realiza la
recolección automática de basura
para reclamar la memoria ocupada por
los objetos que ya no se utilizan. Cuando ya no hay más referencias a un objeto, la JVM lo deja
marcado para la
recolección de basura
. La memoria para dicho objeto se puede reclamar cuando la JVM ejecuta su
recolector de
basura
, el cual es responsable de recuperar la memoria de los objetos que ya no se utilizan, para poder usarla con
otros objetos. Por lo tanto, las fugas de memoria que son comunes en otros lenguajes como C y C++ (debido a que
en esos lenguajes, la memoria no se reclama de manera automática) son menos probables en Java (pero algunas
pueden ocurrir de todas formas, aunque con menos magnitud). Pueden ocurrir otros tipos de fugas de recursos.
Por ejemplo, una aplicación podría abrir un archivo en disco para modifi car el contenido. Si la aplicación no
cierra el archivo, ninguna otra aplicación puede utilizarlo sino hasta que termine la aplicación que lo abrió.
El recolector de basura llama al método
finalize
para realizar las
tareas de preparación para la terminación
sobre un objeto, justo antes de que el recolector de basura reclame la memoria de ese objeto. El método
finalize
no recibe parámetros y tiene el tipo de valor de retorno
void
. Un problema con el método
finalize
es que no se
garantiza que el recolector de basura se ejecute en un tiempo especifi cado. De hecho, tal vez el recolector de basura
nunca se ejecute antes de que termine un programa. Por ende, no queda claro si (o cuándo) se hará la llamada al
método
finalize
. Por esta razón, la mayoría de los programadores deben evitar el uso del método
finalize
. En la
sección 8.11 demostraremos una situación en la que el recolector de basura llama al método
finalize
.
Observación de ingeniería de software 8.10
Una clase que utiliza recursos del sistema, como archivos en el disco, debe proporcionar un método para liberarlos en
un momento dado. Muchas clases de la API de Java proporcionan métodos
close
o
dispose
para este propósito. Por
ejemplo, la clase
Scanner
(
java.sun.com/javase/6/docs/api/java/util/Scanner.html
) tiene un método
close
.
8.11 Miembros de clase
static
Cada objeto tiene su propia copia de todas las variables de instancia de la clase. En ciertos casos, sólo debe com-
partirse una copia de cierta variable entre todos los objetos de una clase. En esos casos se utiliza un
campo
static
8.11 Miembros de clase
static
345
08_MAQ_CAP_08.indd345
4/19/081:23:51AM