Eu sou novo na programação orientada a objetos e continuo com esse problema. (Estou programando em Java) Fiquei um pouco relutante em perguntar sobre isso, pois parece um problema tão básico, mas não consigo encontrar nenhuma informação sobre ele ou perguntas sobre isso aqui, e nenhuma das os livros que li (em um nível bastante básico) abordaram esse assunto:
Frequentemente, preciso acompanhar todos os objetos de uma classe que foram criados, para percorrer os mesmos para vários propósitos. Da maneira como atualmente escrevo programas, muitos objetos são referenciados apenas de outros objetos, o que significa que não tenho matriz ou coleção com a qual referenciar todos eles.
Eu imagino que, como isso parece uma necessidade muito básica na OOP, deve haver uma maneira bastante institucionalizada e simples de fazer isso? É prática comum manter uma lista separada de todos os objetos de uma classe?
Pensei em uma matriz ou coleção estática, à qual, através de seu construtor, todos os novos objetos criados seriam adicionados. No entanto, isso não funcionaria com subclasses, uma vez que os construtores não são herdados?
Sei que essa pergunta pode não ter uma resposta fácil; Eu só espero que alguém possa me esclarecer um pouco sobre esse assunto. Sinto como se estivesse sem um conhecimento central aqui.
Respostas:
Não sei por que você precisa manter uma lista de todas as instâncias de uma classe.
Isso causaria vazamento de memória, pois esses objetos nunca serão descartados, uma vez que a lista ainda os fará referência depois que nenhuma outra classe o fizer.
Mas se você realmente deseja seguir esse caminho:
A propósito: construtores são herdados.
fonte
Deve-se notar que referências fracas podem ser usadas em combinação com as outras soluções fornecidas para permitir que o coletor de lixo descarte os objetos rastreados quando eles não forem mais referenciados em outro lugar. Isso elimina vazamentos de memória sem exigir código em outro lugar para descartar manualmente os objetos ou cuidar de que eles estejam sendo rastreados. Você pode fornecer um ReferenceQueue para receber uma notificação de referências a objetos que foram liberados.
Os construtores das classes base são chamados antes dos construtores das classes derivadas. Toda classe tem pelo menos um construtor e os construtores não podem ser substituídos.
fonte
Ao criar jogos, as pessoas às vezes desejam uma coleção "autogerenciada" de cada tipo de objeto do jogo.
Uma implementação é assim:
Dessa maneira, os métodos de manipulação da coleção podem ser declarados estáticos, enquanto os métodos não estáticos manipulam uma instância (updateAll vs. update).
Embora adequado para cenários muito simples, mesmo com complexidade moderada, geralmente é melhor criar classes de gerente separadas.
fonte
static ArrayList<ListeStatic> list = new ArrayList<ListeStatic>();
e suprimir o statc {..}uptdateAll(){..;}
Tente pensar no contexto. Quando você cria um objeto, você o faz em um determinado contexto. Por exemplo, se seu jogo é sobre atirar em alienígenas, seu aplicativo cria novos objetos alienígenas o tempo todo. Eles serão exibidos em um campo chamado Space (que pode ser a classe que representa a interface do usuário principal).
É perfeitamente natural que o Space tenha uma propriedade chamada currentAliens, que seria uma matriz, à qual você adiciona cada novo alienígena que criar. Se você deseja permitir que seu usuário rasgue o tecido do espaço-tempo e destrua todos os alienígenas de uma só vez, você percorrerá essa coleção e destruirá cada objeto.
Se você quiser ter acesso a essa coleção de alienígenas de outras partes do seu aplicativo (por exemplo, em uma página Configurações, onde você pode permitir que os usuários destruam certos tipos de alienígenas de uma só vez), o contexto Configurações será precisa ter acesso ao objeto Space.
fonte