¿Eliminar un objeto en java?

99

Quiero eliminar un objeto que creé (un óvalo que te sigue), pero ¿cómo lo haría?

delete follower1;

no funcionó.

EDITAR:

Bien, daré más contexto. Estoy haciendo un pequeño juego con un óvalo que puedes controlar y un óvalo que te sigue. Ahora tengo archivos con el nombre: DrawPanel.class, esta clase dibuja todo en la pantalla y maneja colisiones, sonidos, etc. Tengo un enemigo.class, que es el óvalo que sigue al jugador. Tengo una entity.class, que es el jugador que puedes controlar. Y si el jugador se cruza con el seguidor, quiero que se elimine mi objeto de jugador. La forma en que lo estoy haciendo:

    public void checkCollisions(){
    if(player.getBounds().intersects(follower1.getBounds())){
        Follower1Alive = false;
        player.health = player.health - 10;
    }
}
Stan
fuente
1
¿Puede proporcionar un poco más de contexto?
Joseph Weissman
2
No hay eliminación de objetos en Java. Pero normalmente no es necesario: lo que necesita es asegurarse de que ya no se muestre nada en la pantalla (si esto es lo que está haciendo "seguirte").
Paŭlo Ebermann
¿Quizás quieras intentar forzar al recolector de basura a eliminar un objeto? hay una pregunta sobre ello aquí ya. ¿O quizás estás intentando algo más? puede intentar leer un poco sobre el recolector de basura aquí o aquí. Si todavía no ayuda, tendrá que ser más específico.
Fawix
posible duplicado de Forzar eliminación explícita de un objeto Java
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Si realmente realmente desea manejar las asignaciones de objetos manualmente, use JNI: cree una biblioteca C / C ++ que se usa desde el código Java pero hace todo (crear, eliminar, etc.) por su cuenta, pero dentro de su biblioteca tiene C / Código C ++, no Java. No he visto ninguna forma de eliminar un objeto Java manualmente. Si su generador de perfiles le dice que hay problemas, estos problemas a menudo se basan en referencias "olvidadas" a objetos. En su caso, no parece haber ningún problema en ninguna parte.
Johannes

Respuestas:

171

Debe eliminar las referencias asignando nulo o dejando el bloque donde se declaró. Después de eso, el recolector de basura lo eliminará automáticamente (no inmediatamente, pero eventualmente).

Ejemplo 1:

Object a = new Object();
a = null; // after this, if there is no reference to the object,
          // it will be deleted by the garbage collector

Ejemplo 2:

if (something) {
    Object o = new Object(); 
} // as you leave the block, the reference is deleted.
  // Later on, the garbage collector will delete the object itself.

No es algo que esté buscando actualmente, pero para su información: puede invocar al recolector de basura con la llamada System.gc ()

MByD
fuente
23
Tener que llamar manualmente noSystem.gc() es generalmente una buena idea , ya que la JVM puede ignorarlo.
cdeange
3
No es una buena idea, pero también puede llamar de forma similar a System .. Runtime.getRuntime (). Gc (). Más información: las rutinas de recolección de basura que proporciona Java son miembros de la clase Runtime. La clase Runtime es una clase especial que tiene un solo objeto (un Singleton) para cada programa principal. El objeto Runtime proporciona un mecanismo para comunicarse directamente con la máquina virtual. Para obtener la instancia de Runtime, puede usar el método Runtime.getRuntime (), que devuelve Singleton.
Timo
1
¿Es la nullasignación un signo definitivo para el GC de que este objeto se va a eliminar y limpiar en la próxima invocación del GC? * ¿Asignar nulla los objetos de colección (listas, matrices) los marca para su limpieza? stackoverflow.com/questions/449409/…
George Daramouskas
Entonces, debería hacer que todas mis vistas de texto y botones de imagen sean nulos en el onPause?
Ruchir Baronia
No hay garantía de que el recolector de basura alguna vez se ejecute, o que, si lo hace, recolectará (no 'eliminará') ningún objeto específico.
Marqués de Lorne
64

