Porque, quando e onde usar Inner Class?  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
bland
JavaEvangelist

Membro desde: 10/12/2004 09:36:35
Mensagens: 330
Offline

Pessoal,

Em uma conversa com um colega de trabalho nos deparamos com essa dúvida. Alguém poderia tentar nos ajudar?

Até porque sempre que penso em uma Inner Class, penso que o mesmo pode ser solucionado com um método ou uma nova classe ou até mesmo com uma outra classe no mesmo documento.

Se alguém puder me ajudar, ficarei grato.

Abraço a todos.

http://www.twitter.com/almeidafabiano

Fabiano Almeida.
[MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

1. Quando a sua classe só tem sentido dentro do escopo de outra classe. Por exemplo, a classe No de uma lista encadeada, só tem sentido dentro da lista encadeada. E será diferente da classe No de uma lista duplamente encadeada. Então, usar uma Inner Class é uma boa para evitar esses conflitos de nomes e para manter o escopo o mais reduzido possível;

2. Inner class anônimas são úteis para escrever implementações para interfaces simples. Você nunca fez ou viu isso aqui?



3. As inner classes não estáticas tem a vantagem de poder ver os métodos e atributos das classes que as agregam (como no exemplo ali em cima, a inner class anônima filha de WindowAdapter enxergou tanto o this quanto o dispose() da classe Janela). Isso pode simplificar muito o código.

Note que no caso da lista encadeada, a classe nó poderia não ter gets e sets, e isso acaba sendo seguro para o sistema como um todo, pois seu escopo ficou tão reduzido que pode ser interessante abrir mão de um pouco do encapsulamento em prol de um código simples dentro da classe ListaEncadeada.

4. Para evitar violar o encapsulamento de sua classe principal. Por exemplo, vamos supor que você precise rodar uma parte do seu código dentro de uma thread. Você poderia ficar tentado a fazer sua classe implementar runnable:



Essa classe deveria iniciar a thread no método iniciar e parar no método parar. Entretanto, do jeito que está aí, seu usuário pode fazer:


Ou mesmo:


Ambos os casos, um uso incorreto da sua classe. Isso ocorreu pq, para implementar Runnable, o método run() teve de ser deixado público,o que violou o encapsulamento de um trecho importante da sua classe principal. Para resolver isso, você pode deixar o trecho do Runnable numa inner class privada, evitando violar esse encapsulamento:



Note que agora não é mais possível fazer as construções inválidas acima, afinal, sua classe principal não implementa Runnable.

This message was edited 3 times. Last update was at 13/11/2007 15:08:40


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
cristiano.andrade
JavaChild

Membro desde: 12/11/2007 10:25:20
Mensagens: 113
Localização: Barrinha-SP
Offline

Talvez essa apostila te ajude a entender melhor

http://www.de9.ime.eb.br/~madeira/teaching/labprog2/classes_internas.pdf

Abraços

This message was edited 1 time. Last update was at 13/11/2007 15:10:17


Cristiano da Silva Andrade - Cristiano's Blog
[WWW]
bbviana
JavaChild
[Avatar]

Membro desde: 24/07/2006 13:11:57
Mensagens: 111
Localização: São Paulo
Offline

Completando os posts anteriores...
Eu costumo usar inner classes muitas vezes pra criar uma Key de um mapa (cache por ex) interno. Essa key soh tem sentido no escopo da classe principal, entao por isso a key é uma inner.

Ex:



Uma outra utilização comum de inner class é na implementação de interfaces, como nas classes do framework Collections. Abra o codigo fonte de ArrayList (e de toda sua hierarquia) por ex e vc verá a implemantação da interface Iterator la como uma inner.
 
Índice dos Fóruns » Arquitetura de Sistemas
Ir para:   
Powered by JForum 2.1.8 © JForum Team