He leído (en algún lugar) que no se garantiza que se llame a finalize()
cuando la subclase se recolecta basura, ¿esto significa que la mayoría de los desarrolladores anula finalize()
en la subclase y llama al super.finalize()
?¿Llamas a super.finalize() dentro de una subclase?
Respuesta
Finalizar no se llama automáticamente para la superclase. Así que si se reemplaza finalización, la forma correcta para asegurar la superclase se limpie sería
protected void finalize() {
try {
// do subclass cleanup
}
finally {
super.finalize();
}
}
ver este artículo de referencia http://www.ibm.com/developerworks/java/library/j-jtp06294/index.html
Debe ser la pena señalar que los finalizadores no son muy predecibles y usted don' t tienen control sobre si/cuando se ejecutan. No se debe hacer nada crítico en los métodos de finalización. En general, es una mejor práctica simplemente realizar una limpieza explícita de su clase.
Lo mejor es evitar confiar en finalizar para limpiar cualquier recurso que no sea Java (no se garantiza la finalización de las llamadas). Si es posible, use try with resources (si usa JDK7) o intente cláusulas finally para limpiar recursos entre otras opciones cuando sea posible. Si va a utilizar finalizar, puede poner el super.finalize en un bloqueo try try. Sería inteligente no confiar en finalizar para limpiar los recursos.
// don't make it public!
protected void finalize() throws Throwable
{
try
{
// custom finalization here
}
finally
{
super.finalize();
}
}
Si la idea es limpiar los recursos, sería prudente tal vez echa un vistazo a las referencias fantasma - un objeto es phantomly alcanzable si no es ni fuerte/débil/suavemente accesible, ha sido finalizado & hay por lo al menos una referencia fantasma (es decir, el objeto ha sido finalizado pero aún no recuperado).
- 1. Obteniendo el nombre de una subclase dentro de una superclase
- 2. ¿Qué sucede si nunca llamas a Socket.EndConnect?
- 3. Subclase o no a la subclase
- 4. ¿Qué sucede cuando llamas a un método estático en C#?
- 5. Agregar mediante programación una nueva fila a la subclase QAbstractListModel
- 6. Matlab ode45. ¿Cómo cambiar un parámetro dentro de él mientras lo llamas?
- 7. Destacando una subclase uicontrol
- 8. ¿Qué es una subclase
- 9. GWT serialización de una subclase
- 10. Interceptar mensajes de delegado de Objective-C dentro de una subclase
- 11. ¿Usando un tipo genérico de una subclase dentro de su superclase abstracta?
- 12. CoreData - cómo crear una subclase de una subclase de NSManagedObject (patrón Generation Gap)
- 13. Documento XSLT(): ¿Es más lento cuando lo llamas varias veces?
- 14. Fluidez NHibernate: ¿cómo asignar una subclase uno a uno?
- 15. Creando una subclase personalizada de ColorFilter?
- 16. Crear subclase con diferentes propiedades subclase
- 17. ¿Cómo secuela una subclase de UITableViewCell?
- 18. Mover elementos entre dos cuadros de lista. ¿Cómo llamas a este tipo de formulario?
- 19. Python: ¿Cómo llamas a un método cuando solo tienes el nombre de la cadena del método?
- 20. Subclase NSMutableDictionary
- 21. INotifyPropertyChanged en la subclase
- 22. Subclase UILabel
- 23. Hibernate: ¿Qué pasa con esta asignación a una subclase unida a una clave externa?
- 24. Llamar a un método de subclase de la superclase
- 25. reemplazando loadView en una subclase UITableViewController
- 26. Usando una subclase UITableView con un UITableViewController
- 27. Pasar argumentos a una subclase específica, a través de un método de fábrica
- 28. Agregar una subclase UIViewController en Xcode 4.3
- 29. ¿Puede un constructor devolver una subclase?
- 30. ¿Reemplazando los métodos de subclase con argumentos subclase?
Java efectivo - elemento 7: evitar los finalizadores. Si usa finalizadores, debe llamar a super.finalize(). – assylias
Entonces, ¿se llama a finalize() para la superclase cuando la subclase es basura? – user997112
Gran artículo que creo que tiene relevancia: [Por qué Finalize is Protected] (http://www.0xcafefeed.com/2005/09/why-is-finalize-method-protected/). –