Excluindo um objeto em java?


99

Quero excluir um objeto que criei (um oval que segue você), mas como faria isso?

delete follower1;

não funcionou.

EDITAR:

Ok, vou dar mais contexto. Estou fazendo um pequeno jogo com um oval que você pode controlar e um oval que o segue. Agora eu tenho arquivos chamados: DrawPanel.class, esta classe desenha tudo na tela e lida com colisões, sons, etc. Eu tenho um inimigo.class, que é o oval após o jogador. Eu tenho um entity.class, que é o player que você pode controlar. E se o jogador se cruzar com o seguidor, quero que meu objeto jogador seja excluído. Do jeito que estou fazendo:

    public void checkCollisions(){
    if(player.getBounds().intersects(follower1.getBounds())){
        Follower1Alive = false;
        player.health = player.health - 10;
    }
}

1
você pode fornecer um pouco mais de contexto?
Joseph Weissman,

2
Não há exclusão de objetos em Java. Mas normalmente você não precisa: o que você precisa é ter certeza de que não há mais nada sendo mostrado na tela (se é isso que "te seguindo" está fazendo).
Paŭlo Ebermann,

Talvez você queira tentar forçar o coletor de lixo a remover um objeto? já há uma pergunta sobre isso aqui . Ou talvez você esteja tentando outra coisa? você pode tentar ler um pouco sobre o coletor de lixo aqui ou aqui. Se ainda não houver ajuda, você precisará ser mais específico.
Fawix de


Se você realmente realmente deseja manipular alocações de objetos manualmente, use JNI: crie uma lib C / C ++ que é usada a partir do código Java, mas faz tudo (criar, excluir, etc.) por conta própria - mas dentro de sua biblioteca você tem C / Código C ++, sem Java. Eu não vi nenhuma maneira de excluir um objeto Java manualmente. Se o seu criador de perfil informar que há problemas, esses problemas geralmente se baseiam em referências "esquecidas" a objetos. No seu caso, não parece haver problema em lugar nenhum.
Johannes de

Respostas:


171

Você deve remover as referências a ele atribuindo nulo ou deixando o bloco onde foi declarado. Depois disso, ele será excluído automaticamente pelo coletor de lixo (não imediatamente, mas eventualmente).

Exemplo 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

Exemplo 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.

Não é algo que você esteja procurando atualmente, mas para sua informação: você pode invocar o coletor de lixo com a chamada System.gc ()


23
Ter que chamar manualmente System.gc()geralmente não é uma boa ideia , já que pode realmente ser ignorado pela JVM.
cdeange

3
Não é uma boa ideia, mas você também pode chamar semelhante a System .. Runtime.getRuntime (). Gc (). Mais informações: as rotinas de coleta de lixo que o Java fornece são membros da classe Runtime. A classe Runtime é uma classe especial que possui um único objeto (um Singleton) para cada programa principal. O objeto Runtime fornece um mecanismo para comunicação direta com a máquina virtual. Para obter a instância Runtime, você pode usar o método Runtime.getRuntime (), que retorna o Singleton.
Timo

1
A nullatribuição é um sinal definitivo para o GC de que este objeto deve ser limpo com Garbaged na próxima invocação do GC? * Atribuir nulla objetos de coleção (listas, matrizes) marca-os para limpeza? stackoverflow.com/questions/449409/…
George Daramouskas

Portanto, devo tornar todos os meus textviews e imagebuttons nulos no onPause?
Ruchir Baronia de

Não há garantia de que o coletor de lixo algum dia será executado ou que, se for, ele coletará (não 'excluirá') qualquer objeto específico.
Marquês de Lorne

64

Seu C ++ está aparecendo.

Não há delete em java, e todos os objetos são criados no heap. A JVM possui um coletor de lixo que conta com contagens de referência.

Quando não houver mais referências a um objeto, ele se tornará disponível para coleta pelo coletor de lixo.

myObject = nullpode não fazer isso; por exemplo:

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

Tudo o que isso faz é definir a referência myObjectcomo nula, não afeta o objeto myObjectuma vez apontado, exceto para simplesmente diminuir a contagem de referência em 1. Uma vez que myOtherObjectainda se refere a esse objeto, ele ainda não está disponível para ser coletado.


Portanto, devo tornar todos os meus textviews e imagebuttons nulos no onPause?
Ruchir Baronia de

8
"A JVM possui um coletor de lixo que conta com contagens de referência." -> essa é uma explicação muito simplificada. Ele verifica se os objetos são alcançáveis ​​a partir de uma "raiz" específica
Johannes

2
A JVM possui um coletor de lixo que especificamente não depende de contagens de referência. Ele depende da acessibilidade. Se dependesse de contagens de referência, nunca poderia coletar ciclos, e realmente o faz.
Marquês de Lorne

14

Se você quiser ajudar um objeto a desaparecer, defina sua referência como null.

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

Definir a referência como null tornará mais provável que o objeto seja coletado como lixo, desde que não haja outras referências ao objeto.


Sempre que faço isso, quando meu objeto se cruza, todo o meu jogo congela e não deleta o objeto.
Stan,

Porque você provavelmente está lançando uma exceção de ponteiro nulo não capturada. Mais contexto certamente nos ajudaria a orientar você nesse processo.
Joseph Weissman

Portanto, devo tornar todos os meus textviews e imagebuttons nulos no onPause?
Ruchir Baronia de

Se você realmente precisa que eles desapareçam, isso acabará eventualmente.
John Percival Hackworth de

3

Você não precisa excluir objetos em java. Quando não houver referência a um objeto, ele será coletado pelo coletor de lixo automaticamente.


Portanto, devo tornar todos os meus textviews e imagebuttons nulos no onPause?
Ruchir Baronia de

0

Você pode remover a referência usando null.

Digamos que você tenha aula A:

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

A última instrução removerá a referência do objeto ae esse objeto será "coletado como lixo" pela JVM. É uma das maneiras mais fáceis de fazer isso.


Portanto, devo tornar todos os meus textviews e imagebuttons nulos no onPause?
Ruchir Baronia de


-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);
}
}

A razão pela qual esta resposta está incorreta é porque ela remove apenas uma referência ao objeto, e não o próprio objeto real.
Ben Morris

A razão pela qual esta resposta está incorreta porque mostra como você pode remover um objeto de uma lista - essa não era a questão.
phil
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.