Curso Java - Básico - Aula 6

Classes, Interfaces e Pacotes

  • Classe é o elemento fundamental de Java. Ela engloba objetos com as mesmas características e comportamento.
  • Uma inteface provê um conjunto bem definido de métodos a um conjunto de interfaces.
  • Um pacote é um mecanismo de agrupamento de classes e interfaces relacionadas, cujo principal objetivo é controlar a visibilidade dos mesmos.

Classes Topo e Internas (1)

  • Classe Topo é aquela definida como membro direto de um determinado pacote.
  • Classe Interna (Inner Class) é declarada dentro de uma classe da qual ela também é membro.

Classes Topo e Internas (2)

  • Classe Interna, ou Inner Class:
  • É invisível para todas as outras classes, o que resulta em uma despreocupação de conflitos de nome entre elas.
  • Existem três tipos de Classes Internas :
    • Classe Membro
    • Classe Local
    • Classe Anônima

Classes Topo e Internas (3)

  • Exemplo de declaração de uma classe interna:

    ./images/classesinternas.jpg

Classes Topo e Internas (4)

  • Classe Topo (ou Nível Superior) :
  • Não tem acesso direto as variáveis de instância de outra classe qualquer.
  • Define dois tipos de classe.
    • Classes que pertencem ao um pacote
    • Classes aninhadas de nível superior
  • Classes aninhadas de nível superior são definidas como membros estáticos de outra classe de nível superior.

Classes Internas: Escopo e Acesso

  • Ao contrário das classes "comuns", as classes internas podem ser declaradas como private ou protected. É claro pensar dessa maneira, já que as classes internas são membros de uma outra classe.
  • Apesar de não ser a maneira mais usual de se trabalhar com classes internas, pode-se criá-las dentro de um método ou até mesmo em um escopo arbitrário dentro do mesmo.

Classes Internas Estáticas (1)

  • Mudanças de Comportamento
  • Não é mais necessário um objeto da classe externa para criar um objeto na classe interna estática.
  • Não é mais possível acessar objetos da classe externa através de outro da classe interna estática.
  • Restrições
    • Classes internas não podem conter dados estáticos ou classes internas estáticas.
  • Subclasses de uma classe interna estática também tem que ser declaradas como classes internas estáticas.

Classes Internas Estáticas (2)

  • Exemplo de declaração de Classe Interna Estática

    ./images/classesinternas2.jpg

Classes Internas: Locais e Anônimas (1)

  • Classe Interna Local
  • Tipicamente classes internas locais são definidas em meio a um método, mas também podem ser definidas em construtores estáticos ou de instância de uma classe.
  • São características de classes locais
    • são visíveis e usáveis apenas no escopo do bloco aonde foram definidas
    • podem usar quaisquer variáveis, ou parâmetros de métodos finais, que sejam visíveis dentro do escopo de onde foram definidas.

Classes Internas: Locais e Anônimas (2)

  • Classe Interna Anônima
  • É essencialmente uma classe interna local que não possui nome e duas restrições a mais do que as classes locais.
  • As duas restrições adicionais das classes anônimas são:
    • não possui construtores.
    • apenas uma instância da classe é criada

Classes Internas: Locais e Anônimas (3)

  • Exemplo de Classe Anônima:

    ./images/classesinternas3.jpg

Padrões de Projeto

  • O simples uso da OO não garante que obtenhamos sistemas confiáveis, robustos, extensíveis e reutilizáveis.
  • Reusabilidade real não se obtém de técnicas de cut & paste nem do simples reaproveitamento de módulos de software.
  • Padrões de Projeto descrevem e justificam boas soluções para problemas concretos e bem definidos.

Resultados da Utilização de Padrões de Projeto

  • Permitem compartilhar experiências bem sucedidas na resolução de problemas recorrentes.
  • Permitem que os desenvolvedores concentrem seus esforços nos aspectos inéditos do problema.
  • Compõem um vocabulário de alto nível para discussão de questões relativas ao projeto de sistemas de software.

Padrão de Projetos: Singleton (1)

  • Garante que para uma classe específica só possa existir uma única instância, a qual é acessível de forma global e uniforme.
  • A classe Singleton deve:
    • armazenar a única instância existente;
    • garante que apenas uma instância será criada;
    • provê acesso a tal instância.
  • Quando usar
    • Há casos em que é necessário ter certeza de que existe uma única instância de uma classe. Por exemplo, um sistema operacional só pode possuir um gerenciador de janelas ou um único "spooler" de impressão.

Padrão de Projetos: Singleton (2)

  • Declaração genérica de uma classe Singleton

    ./images/singleton.jpg

Padrão de Projeto Iterator

  • Provê uma forma de percorrermos os elementos de uma coleção sem violar o seu encapsulamento.
  • Toda coleção possui uma representação interna para o armazenamento e organização de seus elementos .
  • O Iterator mantém separadas as responsabilidades de navegação por tais elementos.

Padrão de Projeto Observer

  • Define uma dependência de um-pra-muitos entre objetos.
  • Dessa forma, quando um objeto muda de estado, todas as suas dependências são notificadas e atualizadas automaticamente.
  • Quando usar
    • Uma abstração tem dois aspectos, um depende do outro. Encapsulando esses aspectos em objetos separados fará com que se possa variá-los e reusá-los independentemente.
    • Uma mudança em um objeto requer uma mudança em outros, e não se sabe como esses outros objetos efetivamente fazem essas mudanças.
    • Um objeto deve poder notificar outros objetos sem assumir nada sobre eles. Dessa forma evita-se que os objetos envolvidos fiquem fortemente acoplados.

Padrão de Projetos Adapter (1)

  • Quando usar
    • Este padrão é usado quando se deseja fazer com que classes não relacionadas trabalhem juntas.
    • Exemplo de utilização do Adapter
  • Um inconveniente em Java é o fato das janelas não fecharem automaticamente quando o botão "Close", ou a opção "Exit" do menu são acionado. Existem algumas soluções para resolver este problema, mas as mais adequadas são as que se utilizam do conceito do padrão de projeto Adapter. Existem duas soluções simples e compactas utilizando o Adapter, que serão apresentadas:

Padrão de Projetos Adapter (2)

  • 1) A classe WindowAdapter apenas reescreve o evento windowClosing e insere o código de saída apropriado.
  • Usando a classe WindowAdapter

    ./images/adapter1.jpg

Padrão de Projetos Adapter (3)

./images/adapter2.jpg

  • 2) Essa segunda solução utiliza o conceito de classe interna anônima. Ela é muito mais compacta do que a primeira, porém menos intuitiva:

    ./images/adapter3.jpg

Padrão de Projetos Adapter (4): As classes empacotadoras (wrappers)

  • Classes que servem para embutir tipos primitivos para que possam ser manipulados como objetos
  • Exemplo:
    • Um vetor de tipos Object pode conter qualquer objeto mas não tipos primitivos

      ./images/adapter4.jpg

    • Solução: colocar os tipos dentro de wrappers

      ./images/adapter5.jpg

  • Construtores aceitam literais ou Strings
  • Há métodos para realizar conversões entre tipos e de tipos para Strings e vice-versa

Classes empacotadoras

./images/wrappers.jpg

  • Criação e conversão

    ./images/conversao1.jpg

  • Para conversão de String em tipos primitivos

    ./images/conversao2.jpg

É q