¿Existe un destructor para Java?

¿Existe un destructor para Java? Parece que no puedo encontrar ninguna documentación sobre esto. Si no lo hay, ¿cómo puedo lograr el mismo efecto?

Para hacer mi pregunta más específica, estoy escribiendo una aplicación que trata con datos y la especificación dice que debería haber un botón de 'reinicio' que devuelva la aplicación a su estado original recién lanzado. Sin embargo, todos los datos deben estar "en vivo" a menos que se cierre la aplicación o se presione el botón de reinicio.

Siendo generalmente un programador de C / C ++, pensé que esto sería trivial de implementar. (Y, por lo tanto, planeé implementarlo en último lugar). Estructuré mi programa de manera que todos los objetos 'reiniciables' estuvieran en la misma clase para poder destruir todos los objetos 'activos' cuando se presione un botón de reinicio.

Estaba pensando que si todo lo que hacía era simplemente eliminar la referencia de los datos y esperar a que el recolector de basura los recopilara, ¿no habría una pérdida de memoria si mi usuario ingresara datos repetidamente y presionara el botón de reinicio? También estaba pensando que, dado que Java es un lenguaje bastante maduro, debería haber una forma de evitar que esto suceda o abordarlo con elegancia.

preguntado Oct 05 '08, 11:10

Solo hay una pérdida de memoria si tiene referencias a objetos que no necesita. es decir, hay un error en su programa. El GC funcionará según sea necesario (a veces antes):

La máquina virtual no ejecutará GC lo suficientemente pronto si está procesando datos rápidamente a través de objetos. La idea de que el GC siempre puede mantenerse al día o tomar las decisiones correctas es una falacia. -

@Kieveli ¿No ejecutaría JVM GC antes de dar un error? -

Sí, sería bueno si hubiera un destructor para Java que lo destruyera de una vez por todas. -

22 Respuestas

Debido a que Java es un lenguaje de recolección de basura, no puede predecir cuándo (o incluso si) se destruirá un objeto. Por tanto, no existe un equivalente directo de un destructor.

Hay un método heredado llamado finalize, pero esto se llama enteramente a discreción del recolector de basura. Entonces, para las clases que necesitan ordenar explícitamente, la convención es definir un Cerrar método y utilizar finalizar sólo para comprobar la cordura (es decir, si Cerrar no ha sido llamado hazlo ahora y registra un error).

Había una pregunta que generó un debate en profundidad sobre finalizar recientemente, por lo que debería proporcionar más profundidad si es necesario ...

contestado el 23 de mayo de 17 a las 13:05

¿"Close ()" en este contexto se refiere al método en java.lang.Autocloseable? - Sridhar Sarnobat

No, AutoCloseable se introdujo en Java 7, pero la convención 'close ()' ha existido por mucho más tiempo. - jon onstott

por qué no puede predecir cuándo (o incluso si) un objeto será destruido. ¿Qué otra forma aproximada de predecir eso? - usuario1270589

La destrucción del objeto @dctremblay la realiza el recolector de basura y es posible que el recolector de basura nunca se ejecute durante la vida útil de la aplicación. - Piro dice Reincorporar a Monica

Tenga en cuenta que finalize Método Ha quedado obsoleto en Java 9. - lii

Echa un vistazo a la probar con recursos declaració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 se necesita se libera en el BufferedReader.close() método. Puede crear su propia clase que implemente AutoCloseable y utilícelo de manera similar.

Esta declaración es más limitada que finalize en términos de estructuración de código, pero al mismo tiempo hace que el código sea más simple de entender y mantener. Además, no hay garantía de que un finalize se llama al método durante el tiempo en vivo de la aplicación.

Respondido 04 Jul 19, 18:07

Me sorprende que tenga tan pocos votos. Es la respuesta real. - nurettin

