Obtenção das instâncias de uma clase

Existe algum método que retorna todas as instâncias de uma determinada classe?
Obrigado

A resposta simples é “não”.

Entretanto, se você, nessa classe, definir um método que vá adicionando as instâncias dessa classe a uma lista (ou outra estrutura) e que seja chamado nos construtores dessa classe, então você até pode conseguir colecionar as tais instâncias. Obviamente isso não é recomendado, porque você está criando “objetos imortais”, que somente serão limpos quando você encerrar seu programa, e terá um vazamento de memória.

Seguindo a solução do thingol voce teria que em algum momento retirar o objeto da lista. Assim como o Garbage Collector faz. O problema é voce saber quando ele é elegivel a isso.

[quote=thingol]A resposta simples é “não”.

Entretanto, se você, nessa classe, definir um método que vá adicionando as instâncias dessa classe a uma lista (ou outra estrutura) e que seja chamado nos construtores dessa classe, então você até pode conseguir colecionar as tais instâncias. Obviamente isso não é recomendado, porque você está criando “objetos imortais”, que somente serão limpos quando você encerrar seu programa, e terá um vazamento de memória.
[/quote]

Seria algo + - assim:

[code]public class MinhaClasse {

public static List<MinhaClasse> objetos = new ArrayList<MinhaClasse>();

public MinhaClasse() {
    //faz o que tiver que fazer..
    objetos.add(this);
}

public static List<MinhaClasse> getObjetos() {
    return objetos;
}

}[/code]

É + - isso que você quis dizer thingol???

T+

Se você quiser usar um WeakHashMap para ir contendo as referências a objetos dessa classe, esteja à vontade. A idéia é que se você incluir um determinado objeto nesse WeakHashMap, ele não tem problemas de ser removido pelo Garbage Collector. Vou dar um exemplo.

import java.util.*;

class Cliente {
    private String nome;
    public Cliente (String nome_) { nome = nome_; }
    public String toString() { return nome; }
    public static Collection<Cliente> getReferencias() { return referencias.keySet(); }

    {
        referencias.put (this, null);
    }

    private static WeakHashMap<Cliente, Integer> referencias = new WeakHashMap<Cliente, Integer>();
}

class TesteWeakHashMap {
    public static void main (String[] args) {
        new Cliente ("Jose");
        new Cliente ("Joao");
        new Cliente ("Maria");
        Cliente x = new Cliente ("Lucas");
        System.out.println (Cliente.getReferencias());
        System.gc();
        System.out.println (Cliente.getReferencias());
    }
}

Isto deve imprimir:

[Maria, Joao, Jose, Lucas]
[Lucas]

thingol, acho que não entendi muito bem o que é um WeakHashMap (parece que o GC faz a coleta quando o valor da chave não é mais utilizável). Dei uma olhada na api e nesse post, mas não ficou muito claro.

Outra coisa, o que o WeakHashMap tem a ver com o exemplo que dei???

Obrigado pelas explicações…

Diego.

Bom, Diego:

  • Seu programa é quase igual ao meu, exceto pelo uso da estrutura de dados. Um ArrayList mantém uma referência “forte” a cada objeto; isso faz com que o Garbage Collector não consiga limpar os objetos que não estão referenciados em nenhum outro lugar do programa a não ser por esse ArrayList.

O meu programa usa um WeakHashMap. Nesse caso, esse map mantém uma referência “fraca” a cada objeto. Se houver apenas referências “fracas” a um objeto, o Garbage Collector pode limpar o tal objeto, como é o caso dos objetos Joao, José e Maria que apareceram no meu programa. Há apenas uma referência forte, no caso a Lucas; nesse caso, é por isso que o WeakHashMap apresenta apenas o objeto Lucas após a garbage collection.

Por que vc precisa de alguma coisa como esta?

flws

Pessoal, obrigado pelas respostas, vou avaliar melhor meus requisitos pra ver se terei realmente que fazer algo desse tipo, uma vez que foi desaconselhado.
fantomas, eu pensei em usar algo desse tipo pra poder pesquisar informações de objetos que estão relacionados de forma topológica, ou seja, suas associações são dinâmicas e não tenho como estabelecê-las no momento de inicialização. Meu aplicativo contém informações de tempo real de subestações de energia elétrica, o aplicativo original foi escrito em C e agora estamos modernizando o sistema, porém pela inexperiência com Java e também devido à grande quantidade de vícios de programção em C essa tarefa não está sendo nada fácil.
Agradeço novamente pelas respostas.

THINGOL …

eu ja tinha visto a solução do WeakHashMap, so uma duvida… sei q não fui olhar na API, desculpa, mas existe uma WeakHashCollection ?? ou algo do genereno ??

ou so existe esse map mesmo ?

No Google eu achei isso.

http://www.ambus.dk/plan-x/msd/docs/org/planx/util/WeakCollection.html

Mas se for o caso voce pode implementar um facilmente. Veja sobre a WeakReference.