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