No estoy de acuerdo con que sea la respuesta real. Si una instancia tiene un recurso que maneja durante un período de tiempo más largo, a través de múltiples llamadas a métodos, try-with-resources no ayudará. A menos que esté bien cerrar y volver a abrir dicho recurso a la velocidad a la que se llama a dichos métodos, no es un hecho general. - Eric

De hecho, esto es no la respuesta real. Es imposible utilizar esta estructura para gestionar la destrucción de un objeto a menos que la construcción y el uso del objeto estén completamente encapsulados por el try y el finally se usa para forzar una llamada a obj.finalize(). E incluso esta configuración no resuelve el problema planteado por OP: destrucción de objetos en mitad del programa activado por un botón de "reinicio". - 7yl4r

Otros usuarios han demostrado que esto se hace en el punto de entrada de su aplicación. Defina su variable globalmente. Inicialícelo en la función de entrada, con try. Desinicializar al final (cuando se cierre la aplicación). Es completamente posible. - TamusJRoyce

@nurettin Java 7 solo había estado disponible durante 3 meses cuando se hizo la pregunta, si eso ayuda a darle más sentido. - Córcega

No, no hay destructores aquí. La razón es que todos los objetos Java se asignan en montón y se recolectan basura. Sin una desasignación explícita (es decir, el operador de eliminación de C ++) no hay una forma sensata de implementar destructores reales.

Java admite finalizadores, pero están destinados a ser utilizados solo como una protección para los objetos que tienen un identificador de recursos nativos como sockets, identificadores de archivos, identificadores de ventanas, etc. Cuando el recolector de basura recolecta un objeto sin un finalizador, simplemente marca la memoria región como libre y eso es todo. Cuando el objeto tiene un finalizador, primero se copia en una ubicación temporal (recuerde, aquí estamos recolectando basura), luego se coloca en una cola de espera para ser finalizado y luego un hilo de Finalizador sondea la cola con muy baja prioridad y ejecuta el finalizador.

Cuando la aplicación sale, la JVM se detiene sin esperar a que se finalicen los objetos pendientes, por lo que prácticamente no hay garantías de que sus finalizadores se ejecuten alguna vez.

Respondido el 19 de junio de 17 a las 14:06

Gracias por mencionar los recursos nativos; esta es un área en la que un método "similar a un destructor" es útil. - Nathan Osman

sí, estoy enfrentando el mismo problema en este momento con la liberación de recursos / manejadores asignados a través de llamadas nativas a C ++. - nikk

@ddimitrov, en teoría, ¿podría Java implementar la desasignación explícita? ¿O es una contradicción lógica? - mils

@mils implementando ingenuamente la desasignación explícita rompería la suposición de Java de que cualquier referencia apunta a un objeto en vivo. Puede iterar sobre todos los punteros y anular los alias, pero eso es más caro que GC. O puede intentar usar algún sistema de tipo lineal (ver "propiedad" en Rust), pero ese es un cambio de idioma importante. También hay otras opciones (consulte la memoria con ámbito JavaRT, etc.), pero en general, la desasignación explícita no encaja bien con el lenguaje Java. - dimitrov

El uso de finalizar() deben evitarse los métodos. No son un mecanismo confiable para la limpieza de recursos y es posible causar problemas en el recolector de basura abusando de ellos.

Si necesita una llamada de desasignación en su objeto, por ejemplo, para liberar recursos, use una llamada de método explícita. Esta convención se puede ver en las API existentes (p. Ej. Cerrable, Graphics.dispose (), Widget.dispose ()) y generalmente se llama a través de intentar / finalmente.

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

Los intentos de utilizar un objeto desechado deben generar una excepción de tiempo de ejecución (consulte IllegalStateExceptionIlegalStateException).


EDIT:

Estaba pensando, si todo lo que hiciera fuera simplemente eliminar la referencia de los datos y esperar a que el recolector de basura los recopilara, ¿no habría una pérdida de memoria si mi usuario ingresara datos repetidamente y presionara el botón de reinicio?

