Digamos que he creado una cierta clase de recurso con un método close() para limpiar el recurso, y quiero anular finalize() para liberar el recurso (e imprimir una advertencia) si alguien ha olvidado llamar a close(). ¿Cómo se puede hacer esto de forma adecuada?Cómo aplicar correctamente un finalizador para la detección de fugas de recursos en Java
- ¿Se recomienda solo para recursos nativos (asignados por JNI)?
- ¿Qué ocurre si se utiliza una referencia a otro objeto que haya sido finalizado, desde un finalizador? Si hay dependencias cíclicas, no veo cómo el recolector de basura puede impedirle acceder a objetos cuyos finalizadores podrían haberse ejecutado.
- ¿Hay mejores alternativas a primordiales finalize() para detectar y/o hacer frente a las pérdidas de recursos?
- ¿Alguna otra dificultad a tener en cuenta al implementar un finalizador?
Nota: Sé que usar finalize() suele ser una mala idea, y que no se garantiza que se llame, hay varias otras preguntas sobre esto. Esta pregunta es específicamente sobre cómo para implementar un finalizador en Java, no se trata de qué se debe (o no debería).
Espero que mis respuestas ayuden. Avísame si me perdí algo. –
Se reformuló el segundo punto sobre el acceso a objetos posiblemente finalizados desde un finalizador. Todavía tiene curiosidad sobre cuáles serían las implicaciones de eso. – Soulman