Beruflich Dokumente
Kultur Dokumente
1. Introdução
Java é uma linguagem de programação que, diferente de smalltalk por exemplo, não prende
você a uma IDE (Integrated Development Environment ou Ambiente de Desenvolvimento
Integrado). É possível programar em java usando apenas um editor de texto para a escrita do código
e o console para a compilação e execução do mesmo.
Mas devido a grande quantidade de comandos, nomes de classes, nomes de métodos, etc.
fica difícil para o programador de java, dependendo da complexidade do problema, fazer um bom
uso da linguagem sem uma boa IDE. Um exemplo simples disso é a criação de interfaces gráficas
complexas para aplicações em desktop, onde tornase uma atividade extremamente exaustiva caso
você não utilize alguma ferramente o auxilie.
Esse tutorial tem como objetivo explicar algumas funcionalidades do Java que muitos
programadores podem não conhecer. O importante de se conhecer e fazer um bom uso dessas
funcionalidades é que elas podem ser úteis para o entendimento do código (caso você esteja
trabalhando com códigos que outras pessoas ajudaram a construir) e também para um bom
refatoramento. Estaremos trabalhando com o Netbeans, mas todos os procedimentos podem ser
feitos exatamente da mesma maneira no Eclipse.
2. Iterators.
Iterators são objetos que permitem que você percorra todos os elementos de uma coleção em
sequência. Para compreender melhor faça o seguinte: Abra o netbeans e faça uma declaração
simples de uma List e instanciandoa como ArrayList dentro de um método qualquer.
Agora podemos instanciar nosso iterator. Logo em baixo da declaração digite “for” e de um
ctrl+espaço.
Será apresentado um conjunto de opções diferentes que podem ser realizados com o
comando “for”. Selecione a segunda opção e aperte enter. O Netbeans deverá construir corretamente
o iterator baseado na sua declaração da lista.
Iterator it = lista.iterator(); Este comando é responsável por criar um novo iterator a partir
de um iterator fornecido pela lista. Objetos do tipo collection normalmente fornecem seus iterators
a partir do metodo iterator().
it.hasNext(); Retorna true se o próximo objeto da lista for diferente de null, caso contrário
retorna false.
Object object = it.next(); Neste comando é criado uma referência para o próximo objeto da
lista fornecido pelo it.next().
Obs. Os exemplos mostrados foram apenas para ilustração, para a execução correta do código é
necessário adicionar elementos dentro da lista através do método add.
3. ForEach
O foreach é uma outra forma mais simples de percorrer coleções fazendo uso do “:”. A
seguir está dois exemplos de uso do foreach, um usando coleção e outro usando array.
Para um melhor entendimento devese ler o “:” como “em”. No exemplo for(int i : a) é como
se estivéssemos dizendo “para cada inteiro i em a faça”.
4. Generics.
O generics tornouse disponível a partir do JDK 1.5 do java e iremos dar uma breve
explicação no seu conceito e uso.
Veja o trecho a seguir:
Na linha 1 estamos instanciando uma “listaDeInteiros” e na linha 2 adicionando um novo
objeto do tipo Integer com o valor de 1. Perceba que na 3ª linha ao buscarmos esse objeto através do
listaDeInteiros.iterator().next() precisamos fazer um cast utilizando o “(Integer)” para podermos
atribuir esse objeto à referência “x”. Um cast nada mais é que um comando para converter um
objeto Java de um tipo para outro.
O cast é essencial porque o compilador pode garantir apenas que um objeto irá ser retornado
pelo iterator. Um modo melhor para realizar essa tarefa é marcar a lista com um tipo específico de
valores. Essa é a ideia principal dos generics. A seguir está o código anterior agora fazendo uso do
generics:
Perceba agora que definimos a nossa lista como sendo uma List de inteiros “List<Integer>”
e perceba que agora o cast é desnecessário. Agora o compilador pode checar em tempo de
compilação a exatidão do tipo.
É importante entender também que muitos outros recursos do java além das Collections
também fazem uso de generics até mesmo a classe Class. Vamos ver um exemplo um pouco mais
avançado:
4.1. Outras utilizações
Iremos utilizar neste exemplo o conceito de persistência de dados aonde iremos criar um
CRUD baseado em generics em que precisamos persistir um determinado objeto.
Estamos tentando salvar um novo objeto do tipo cliente e do tipo gerente usando o método
save() existente na classe GenericCRUD. Vamos ver agora como está estruturado esse método
save().
O método save() nada mais é do que um método genérico, ele irá “descobrir” o valor de T
baseado no valor de seu parâmetro.
O “T” nada mais é do que nosso tipo genérico, o seu valor é definido pelo valor do
parâmetro do método. Também seria possível especificar o “<T>” na declaração da classe da
seguinte maneira:
Como primeiramente enviamos um “new Cliente()” o valor de T será assimilado como um
objeto do tipo Cliente, a mesma coisa irá acontecer com o objeto Gerente. Ou seja, o valor de T é
definido pelo parâmetro do método. O valor de T será então agora passado para o método save() da
classe ObjectSUDI, esse método está estruturado da seguinte maneira:
Como parâmetro temos que receber um Object, pois é seguro dizer que todo T é também um
objeto, se tentássemos definir um Integer como parâmetro deste método, por exemplo, um erro de
compilação irá ocorrer.
4.2. Curingas
Uma outra possibilidade de uso no generics é o uso do curinga. No java o “?” é o chamado
tipo desconhecido e podemos usálo da seguinte maneira: “Collection<?>” (Lêse collection of
unknown ou collection de desconhecido). Para mostrar o uso desse recurso vamos criar um método
para mostrar todos os elementos de uma coleção:
Embora estejamos definindo o tipo da coleção como de Object, estamos restringindo todas
as coleções permitindo apenas uma coleção de objetos. Qualquer coleção de outro tipo irá dar erro
de compilação. Para resolver esse problema, iremos fazer uso do curinga. O método irá ficar da
seguinte maneira:
Desta maneira estamos permitindo como parâmetro uma coleção de qualquer tipo, veja um
exemplo de todo o código utilizando esse método.
Dessa maneira, o método printColecao irá ser capaz de imprimir qualquer tipo de coleção
fornecida.
4.3. Definindo limites
Com o generics é possível definir limites para as classes que podem ser usadas utilizando o
extends e o super. Por exemplo:
• <? extends T>
Aceita T e todos os seus descendentes
Ex: se T for Collection, aceita List, Set, ArrayList, etc. (poderia também ser usado o
<T extends Collection>)
• <? super T>
Aceita T e todos os seus ascendentes
– Ex: se T for ArrayList, aceita List, Collection, Object.
5. Classes Anônimas.
Uma classe anônima em java basicamente é uma classe sem nome, devido a essa
característica você só pode usála uma vez no local da declaração. As classes anônimas sempre
implementam uma interface ou herdam de alguma classe e não possuem seus próprios construtores,
elas utilizam o da classe a qual está herdando. Caso a classe anônima esteja implementando uma
interface um construtor sem parâmetros será herdado de Object.
A seguir está um exemplo de código utilizando uma classe anônima
Neste caso a classe anônima implementa a interface Interface para poder fazer uso do
método saudacao(). As classes anônimas também são usadas para controle de eventos no Java, você
consegue ver seu uso em eventos de um jButton por exemplo.
Neste caso é definida a addActionListener() do jButton1, onde é criada uma classe anônima
que implementa a interface ActionEvent. O método actionPerformed(java.awt.event.ActionEvent
evt) é implementado chamando o método responsável pela ação do botão.
6. Reflexão em java.
Reflexão basicamente é a capacidade de um programa de investigar fatos sobre si próprio.
Um objeto pode, por exemplo, ter conhecimento de quais métodos um outro objeto possui.
Toda classe Java que tem alguma instância existe na memória na forma de uma instância da
classe Class. Essas instâncias contêm todas as informações de uma classe seu nome, dados,
métodos, etc além de métodos para recuperar essas informações. Há três formas de obtermos
instâncias da classe Class:
1. Usando o método getClass() em um objeto qualquer:
Class class = r.getClass();
2. Usando o sufixo .class em uma classe conhecida:
Class class = java.io.FileReader.class;
3. Usando o método estático Class.forName(String nome):
Class class = Class.forName(stringComNomeDaClasse);
De posse de um objeto do tipo Class podemos chamar os seguintes métodos para obter mais
informações sobre a classe (a lista a seguir é apenas um pequeno subconjunto dos métodos da classe
Class):
• String getName() retorna o nome da classe
• Object newInstance() retorna um novo objeto que é instância da classe
• Method[] getMethods() retorna uma lista de objetos da classe Method, representando os
métodos da classe
• Field[] getFields() retorna uma lista de objetos da classe Field, representando os campos da
classe
• Method getMethod(nome, tipos dos parâmetros) retorna o método que tem o nome e
parâmetros dados, se existir.
A seguir está um exemplo de código que imprime na tela todos os métodos de uma
determinada classe.
7. Referências Bibliográficas
http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html
http://java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html
http://java.sun.com/docs/books/tutorial/extra/generics/wildcards.html
http://java.sun.com/j2se/1.5/pdf/genericstutorial.pdf
http://littletutorials.com/2008/03/09/anonymousinnerclasses/
http://www.inf.pucminas.br/professores/torsten/aulas/aula13.html