Generalmente, todo lo que necesita hacer es desreferenciar los objetos; al menos, esta es la forma en que se supone que funciona. Si le preocupa la recolección de basura, consulte Ajuste de recolección de basura de máquina virtual de Java SE 6 HotSpot [tm] (o el documento equivalente para su versión de JVM).

Respondido 06 Oct 08, 00:10

Eso no es lo que significa la desreferencia. No se trata de "establecer la última referencia de un objeto en nulo", sino de obtener (leer) el valor de una referencia para que pueda usarlo para operaciones posteriores. - usuario146043

¿Try..finalmente sigue siendo un enfoque válido y recomendado? Supongamos que anteriormente estaba llamando a un método nativo en finalize (), ¿puedo mover la llamada a la cláusula finalmente? class Resource { finalize() { destroy(); } protected native void destroy(); } class Alt_Resource { try (Resource r = new Resource()) { // use r } finalize { r.destroy(); } - aashima

r no estaría en el ámbito del bloque finalmente. Por lo tanto, no puede llamar a destruir en ese momento. Ahora, si corrige el alcance para tener la creación del objeto antes del bloque try, terminaría con el feo caso "before try-with-resources". - usuarioAsh

Con Java 1.7 lanzado, ahora tiene la opción adicional de usar el try-with-resources cuadra. Por ejemplo,

public class Closeable implements AutoCloseable {
    @Override
    public void close() {
        System.out.println("closing..."); 
    }
    public static void main(String[] args) {
        try (Closeable c = new Closeable()) {
            System.out.println("trying..."); 
            throw new Exception("throwing..."); 
        }
        catch (Exception e) {
            System.out.println("catching..."); 
        }
        finally {
            System.out.println("finalizing..."); 
        } 
    }
}

Si ejecuta esta clase, c.close() se ejecutará cuando el try se deja el bloque, y antes del catch y finally se ejecutan los bloques. A diferencia del caso del finalize() método, close() está garantizado para ser ejecutado. Sin embargo, no es necesario ejecutarlo explícitamente en el finally cláusula.

respondido 14 nov., 16:10

¿Qué pasa si no usamos el bloque try-with-resources? Creo que podemos llamar a close en finalize () solo para asegurarnos de que se haya llamado a close. - sintoísta

@shintoZ como leí en las respuestas anteriores, no hay garantía de finalize() ejecución - Asif Mushtaq

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

Además de los bloques try-catch-finalmente, puede usar Tiempo de ejecución # addShutdownHook (introducido en Java 1.3) para realizar limpiezas finales en su programa.

Eso no es lo mismo que son los destructores, pero se puede implementar un gancho de cierre con objetos de escucha registrados en los que se pueden invocar métodos de limpieza (cerrar conexiones de bases de datos persistentes, eliminar bloqueos de archivos, etc.), cosas que normalmente se haría en destructores. Nuevamente, esto no es un reemplazo para los destructores, pero en algunos casos, puede acercarse a la funcionalidad deseada con esto.

La ventaja de esto es tener un comportamiento de deconstrucción. débilmente acoplado del resto de su programa.

Respondido el 07 de junio de 19 a las 13:06

addShutdownHook aparentemente se introdujo en Java 1.3. De todos modos, está disponible para mí en 1.5. :) Mira esto: stackoverflow.com/questions/727151/… - saltarín

Para su información, en mi experiencia, no se llamará a los hooks de cierre si usa el botón rojo "terminar" en Eclipse - toda la JVM se destruye inmediatamente, los hooks de cierre no se llaman correctamente. Lo que significa que puede ver un comportamiento diferente durante el desarrollo y la producción si desarrolla utilizando eclipse - hamy

NO, java.lang.Object#finalize es lo más cercano que puedes conseguir.

Sin embargo, cuándo (y si) se llama, no está garantizado.
Ver: java.lang.Runtime#runFinalizersOnExit(boolean)

Respondido el 09 de enero de 14 a las 23:01

Un método que puede o no ser llamado es esencialmente inútil en mi libro. Hubiera sido mejor no contaminar el idioma con un método especial inútil que, en el mejor de los casos, da una falsa sensación de seguridad. Nunca entenderé por qué los desarrolladores del lenguaje Java pensaron que finalizar era una buena idea. - antraído

@antred Los desarrolladores del lenguaje Java están de acuerdo. Supongo que, en ese entonces, para algunos de ellos, fue la primera vez que diseñaron un lenguaje de programación y un entorno de ejecución con recolección de basura. Lo que es menos comprensible es por qué ese otro lenguaje administrado copió ese concepto en un momento en el que ya se entendía que este concepto es una mala idea. - Holger

Primero, tenga en cuenta que, dado que Java se recolecta como basura, es raro tener que hacer algo sobre la destrucción de objetos. En primer lugar, porque normalmente no tienes recursos administrados para liberar, y en segundo lugar porque no puedes predecir cuándo o si sucederá, por lo que no es apropiado para las cosas que necesitas que sucedan "tan pronto como nadie esté usando mi objeto más ".

Se le puede notificar después de que un objeto ha sido destruido usando java.lang.ref.PhantomReference (en realidad, decir que ha sido destruido puede ser un poco inexacto, pero si una referencia fantasma se pone en cola, entonces ya no es recuperable, lo que generalmente equivale a la misma cosa). Un uso común es:

  • Separe los recursos de su clase que deben destruirse en otro objeto auxiliar (tenga en cuenta que si todo lo que está haciendo es cerrar una conexión, que es un caso común, no es necesario que escriba una nueva clase: la conexión a cerrar sería el "objeto auxiliar" en ese caso).
  • Cuando cree su objeto principal, cree también una PhantomReference a él. Haga que esto se refiera al nuevo objeto auxiliar o configure un mapa desde los objetos PhantomReference a sus correspondientes objetos auxiliares.
  • Una vez que se recopila el objeto principal, la PhantomReference se pone en cola (o más bien, puede estar en cola; como los finalizadores, no hay garantía de que alguna vez lo esté, por ejemplo, si la VM sale, no esperará). Asegúrese de estar procesando su cola (ya sea en un hilo especial o de vez en cuando). Debido a la fuerte referencia al objeto de ayuda, el objeto de ayuda aún no se ha recopilado. Por lo tanto, haga la limpieza que desee en el objeto auxiliar, luego descarte la PhantomReference y, finalmente, el ayudante también se recopilará.

También está finalize (), que parece un destructor pero no se comporta como tal. Por lo general, no es una buena opción.

Respondido 05 Oct 08, 16:10

¿Por qué una PhantomReference en lugar de una WeakReference? - uckelman

@uckelman: si todo lo que quieres es una notificación, entonces PhantomReference hace el trabajo, esto es más o menos para lo que está diseñado. La semántica adicional de WeakReference no es necesaria aquí, y en el punto donde se notifica a su ReferenceQueue, ya no puede recuperar el objeto a través de WeakReference, por lo que la única razón para usarlo es para evitar tener que recordar que PhantomReference existe. Cualquier trabajo adicional que haga WeakReference probablemente sea insignificante, pero ¿por qué molestarse con él? - steve jesop

Gracias por insinuar PhantomReference. No es perfecto, pero es mejor que nada. - foo

@SteveJessop ¿Qué “trabajo extra”, crees, tiene una referencia débil en comparación con una referencia fantasma? - Holger

Programas de finalize() la función es el destructor.

Sin embargo, no se debe utilizar normalmente porque se invoca después de la GC y no se puede saber cuándo sucederá (si es que ocurrirá).

Además, se necesita más de un GC para desasignar objetos que tienen finalize().

Debería intentar limpiar en los lugares lógicos de su código usando el try{...} finally{...} ¡declaraciones!

Respondido 08 Feb 18, 10:02

Estoy de acuerdo con la mayoría de las respuestas.

No deberías depender completamente de ninguno finalize or ShutdownHook

finalizar

  1. La JVM no garantiza cuando esto finalize() se invocará el método.

  2. finalize() se llama solo una vez por hilo GC. Si un objeto se revive a sí mismo del método de finalización, entonces finalize no se volverá a llamar.

  3. En su aplicación, puede tener algunos objetos activos, en los que nunca se invoca la recolección de basura.

  4. Año Exception que arroja el método de finalización es ignorado por el subproceso GC

  5. System.runFinalization(true) y Runtime.getRuntime().runFinalization(true) Los métodos aumentan la probabilidad de invocar finalize() pero ahora estos dos métodos han quedado obsoletos. Estos métodos son muy peligrosos debido a la falta de seguridad de los subprocesos y la posible creación de puntos muertos.

cierreganchos

public void addShutdownHook(Thread hook)

Registra un nuevo gancho de cierre de máquina virtual.

La máquina virtual Java se apaga en respuesta a dos tipos de eventos:

  1. El programa sale normalmente, cuando sale el último hilo que no es demonio o cuando la salida (equivalentemente, System.exit) se invoca el método, o

  2. La máquina virtual se termina en respuesta a una interrupción del usuario, como al escribir ^ C, o un evento en todo el sistema, como el cierre de sesión del usuario o el apagado del sistema.

  3. Un gancho de cierre es simplemente un hilo inicializado pero no iniciado. Cuando la máquina virtual comienza su secuencia de apagado, iniciará todos los enganches de apagado registrados en un orden no especificado y los dejará correr al mismo tiempo. Cuando todos los ganchos hayan finalizado, se ejecutarán todos los finalizadores no invocados si se ha habilitado la finalización al salir.

  4. Finalmente, la máquina virtual se detendrá. Tenga en cuenta que los subprocesos del demonio continuarán ejecutándose durante la secuencia de apagado, al igual que los subprocesos que no son demonio si el apagado se inició invocando el método de salida.

  5. Los ganchos de apagado también deben terminar su trabajo rápidamente. Cuando un programa invoca la salida, la expectativa es que la máquina virtual se apague y salga de inmediato.

    Pero incluso la documentación de Oracle citaba que

En raras circunstancias, la máquina virtual puede abortar, es decir, dejar de funcionar sin apagarse limpiamente

Esto ocurre cuando la máquina virtual se termina externamente, por ejemplo con el SIGKILL señal en Unix o el TerminateProcess llamar a Microsoft Windows. La máquina virtual también puede abortar si un método nativo falla, por ejemplo, al corromper las estructuras de datos internas o al intentar acceder a una memoria inexistente. Si la máquina virtual se aborta, no se puede garantizar que se ejecuten o no enlaces de cierre.

Conclusión : utilizan el try{} catch{} finally{} bloquea adecuadamente y libera recursos críticos en finally(} cuadra. Durante la liberación de recursos en finally{} bloquear, atrapar Exception y Throwable.

Respondido el 20 de junio de 20 a las 10:06

Si es sólo la memoria lo que le preocupa, no lo haga. Confíe en el GC, hace un trabajo decente. De hecho, vi algo acerca de que era tan eficiente que podría ser mejor para el rendimiento crear montones de objetos pequeños que utilizar matrices grandes en algunos casos.

Respondido 05 Oct 08, 17:10

Quizás pueda usar un bloque try ... finalmente para finalizar el objeto en el flujo de control en el que está usando el objeto. Por supuesto, no ocurre automáticamente, pero tampoco la destrucción en C ++. A menudo ve el cierre de recursos en el bloque finalmente.

Respondido 05 Oct 08, 14:10

Esta es la respuesta correcta cuando el recurso en cuestión tiene un solo propietario y nunca tiene referencias a él "robado" por otro código. - steve jesop

Hay un @Limpiar anotación en Lombok que en su mayoría se parece a los destructores de C ++:

@Cleanup
ResourceClass resource = new ResourceClass();

Al procesarlo (en el momento de la compilación), Lombok inserta los try-finally bloquear para que resource.close() se invoca, cuando la ejecución abandona el ámbito de la variable. También puede especificar explícitamente otro método para liberar el recurso, p. Ej. resource.dispose():

@Cleanup("dispose")
ResourceClass resource = new ResourceClass();

Respondido el 28 de diciembre de 16 a las 12:12

La ventaja que veo es que habrá menos anidamiento (lo que puede ser significativo si tiene muchos objetos que requieren "destruir"). - Alexey

Un bloque de prueba con recursos puede tener varios recursos en una sola toma: Alexander

Pero no puede tener instrucciones entre ellos. - Alexey

Justo. Supongo que entonces la recomendación es preferir try-with-resource, incluso para múltiples recursos, a menos que sea necesario que haya instrucciones entre ellos que lo obliguen a hacer nuevos bloques try-with-resource (aumentando el anidamiento), luego use @Cleanup - Alexander

El equivalente más cercano a un destructor en Java es el finalizar() método. La gran diferencia con un destructor tradicional es que no puedes estar seguro de cuándo se llamará, ya que esa es la responsabilidad del recolector de basura. Recomiendo encarecidamente leer detenidamente esto antes de usarlo, ya que sus patrones RAIA típicos para identificadores de archivos, etc., no funcionarán de manera confiable con finalize ().

Respondido 05 Oct 08, 14:10

Solo pensando en la pregunta original ... que, creo que podemos concluir de todas las otras respuestas aprendidas, y también de la esencia esencial de Bloch. Java eficaz, el ítem 7, "Evitar finalizadores", busca la solución a una pregunta legítima de una manera inapropiada para el lenguaje Java ...:

... ¿no sería una solución bastante obvia para hacer lo que el OP realmente quiere ser mantener todos sus objetos que deben restablecerse en una especie de "parque infantil", al que todos los demás objetos que no se pueden restablecer tienen referencias solo a través de algún tipo? del objeto descriptor de acceso ...

Y luego, cuando necesita "reiniciar", desconecta el parque existente y crea uno nuevo: toda la red de objetos en el parque se deja a la deriva, para no volver nunca, y un día para ser recolectada por el GC.

Si alguno de estos objetos es Closeable (o no, pero ten un close método) podrías ponerlos en un Bag en el parque a medida que se crean (y posiblemente se abren), y el último acto del acceso antes de cortar el parque sería pasar por todos los Closeables cerrándolos ...?

El código probablemente se vería así:

accessor.getPlaypen().closeCloseables();
accessor.setPlaypen( new Playpen() );

closeCloseables probablemente sería un método de bloqueo, probablemente involucrando un pestillo (p. ej. CountdownLatch), para tratar (y esperar según corresponda) cualquier Runnables/Callables en cualquier hilo específico de la Playpen para finalizar según corresponda, en particular en el hilo JavaFX.

Respondido el 21 de diciembre de 16 a las 18:12

Aquí hay muchas respuestas excelentes, pero hay información adicional sobre por qué debería evitar usar finalizar().

Si la JVM sale debido a System.exit() or Runtime.getRuntime().exit(), los finalizadores no se ejecutarán de forma predeterminada. De Javadoc para Runtime.exit ():

La secuencia de apagado de la máquina virtual consta de dos fases. En la primera fase, todos los hooks de cierre registrados, si los hay, se inician en un orden no especificado y se les permite ejecutarse simultáneamente hasta que finalizan. En la segunda fase, todos los finalizadores no invocados se ejecutan si se ha habilitado la finalización al salir. Una vez hecho esto, la máquina virtual se detiene.

Puedes llamar System.runFinalization() pero solo hace "el mejor esfuerzo para completar todas las finalizaciones pendientes", no una garantía.

Hay un System.runFinalizersOnExit() método, pero no lo use, es inseguro, obsoleto hace mucho tiempo.

Respondido 24 Jul 19, 19:07

Si está escribiendo un subprograma de Java, puede anular el método "destroy ()" del subprograma. Es...

 * Called by the browser or applet viewer to inform
 * this applet that it is being reclaimed and that it should destroy
 * any resources that it has allocated. The stop() method
 * will always be called before destroy().

Obviamente no lo que desea, pero podría ser lo que otras personas están buscando.

Respondido 25 ago 09, 15:08

Aunque ha habido avances considerables en la tecnología GC de Java, aún debe tener en cuenta sus referencias. Me vienen a la mente numerosos casos de patrones de referencia aparentemente triviales que en realidad son nidos de ratas bajo el capó.

Desde su publicación, no parece que esté tratando de implementar un método de reinicio con el propósito de reutilizar objetos (¿cierto?). ¿Sus objetos contienen algún otro tipo de recursos que deben limpiarse (es decir, arroyos que deben cerrarse, cualquier objeto agrupado o prestado que debe devolverse)? Si lo único que le preocupa es la desbloqueo de memoria, reconsideraría la estructura de mi objeto e intentaría verificar que mis objetos sean estructuras autónomas que se limpiarán en el momento de la GC.

Respondido 05 Oct 08, 18:10

No Java no tiene destructores. La razón principal detrás de esto en Java son los recolectores de basura que siempre funcionan pasivamente en segundo plano y todos los objetos se hacen en la memoria del montón, que es el lugar donde funciona GC. tiene que llamar explícitamente a la función de eliminación ya que no hay un recolector de basura como algo.

contestado el 23 de mayo de 20 a las 20:05

En Java, el recolector de basura elimina automáticamente los objetos no utilizados para liberar memoria. Así que es sensato que Java no tenga destructores disponibles.

Respondido el 13 de Septiembre de 20 a las 18:09

No hay exactamente una clase destructora en Java, una clase destruida en Java automáticamente por el recolector de basura. pero podrías hacer eso usando el siguiente, pero no es exactamente lo mismo:

finalizar()

Había una pregunta que generó un debate en profundidad sobre finalizar , por lo que debería obtener más profundidad si es necesario ...

Respondido 05 Jul 18, 10:07

Solía ​​tratar principalmente con C ++ y eso es lo que me llevó a la búsqueda de un destructor también. Estoy usando mucho JAVA ahora. Lo que hice, y puede que no sea el mejor caso para todos, pero implementé mi propio destructor restableciendo todos los valores a 0 o el valor predeterminado a través de una función.

Ejemplo:

public myDestructor() {

variableA = 0; //INT
variableB = 0.0; //DOUBLE & FLOAT
variableC = "NO NAME ENTERED"; //TEXT & STRING
variableD = false; //BOOL

}

Idealmente, esto no funcionará para todas las situaciones, pero donde hay variables globales, funcionará siempre que no tenga muchas.

Sé que no soy el mejor programador de Java, pero parece que me está funcionando.

contestado el 17 de mayo de 13 a las 17:05

Intenta usar más objetos inmutables, después de 'conseguirlo' todo tendrá más sentido :) - R. van Twisk

Esto no es tan malo como inútil, es decir, no logra nada. Si su programa requiere que se restablezcan los tipos sin procesar para que funcionen correctamente, entonces sus instancias de clases tienen un alcance incorrecto, lo que significa que probablemente esté reasignando las propiedades de un objeto existente a las propiedades de un nuevo objeto, sin crear un nuevo Objeto (). - simo.3792

Excepto que hay muchas necesidades para restablecer las variables. Elegí el nombre destructor porque se ajusta a lo que estoy haciendo. Logra algo, nada que comprendas. ChristianGLargo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.