Nested Classes: Use com consciência

Há situações em que precisamos de nested classes, seja para agrupar logicamente classes que apenas fazem sentido num determinado local, ou mesmo para melhorar o encapsulamento. A API Java padrão está repleta de bons exemplos. Mas é preciso algum cuidado para não fazer mal uso delas.

O que é uma nested class?

De maneira bem simples e direta, uma nested class é uma classe membro de outra classe – conhecida como enclosing class.

Java dispõe de dois tipos de nested classes:

1. Static Nested Classes, que são classes sintaticamente residentes em outra classe, mas que usa esta apenas como namespace.

Este tipo de nested class não tem acesso a membros de instância de sua enclosing class.

A sintax para instanciar este tipo de nested class é bem trivial:

StaticNestedClass obj = new EnclosingClass.StaticNestedClass();

2. Non-static Nested Classes ou Inner Classes, que além de residir sintaticamente em outra classe, também tem acesso a membros de instância desta – pois sua instância resite na instância de sua enclosing class.

Este tipo de nested class tem uma sintax bem exótica de instanciação, mas até que intuitiva, quando você entende o conceito de inner class. Veja:

InnerClass obj = objEnclosingClass.new InnerClass();

Por que intuitiva? Porque uma vez que uma instância de inner class está diretamente associada a uma instância de sua enclosing class – e só pode existir nela -, nada mais natural do que criar esta instância a partir da instância de sua enclosing class.

Por motivos óbvios, inner classes consomem mais tempo de processamento e memória que static nested classes.

Quando usar uma ou outra?

Sabendo quais são os tipos de nested classes possíveis no Java – estáticas e não estáticas – e suas naturezas, podemos ter uma idéia clara de quando usar uma ou outra.

  • Se sua nested class precisa de acesso a membros de sua enclosing class, opte por inner class;
  • Caso contrário, se o que você precisa, na verdade, é apenas de um namespace, opter por static nested class.

Simples, não?

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s