Classes Internas (Java)

From Wiki**3

Programação com Objectos
Introduction
Creation and Destruction
Inheritance & Composition
Abstraction & Polymorphism
Code Organization
Java Topics
Inner Classes
Enumerations
Data Structures
Exceptions
Input/Output
RTTI
Other Topics
JUnit Tests
UML Topics
Design Patterns
"Simple" Factory
Composite & Visitor
Command
Strategy & State
Template Method
Observer
Abstract Factory
Decorator & Adapter
Façade (aka Facade)

Na descrição mais simples, uma classe interna não é mais do que uma classe definida dentro de outra, sendo o acesso a ela controlado pela classe externa através das habituais especificações public, private, etc. Ainda nesta abordagem simples, este processo permite definir âmbitos restritos de visibilidade e acesso.

Em C++ e para classes internas Java declaradas static, a descrição "simples" é a que realmente é implementada pela linguagem. Nestes casos, serve apenas como processo de organização de código, não havendo necessariamente uma relação entre as classes internas e as externas que as contêm. Embora estes usos tenham utilização, especialmente em C++ (onde são a única possibilidade), não são a forma habitual de definir classes internas em Java.

Classe internas (não "static") em Java

As classes internas em Java são mais que classes definidas dentro de outras classes. A definição destas classes implica que existe uma relação estreita entre uma classe interna e a externa que a contém. A definição é tal que as instâncias de classes internas têm acesso implícito às instâncias das classes externas, no contexto das quais foram criadas. Como se verá abaixo esta ligação é muito importante para os aspectos interessantes da programação utilizando este tipo de abstracções.

De modo análogo ao do acesso nos métodos de uma classe, o código de uma classe interna é considerado código da classe externa e pode ser por ela utilizada. Reciprocamente, o código da classe interna tem acesso implícito (directo) ao código e atributos da classe externa, mesmo que esta os tenha definido como private.

A criação de objectos com base em classes internas, na segunda definição, não é sequer possível sem a existência prévia de uma instância da classe externa. Os vários exemplos abaixo ilustram esta questão e introduzem nova formas de escrita (sintaxe) relacionadas com a criação e inicialização (new e construtores) destes objectos.

Organização de código

  • Organização de interfaces e classes e acesso ao código
  • Classes internas locais (métodos e blocos)
  • Classes anónimas

Aspectos Básicos

  • Classes internas e os vários aspectos de definição: classes internas simples; implementação de interfaces
  • Ligação implícita entre objectos de classes internas e a instância da classe externa
  • Partilha de acesso entre classe externa e interna
  • Herança e classes internas e externas

Exemplos

Estes exemplos ilustram o uso de classes internas, evidenciando vantagens relativamente à ocultação de pormenores de implementação e consequente melhoria na abstracção e organização de código.

Gatos Iteráveis

O exemplo dos gatos iteráveis mostra como iterar um gato constituído por várias partes. Começa-se com uma implementação menos elegante e termina-se com a "melhor" implementação.

Comparadores em Java

Os exemplos seguintes dizem respeito a interfaces Java.

Gato e Estômago

Os exemplos apresentados nos vários com um gato e um estômago são semelhantes aos anteriores, mostrando como localizar a definição de uma classe interna junto do código onde é utilizada.

  • Gato e Estômago -- gatos e estômagos (várias configurações) (exemplo antigo -- ver iteradores acima)

Carros e Motores

Os exemplos de carros e motores apresentam casos em que existe herança, tanto nas classes externas, como nas classes internas e casos mistos. Note-se que alguns destes casos não são "normais" e apenas se apresentam para evidenciar consequências relativas à programação com classes internas e herança.

Exercícios