Se muestra su C ++.

No hay deleteen java, y todos los objetos se crean en el montón. La JVM tiene un recolector de basura que se basa en recuentos de referencias.

Una vez que no hay más referencias a un objeto, el recolector de basura lo puede recolectar.

myObject = nullno puede hacerlo; por ejemplo:

Foo myObject = new Foo(); // 1 reference
Foo myOtherObject = myObject; // 2 references
myObject = null; // 1 reference

Todo lo que esto hace es establecer la referencia myObjecten nula, no afecta al objeto myObjectuna vez señalado, excepto para simplemente disminuir el recuento de referencias en 1. Dado que myOtherObjecttodavía se refiere a ese objeto, aún no está disponible para ser recopilado.

Brian Roach
fuente
Entonces, debería hacer que todas mis vistas de texto y botones de imagen sean nulos en el onPause?
Ruchir Baronia
8
"La JVM tiene un recolector de basura que se basa en recuentos de referencias". -> esa es una explicación muy simplificada. Comprueba si los objetos son accesibles desde una "raíz" específica
Johannes
2
La JVM tiene un recolector de basura que específicamente no depende de los recuentos de referencias. Se basa en la accesibilidad. Si dependiera de los recuentos de referencias, nunca podría recopilar ciclos, y lo hace.
Marqués de Lorne
14

Si desea que un objeto desaparezca, establezca su referencia en nulo.

String x = "sadfasdfasd";
// do stuff
x = null;

Establecer la referencia en nulo hará que sea más probable que el objeto sea recolectado como basura, siempre que no haya otras referencias al objeto.

John Percival Hackworth
fuente
Siempre que hago eso, cuando mi objeto se cruza, todo mi juego se congelará y no eliminará el objeto.
Stan
Porque probablemente esté lanzando una excepción de puntero nulo no detectada. Sin duda, más contexto nos ayudaría a guiarlo a través de esto.
Joseph Weissman
Así que debería hacer que todos mis textviews y imagebuttons nulos en el onPause?
Ruchir Baronia
Si realmente necesita que se vayan, entonces eventualmente lo hará.
John Percival Hackworth
3

No es necesario eliminar objetos en java. Cuando no hay ninguna referencia a un objeto, el recolector de basura lo recopilará automáticamente.

fmucar
fuente
Así que debería hacer que todos mis textviews y imagebuttons nulos en el onPause?
Ruchir Baronia
0

Puede eliminar la referencia utilizando null.

Digamos que tienes clase A:

A a = new A();
a=null;

La última instrucción eliminará la referencia del objeto ay ese objeto será "recolectado como basura" por JVM. Es una de las formas más sencillas de hacerlo.

Lakhan
fuente
Así que debería hacer que todos mis textviews y imagebuttons nulos en el onPause?
Ruchir Baronia
-3

Sí, java es basura recolectada, eliminará la memoria por usted.

Jake Kalstad
fuente
37
en el momento menos esperado
matcheek
2
s / delete / fuga / g
Mark K Cowan
-6
//Just use a List
//create the list
public final List<Object> myObjects;

//instantiate the list
myObjects = new ArrayList<Object>();

//add objects to the list
Object object = myObject;
myObjects.add(object);

//remove the object calling this method if you have more than 1 objects still works with 1
//object too.

private void removeObject(){
int len = myObjects.size();
for(int i = 0;i<len; i++){
Objects object = myObjects.get(i);
myObjects.remove(object);
}
}
usuario3124852
fuente
La razón por la que esta respuesta es incorrecta es porque solo elimina una referencia al Objeto, y no al objeto real en sí.
Ben Morris
La razón por la que esta respuesta es incorrecta porque muestra cómo puede eliminar un objeto de una lista: esta no era la pregunta.
phil