311 votos

Hay un destructor para Java?

Hay un destructor para Java? No parecen ser capaces de encontrar ninguna documentación sobre esto. Si no la hay, ¿cómo puedo lograr el mismo efecto?

Para hacer mi pregunta más específica, estoy escribiendo una aplicación que se ocupa de los datos, y las especificaciones dicen que debe ser un 'reset' botón que trae consigo la aplicación a su estado original acaba de lanzar el estado. Sin embargo, todos los datos tienen que ser 'en directo', a menos que la aplicación está cerrada o el botón reset está presionado.

Generalmente con una C/C++ programador, pensé que esto sería trivial de implementar. (Y por lo tanto me previstas para la aplicación de éste último.) He estructurado mi programa de tal manera que todos los 'reset-capaz de " objetos sería en una misma clase, de modo que sólo puedo destruir todos 'en vivo' de los objetos al botón reset está presionado.

Yo estaba pensando, si todo lo que hice fue simplemente para eliminar los datos y esperar a que el recolector de basura para recoger de ellos, ¿no habría una pérdida de memoria si mi usuario repetidamente los datos introducidos y pulse el botón de reinicio? Yo también estaba pensando, ya que Java es bastante madura como un idioma, debería haber una forma de evitar que esto suceda, o con gracia frente a este.

307voto

Garth Gilmour Puntos 5219

Debido a que Java es un recolector de basura idioma que usted no puede predecir cuándo (o si) de un objeto será destruido. Por lo tanto no existe un equivalente directo de un destructor.

No es un método heredado de llamada finalizar, pero esto se llama enteramente a la discreción de la recolector de basura. Así que para las clases que necesitan explícitamente ordenado, el convenio es definir una estrecha método y el uso de finalizar sólo por la cordura de control (es decir. si el cierre no se ha llamado a hacerlo ahora y registro de un error).

Hubo una pregunta que dio lugar a debate en profundidad de finalizar recientemente, por lo que se debe dar más profundidad si es necesario...

70voto

ddimitrov Puntos 2005

No, no hay destructores aquí. La razón es que todos los objetos Java son del montón asignado y la recolección. Sin explícita desasignación (es decir. C++operador delete) no hay manera sensible a la aplicación real de los destructores.

Java soporta los finalizadores, pero que están destinados a ser utilizados sólo como una salvaguardia para los objetos de la celebración de un identificador de recursos nativos, como sockets, identificadores de archivo de identificadores de ventana, etc. Cuando el recolector de basura recoge un objeto sin un finalizador simplemente marca la memoria de la región como libre y eso es todo. Cuando el objeto tiene un finalizador, la primera copia en una ubicación temporal (recuerden, estamos de recolección de basura aquí), entonces es que está en cola en espera-para-ser-finalizado la cola y, a continuación, un Finalizador hilo de las encuestas de la cola con prioridad muy baja y se ejecuta el finalizador.

Todos los Finalizadores se ejecutan en el mismo hilo, así que si alguno de los finalizadores se bloquea, todo el finalizador hilo se bloquea. Si usted lanza una excepción, esto podría matar el finalizador hilo (aunque la JVM es libre de jugar una nueva) y en el peor de los casos no hay más pendientes de los objetos será finalizado. Cuando sale de la aplicación, la JVM deja sin esperar a que los objetos pendientes de ser finalizado, por lo que no hay prácticamente ninguna garantía de que su finalizadores nunca va a correr.

56voto

Vitalii Fedorenko Puntos 17469

Si el uso de Java 7, echar un vistazo a la prueba-con-recursos de instrucción. Por ejemplo:

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
  System.out.println(br.readLine());
} catch (Exception e) {
  ...
} finally {
  ...
}

Aquí el recurso que ya no es necesario que se libera en la BufferedReader.close() método. Usted puede crear su propia clase que implementa Closeable y utilizar en una manera similar.

Esta declaración es más limitada que finalize en términos de la estructuración de código, pero, al mismo tiempo, hace el código más fácil de entender y mantener. Además, no hay ninguna garantía de que un finalize método es llamado a todos durante la livetime de la aplicación.

17voto

McDowell Puntos 62645

Uso de finalizar() métodos deben ser evitados. Ellos no son un mecanismo confiable de los recursos de limpiar y es posible que cause problemas en el recolector de basura por abusar de ellos.

Si necesita una cancelación de llamada en su objeto, digamos, a la liberación de recursos, el uso de un método explícito de la llamada. El presente convenio puede ser visto en las APIs existentes (por ej. Closeable, Graphics.dispose(), Widget.dispose()) y se denomina generalmente a través de try/finally.

Resource r = new Resource();
try {
    //work
} finally {
    r.dispose();
}

Intenta utilizar un eliminados objeto debe lanzar una excepción de tiempo de ejecución (ver IllegalStateException).


EDICIÓN:

Yo estaba pensando, si todo lo que hice fue simplemente para eliminar los datos y esperar a el recolector de basura para recoger de ellos, ¿no habría una pérdida de memoria si mi usuario repetidamente los datos introducidos y los pulsa el botón de reset?

En general, todo lo que necesita hacer es quitar la referencia de los objetos - al menos, esta es la forma en que se supone que funciona. Si usted está preocupado acerca de la recolección de basura, echa un vistazo Java SE 6 HotSpot[tm] de la Máquina Virtual de Recolección de Basura de Sintonía (o documento equivalente para su versión de la JVM).

10voto

Markus Lux Puntos 985

Estoy totalmente de acuerdo con otras respuestas, diciendo que no se basan en la ejecución de finalizar.

Además de los try-catch-finally bloques, se puede utilizar en tiempo de ejecución#addShutdownHook (introducido en Java 1.6) para realizar limpiezas final en su programa.

Que no es lo mismo que los destructores son, pero uno puede implementar un enlace de cierre de tener objetos de escucha registrada en el que los métodos de limpieza (cerca de la base de datos persistente conexiones, quitar los bloqueos de archivo, y así sucesivamente) puede ser invocada - las cosas que normalmente se haría en los destructores. De nuevo, este no es un reemplazo para los constructores, pero en algunos casos, usted puede acercarse a la que quería funcionalidad de este.

La ventaja de esto es tener la deconstrucción bevaviour loosley junto al resto de su programa.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X