Escolar Documentos
Profissional Documentos
Cultura Documentos
GRADUAÇÃO
Unicesumar
Reitor
Wilson de Matos Silva
Vice-Reitor
Wilson de Matos Silva Filho
Pró-Reitor Executivo de EAD
William Victor Kendrick de Matos Silva
Pró-Reitor de Ensino de EAD
Janes Fidélis Tomelin
Presidente da Mantenedora
Cláudio Ferdinandi
PROGRAMAÇÃO II
SEJA BEM-VINDO(A)!
Prezado(a) acadêmico(a), é com grande satisfação que apresento a você o livro de Pro-
gramação em Java II. Este material foi elaborado com o objetivo de contribuir em sua
formação, especialmente a de desenvolvedor(a) de software. Sou o professor Edson A.
Oliveira Junior, autor deste material. Você pode ter certeza que este material foi prepara-
do com carinho especial para que você possa entender o que essa disciplina pode te tra-
zer de benefício ao longo de sua vida como desenvolvedor(a) e/ou analista de sistemas.
Inicialmente, como você já deve ter lido e exercitado todos os conceitos básicos de Java
no livro Programação em Java I, este livro abordará conceitos mais avançados de orien-
tação a objetos como sobrecarga em Java, que é diferente da sobreposição que estuda-
mos no livro I. A sobreposição permite redefir o comportamento (implementação) de
um método que foi herdado, possibilitando que a subclasse possua os dois comporta-
mentos: o herdado e o implementado. Já a sobrecarga permite que você use um mes-
mo identificador (nome) para métodos e construtores de uma mesma classe, mudando
somente a assinatura destes, além de tratamento de exceções.
A Unidade II abordará classes abstratas e interfaces. As classes abstratas podem possuir
métodos concretos (com implementação) e métodos abstratos (somente a assinatu-
ra) sem fornecer uma implementação padrão. As subclasses concretas de uma classe
concreta devem implementar os métodos concretos. Esta é uma forma de garantir que
o método será implementado de acordo com a classe a qual se destina. Já interfaces
possuem somente métodos abstratos, porém não fornecem suporte à característica de
herança.
Na Unidade III, você entenderá os elementos essenciais para se trabalhar com vários
objetos de uma mesma classe ao mesmo tempo: arrays e coleções Java. Existem vários
tipos de coleções, cada uma com um propósito e um conjunto de características pró-
prias que são usadas em diversas situações diferentes.
A Unidade IV abordará a criação de interfaces gráficas desktop por meio das API AWT
e Swing. Interfaces gráficas em Java envolvem o projeto e a construção de layouts para
que os elementos gráficos de interação (botões, caixas, campos etc.) possam ser acomo-
dados. Interfaces gráficas não podem dispensar o tratamento de exceções, caracteriza-
das por interrupções abruptas da execução de código Java, sem que o usuário possa ter
a chance de interagir com o programa. Para tanto, isolamos esses códigos permitindo
que o programa Java não seja simplemente abortado sem uma justificativa.
APRESENTAÇÃO
UNIDADE I
SOBRECARGA E EXCEÇÕES
17 Introdução
18 Sobrecarga de Métodos
18 Exemplos de Sobrecarga
23 Conversões Implícitas
27 Tratamento de Exceções
28 Captura de Exceções
30 Definindo Exceções
31 Hierarquia de Exceções
34 Considerações Finais
SUMÁRIO
UNIDADE II
41 Introdução
66 Considerações Finais
11
SUMÁRIO
UNIDADE III
ARRAYS E COLEÇÕES
73 Introdução
73 Entendendo um Array
79 Inicializando Arrays
93 A Interface List
98 A Interface Set
UNIDADE IV
115 Introdução
UNIDADE V
141 Introdução
190 CONCLUSÃO
191 GABARITO
198 REFERÊNCIAS
199 ANOTAÇÕES
Professor Dr. Edson A. Oliveira Junior
Professor Me. André Abdala Noel
I
UNIDADE
SOBRECARGA E EXCEÇÕES
Objetivos de Aprendizagem
■■ Criar códigos com métodos que utilizam conceitos de sobreposição e
sobrecarga.
Plano de Estudo
A seguir, apresentam-se os tópicos que você estudará nesta unidade:
■■ Sobrecarga de métodos
■■ Exemplos de Sobrecarga
■■ Conversões implícitas
■■ Construtores com sobrecarga
■■ Tratamento de exceções
■■ Captura de Exceções
■■ Definindo Exceções
■■ Hierarquia de Exceções
■■ Declaração de Exceções e Interface Pública
17
INTRODUÇÃO
Introdução
I
SOBRECARGA DE MÉTODOS
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
O recurso oferecido pela sobrecarga vai nos ajudar muito, pois podemos tra-
balhar métodos com mesmo nome, mas de várias formas diferentes sem perder o
sentido do que o método se propõe a oferecer. Como na figura anterior, imagine
a seguinte situação: seu sistema precisa fazer um cadastro de cliente, em que este
pode tanto ser uma pessoa física como uma pessoa jurídica. Se for pessoa física,
o sistema irá fazer uma validação de CPF no momento em que é preenchido o
cadastro; mas caso nosso cliente seja pessoa jurídica, o sistema irá fazer uma
validação de CNPJ. Tanto o CPF quanto o CNPJ são campos que têm a mesma
função, só que um se refere à pessoa física e a outra a jurídica. Podemos criar
dois métodos com o mesmo nome, mas que possuem parâmetros de entrada
diferente e podemos fazer a chamada do método com o mesmo nome, só que,
em um momento, passaremos um CPF para ser validado e, em outro, passare-
mos um CNPJ para ser validado.
EXEMPLOS DE SOBRECARGA
SOBRECARGA E EXCEÇÕES
19
criaremos outro método com o mesmo nome, mas vamos passar três números
para serem verificados dentre os três quem é o maior.
Veja como ficou nossa classe ExemplosSobreCarga():
Quadro 1 - Classe com exemplo de sobrecarga
Exemplos de Sobrecarga
I
import javax.swing.JOptionPane;
import main.ExemplosSobrecarga;
public class TestaSobreCarga {
public static void main(String[] args) {
double n1,n2,n3,maior;
//testando o primeiro metodo
n1 = Double.parseDouble(JOptionPane.showInputDialog(
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
"Digite o primeiro numero:"));
n2 = Double.parseDouble(JOptionPane.showInputDialog(
"Digite o segundo numero:"));
SOBRECARGA E EXCEÇÕES
21
Executando esse nosso código, podemos ver claramente que temos a utilização
de um método que verifica o maior número, só que de duas formas diferentes:
no primeiro, passamos dois números para serem verificados; no segundo, pas-
samos três números para serem verificados. Os dois métodos contêm o mesmo
nome, mas com parâmetros de entrada diferente. Este é um exemplo bem sim-
ples de sobrecarga.
Caro(a) aluno(a), podemos também perceber que os parâmetros de entrada
podem diferenciar-se somente pelo tipo de dados que estamos passando para o
método. Como exemplo, vamos criar uma classe chamada SegundoExemplo.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Exemplos de Sobrecarga
I
import javax.swing.JOptionPane;
public class TestaDdd {
public static void main(String[] args) {
//criamos aqui duas variaveis para ddd uma int oura
string
int ddd;
String strDdd;
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
//vamos ler aqui a variavel ddd que é integer
ddd = Integer.parseInt(JOptionPane.showInputDialog(
"Digite o ddd de sua cidade:") );
//vamos ler aqui a variavel ddd que é string
strDdd = JOptionPane.showInputDialog("Digite o ddd de sua
cidade:");
Portanto, executando nosso código, vamos concluir que podemos criar méto-
dos com mesmo nome e até os nomes dos parâmetros de entrada iguais, nomes
e quantidade, tendo apenas o tipo de dados diferente. Assim como no exemplo
anterior, nós podemos usar o método retornaDddMascara(), passando tanto
um DDD do tipo int como um DDD do tipo String, o sentido de utilização do
método é o mesmo, mas em várias situações no dia a dia de nossa programa-
ção, teremos casos desse gênero, em que um mesmo método que se comporta
da mesma forma pode receber o mesmo valor de entrada só que com tipos de
dados diferentes.
SOBRECARGA E EXCEÇÕES
23
CONVERSÕES IMPLÍCITAS
Conversões Implícitas
I
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Cliente com um construtor vazio, veja:
Quadro 7 - Classe para exemplificar construtores sem sobrecarga
Agora vejamos como fica nossa classe que instancia a classe Cliente. Vamos dar
o nome a ela de TestaCliente:
Quadro 8 - Classe com método main para testar construtores sem sobrecarga
SOBRECARGA E EXCEÇÕES
25
Caro(a) aluno(a), veja que quando fazemos isso, nossos atributos do objeto c1
estão nulos, ou seja, ainda sem valor; agora, imagine a seguinte situação: se nós,
já no momento em que vamos instanciar o objeto c1, precisarmos passar valo-
res para os atributos, como faríamos isto? É ai que podemos usar a sobrecarga
com os construtores, pois podemos já criar um objeto e iniciar os atributos com
valores já no momento de instanciar. Se usarmos a sobrecarga, podemos ins-
tanciar o objeto das duas formas diferentes, passando valores iniciais ou não
passando valores iniciais.
Veja como ficou nossa classe Cliente:
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
import javax.swing.JOptionPane;
public class TestaCliente {
public static void main(String[] args) {
//criamos aqui os atributos a serem lidos
//referente ao cliente 1 e cliente 2
int codigo;
String nome;
String cpf;
String endereco;
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
//aqui lemos os valores dos atributos pelo usuario
//referente ao primeiro cliente
codigo = Integer.parseInt(JOptionPane.
showInputDialog(
"Digite o codigo do primeiro cliente:"));
nome = JOptionPane.showInputDialog(
"Digite o nome do primeiro cliente");
cpf = JOptionPane.showInputDialog(
"Digite o cpf do primeiro cliente");
endereco = JOptionPane.showInputDialog(
"Digite o endereço do primeiro cliente");
//criamos um objeto do tipo cliente e usamos um
//construtor vazio, passamos os valores para
//os atributos depois dele instanciado
Cliente c1 = new Cliente();
c1.codigo = codigo;
c1.nome = nome;
c1.cpf = cpf;
c1.endereco = endereco;
//aqui lemos os valores dos atributos pelo usuaio
//referente ao segundo cliente
codigo = Integer.parseInt(JOptionPane.
showInputDialog(
"Digite o codigo do segundo cliente:"));
nome = JOptionPane.showInputDialog(
"Digite o nome do segundo cliente");
cpf = JOptionPane.showInputDialog(
"Digite o cpf do segundo cliente");
endereco = JOptionPane.showInputDialog(
"Digite o endereço do segundo cliente");
//aqui então instanciamos o objeto passando para
//o construtor os valores dos atributos já neste
//momento
Cliente c2 = new Cliente(codigo,nome,cpf,endereco);
}
}
SOBRECARGA E EXCEÇÕES
27
Caro(a) aluno(a), veja que a sobrecarga em construtores é muito útil e que nos
oferece uma facilidade muito grande para a flexibilidade na utilização de passagem
de valores dos atributos. Muitas vezes, objetos de uma mesma classe necessitam
de serem utilizados de formas diferentes. Em alguns momentos, precisamos pas-
sar valor para os atributos já no momento de instanciar o objeto; já em outros,
não temos essa informação e precisamos passar valores para os atributos depois,
se criarmos somente um construtor que inicializa os atributos quando execu-
tado, ficamos sempre obrigados a passar os valores nesse momento de criação do
objeto; caso usamos a sobrecarga, temos a flexibilidade de utilizar as duas formas.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
TRATAMENTO DE EXCEÇÕES
Quando um evento excepcional ocorre em Java, diz-se que uma exceção será
lançada. O código que é responsável por fazer algo com a exceção é chamado de
manipulador de exceções; ele captura a exceção lançada.
Uma exceção é uma ocorrência que altera o fluxo normal do programa. Ela
pode ocorrer por diversos motivos, incluindo os seguintes:
■■ Um usuário encontrou dados inválidos.
■■ Um arquivo que precisa ser aberto não pode ser encontrado.
■■ A conexão de rede foi perdida no meio de comunicação, ou a JVM está
sem memória.
■■ Falhas no Hardware.
■■ Exaustão de recursos.
Tratamento de Exceções
I
CAPTURA DE EXCEÇÕES
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
palavras-chaves try e catch.
TRY / CATCH
Esta é a forma mais usada. O Código dentro de um bloco try / catch é chamado
de código protegidos. Quando uma exceção é capturada, temos de dar trata-
mento à exceção, ou seja, temos de ter um plano de contingência para resolver
o problema que ela significa. Podemos declarar mais do que um bloco catch. Isso
é importante porque podemos ter vários tipos diferentes de exceção sendo lan-
çados e necessitar de um tratamento específico para cada um.
SOBRECARGA E EXCEÇÕES
29
ou seja, no nosso exemplo, fora do bloco try / catch, e continuará daí em diante.
Porém, se entre a linha 18 a 19 (o bloco try) uma exceção do tipo Exception for
lançada, a execução será imediatamente transferida para a linha 21. Em seguida,
as linhas 21 a 23 serão processadas para que todo o bloco catch seja executado e
depois o processamento passará para a linha 25 e dará seguimento ao programa.
USANDO FINALLY
Captura de Exceções
I
DEFININDO EXCEÇÕES
Discutimos as exceções como um conceito. Sabemos que elas são lançadas quando
um problema de algum tipo ocorre e que efeito terá sobre o fluxo de seu pro-
grama. Dissemos que a exceção é uma ocorrência que altera o fluxo normal do
programa. Toda exceção é a instância de uma classe que possui a classe Exception
em sua hierarquia de herança.
Quando uma exceção é lançada, o objeto de um subtipo Exception especí-
fico é instanciado e inserido no manipulador de exceções como um argumento
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
para a cláusula catch. Veja a seguir um exemplo:
SOBRECARGA E EXCEÇÕES
31
HIERARQUIA DE EXCEÇÕES
Todas as classes de exceções são subtipos da classe Exception. Essa classe é deri-
vada da classe Throwable (que é derivada da classe Object).
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Hierarquia de Exceções
I
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
código ou no ambiente de execução. Ex.: (OutOfMemoryError) quando o pro-
grama precisa de mais memória e (StackOverflowError ) que acontece quando
a pilha estoura, por exemplo, quando um método chama a si mesmo sem nunca
retornar.
THROWS / THROW:
Como saberemos que um método lançará uma exceção que teremos de capturar?
Da mesma forma que um método precisa especificar que tipo, quantos argu-
mentos aceitará e o que será retornado. As exceções que um método pode lançar
devem ser declaradas (a menos que sejam subclasses de RuntimeException). A
lista de exceções lançadas faz parte da interface pública de um método. A pala-
vra-chave throws é usada na forma descrita, a seguir, para listar exceções que
um método pode lançar:
SOBRECARGA E EXCEÇÕES
33
Esse método é um tipo de retorno void, que não aceita argumentos e declara
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
CONSIDERAÇÕES FINAIS
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
ticado de manipulação de exceções. A manipulação de exceções permite que
você isole seu código de correção de erros em blocos separados, de modo que o
código principal não fique confuso por causa dele. Outro recurso interessante
permite que você manipule erros semelhantes com um único bloco de manipu-
lações de erros, sem a duplicação de código.
Você aprendeu que a palavra-chave try da linguagem Java é usada para espe-
cificar uma região protegida – um bloco de código no qual os problemas podem
ser detectados. O bloco finally não é obrigatório, mas se houver um terá de vir
após o bloco catch.
SOBRECARGA E EXCEÇÕES
35
1. Crie uma classe chamada ValidaImpostos e nela coloque dois métodos cha-
mados calculaImpostos, só que um método receberá um double valor e
uma String imposto, e o outro método receberá somente uma String im-
posto. O método que recebe apenas a String imposto verifica se o conteúdo
da String é “INSS” ou “IR”. Se for o primeiro, retorna “8”, se for o segundo
retorna “20”. O método que recebe um valor e mais a String imposto calcula
o valor de imposto pelo valor recebido, por exemplo, se chamar o método
calculaImpostos(100.00, ‘INSS’), o retorno será “8.00”.
1. System.out.print (“Inicio”);
2. try{
3. System.out.print (“ola_mundo”);
5. }
6. System.out.print (“capturar_aqui”);
8. System.out.print (“fim_da_exceção_do_arquivo”);
9. }
12. }
Sabendo-se que tanto o EOFException quanto FileNotFoundException são
subclasses de IOException e presumindo que esse bloco de código seja in-
serido em uma classe, que declaração estará mais perto da verdade com re-
lação a esse código?
a. O código não será compilado.
try {
} catch (Exception e) {
} catch (ArithmeticException a) {
}
MATERIAL COMPLEMENTAR
Material Complementar
Professor Dr. Edson A. Oliveira Junior
CLASSES ABSTRATAS E
II
UNIDADE
INTERFACES
Objetivos de Aprendizagem
■■ Entender o que é a classe Abstrata.
■■ Entender o que é Interface.
Plano de Estudo
A seguir, apresentam-se os tópicos que você estudará nesta unidade:
■■ O que é classe abstrata
■■ Modelando um projeto com classes abstratas
■■ Implementando um projeto com classes abstratas
■■ Regras sobre classes e métodos abstratos
■■ O que são Interfaces
■■ Modelando um Projeto com Interfaces
■■ Implementando um projeto com Interfaces
■■ Comparando Interfaces e Classes Abstratas
41
INTRODUÇÃO
Caro(a) aluno(a), nesta unidade iremos compreender o que são classes abstra-
tas e interfaces e implementar um simples sistema para cada tópico analisado.
O objetivo é elucidar as dúvidas referentes a esses dois conceitos importantes.
A finalidade de uma classe abstrata é a de funcionar como um modelo para
as subclasses. Ao contrário de interfaces, classes abstratas podem conter campos
(atributos) que não são static e final, e elas podem conter métodos não abs-
tratos implementados. Tais classes abstratas são semelhantes às interfaces, exceto
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Introdução
II
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Figura 8: Classe Abstrata
Note que esses métodos não têm uma implementação, isto é, não possuem um
corpo delimitado por chaves contendo qualquer código.
Uma classe também pode ser declarada abstrata mesmo que tenha um
método não abstrato, ou a combinação de métodos abstratos e não abstratos.
Veja exemplo abaixo:
É importante lembrar que uma classe abstrata que herda de outra classe
abstrata não precisará fornecer implementação de todos os métodos abstratos
herdados.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Primeiramente, vamos criar um projeto no NetBeans IDE 7.3 chamado locadora-
Abstrata; desmarque o campo Criar Classe Principal. Em seguida, crie uma classe
nova com o nome ItemAbstrato e coloque como nome do pacote locadora.
Agora que temos nossa classe, insira a palavra abstract antes de class
ItemAbstrato e também os seguintes atributos e métodos abstratos da figura
abaixo após isso gere os respectivos gets e sets dos atributos:
Observe que nossa classe ItemAbstrato apresenta a definição de uma classe abs-
trata que representa um item de uma locadora. Nessa classe definimos atributos
e métodos comuns a um Dvd, Cd. Como a nossa intenção é analisar o compor-
tamento de classes abstratas não será implementado aqui todos os atributos e
objetos que poderiam existir em uma locadora real, mas sim o elementar para
compreendermos quando devemos usar classes abstratas.
Agora vamos criar outra classe chamada Dvd que irá herdar a classe ItemAbstrato.
Para isso basta acrescentar a palavra-chave extends e logo após o nome da
classe que desejamos herdar os métodos e atributos, no caso, ItemAbstrato. Veja
a figura abaixo como ficou nossa classe:
Observe na figura acima que o NetBeans IDE faz uma marcação no nome da classe
Dvd indicando que devemos implementar os métodos da classe pai, ItemAbstrato,
para isso basta posicionar o ponteiro do mouse sobre o nome da classe e pres-
sionar as teclas alt+enter para abrir o menu que implementará todos os métodos
automaticamente ou você pode utilizar o alt+insert e selecionar quais métodos
você deseja implementar. Lembrando que uma classe não é obrigada a imple-
mentar todos os métodos abstratos da classe pai.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Figura 14: Classe Dvd
Após gerar os métodos a nossa classe Dvd ficará igual a figura abaixo:
Observe que foi gerado todos os métodos abstratos da classe ItemAbstrato. Caso
o NetBeans IDE gere automaticamente um código para cada método basta ignorá-
-los deletando ou apenas comentando. Note que foi gerado uma anotação acima
dos métodos: @Override. Embora não seja necessário usar esta anotação reco-
mendo que use, pois você terá a vantagem do compilador verificar algum erro
de ortografia e/ou erro na combinação dos parâmetros no método da classe pai
e também tornará seu código mais fácil de ser compreendido.
Agora é necessário implementar o código de cada método. Como o nosso
objetivo é o estudo das classes abstratas aqui, iremos simplificar o código. Veja
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Agora, vamos criar mais uma classe chamada Cds e vamos estender da classe
Dvd conforme pode ser visto na figura abaixo:
Observe que dessa vez o NetBeans não destacou o nome da Classe forçando a
implementação dos métodos da classe herdada, pois a classe herdada não é uma
classe abstrata como o é a classe ItemAbstrato. Porém, assim como a classe Dvd
que herda diretamente da classe abstrata, a classe Cds passa a poder reutilizar
todos os atributos e métodos da classe ItemAbstrato e Dvd, como também defi-
nir suas particularidades e usá-las.
Alguns pontos interessantes das imagens acima exemplificam algumas das regras
de criação de classe e métodos abstratos que são:
■■ Os métodos construtores não podem ser declarados como abstratos.
Mesmo que a classe abstrata não possa ser instanciada, seus construtores
podem inicializar os campos da classe que serão usados por subclasses,
sendo imprescindível em praticamente todos os casos.
■■ Métodos declarados como abstratos não podem ser privados (private).
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
■■ Classes abstratas não podem conter métodos estáticos (static).
■■ Os campos de uma classe abstrata serão herdados pelas classes descen-
dentes e poderão ser usados por instâncias destas a não ser que sejam
declarados como private.
Para finalizar nosso sistema, vamos criar mais uma classe com o método main
chamada Programa. E nela vamos criar um menu e um método de escolha para
que possamos chamar todos os métodos implementados em nosso exemplo. Veja
na figura abaixo o código dessa classe:
Explicando o código
Observe que criamos um laço de repetição com o método while( ) sendo
a condição de parada a variável opcao igual a 0. Fizemos uso também da classe
java.util.Scanner que permite a leitura de dados vindos do teclado. Com
o método switch criamos um menu de opções. Cada opção (case) recebe
uma instância da classe fazendo uso do método getInstance( ). Esse método
não cria um objeto toda vez que ele é chamado e se torna ideal para o nosso
exemplo, pois o nosso objetivo é apenas demonstrar o uso e as chamadas dos
métodos abstratos.
Agora que você já implementou o código acima execute o programa e visu-
alize os resultados na saída do NetBeans IDE.
run
Digite 0 para SAIR ou a opcao abaixo desejada
1- Cadastrar DVD 2- Emprestar DVD 3- Devolver DVD
4- Cadastrar CDs 5- Vender CD 6- Imprimir CDs
Opcao: 1
DVD Cadastrado: - Cod: 1 - Titulo: Senhor dos Aneis - Situacao: L
DVD cadastrado utilizando método abstrato herdado da classe abstrata Item
Abstrato
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Digite 0 para SAIR ou a opcao abaixo desejada:
1- Cadastrar DVD 2- Emprestar DVD 3- Devolver DVD
4- Cadastrar CDs 5- Vender CD 6- Imprimir CDs
Opcao: 2
Dvd Emprestado: - Situacao: E - Data Emprestimo: 10/03/2013
DVD Emprestado utilizando método abstrato herdado da classe abstrata Item
Abstrato
Importante lembrar que o uso de classes abstratas é realizado com classes que tem
métodos e atributos em comum, ou pelo menos a maioria. No nosso exemplo
a mídia DVD possui muito em comum com CDs. Além dos atributos os méto-
dos podem ser utilizados para ambas as classes. O nosso programa de locadora
se limitou a cadastrar e vender os CDs, o que não impediria de colocá-los para
serem alugados assim como os Dvds.
Observe que um método de fabricação estático não é o mesmo que o padrão Fac-
tory Method de Design Patterns [Gamma95, p. 107]. O método de fabricação estáti-
co descrito neste item, não tem equivalente direto com em Design Patterns.
Uma classe pode oferecer a seus clientes métodos de fabricação estáticos ao invés
de, ou além de construtores. O Fornecimento de um método de fabricação estático
em vez de um construtor público apresenta vantagens e desvantagens.
Vantagens (citando o livro):
Uma das vantagens de métodos de fábrica estáticos é que, ao contrário de constru-
tores, eles têm nomes.
Uma segunda vantagem de métodos de fabricação estáticos é que, ao contrário
de construtores, eles não são obrigados a criar um novo objeto sempre que são
chamados.
Uma terceira vantagem de métodos de fabricação estáticos é que, diferente dos
construtores, eles podem retornar um objeto de qualquer subtipo do seu tipo de
retorno.
A quarta vantagem dos métodos de fabricação estáticos é que eles reduzem a ver-
bosidade na criação de instâncias de tipo parametrizadas.
55
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
ações que devem ser obrigatoriamente executadas, mas que cada classe pode
executar de forma diferente.
Na linguagem de programação Java, uma interface é um tipo de referên-
cia, semelhante a uma classe, que pode conter apenas constante, assinaturas de
métodos e tipos aninhados. Não há corpo de método. Interfaces não podem
ser instanciadas, elas só podem ser implementadas por classes ou prorrogado
por outras interfaces. E por que isso? Isso se deve ao fato de que muitos objetos
(classes) podem possuir a mesma ação (método), porém, podem executá-la de
maneira diferente.
Usando um exemplo bem remoto, podemos ter uma interface chamada
marinho que possui a assinatura do método nadar( ). Ou seja, toda classe
que implementar marinho deve dizer como nadar(). Portanto, se eu tenho
uma classe chamada pessoa e outra chamada peixe, ambas implementando a
interface marinho, então, nestas duas classes devemos codificar a forma como
cada um irá nadar( ).
Nesse exemplo não executamos o operador new, por isto temos apenas uma
referência.
■■ Todos os métodos definidos são implicitamente do tipo public ou abs-
tract. Por essa razão, ao declarar um método em uma interface, não é
necessário fornecer a palavra-chave public. Os métodos não podem
ter corpo definido, somente definimos sua assinatura.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
MODELANDO UM PROJETO COM INTERFACES
Essa classe será o nosso objeto para armazenarmos os dados salvos em nosso
cadastro.
Para criar uma interface no NetBeans IDE basta clicar com o botão direito do
mouse sobre o pacote do projeto e no menu escolher Novo > Interface Java... e
adicionar InterfaceBluRay como nome da Interface e clique em Finalizar.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Figura 26: Interface InterfaceBluRay
a figura a seguir:
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Figura 30: Código da Classe Bluray
Para finalizar vamos criar a classe Programa para executar nosso projeto. Confira
na imagem abaixo o código para essa Classe.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Explicando o código
Observe na linha 16 da classe Programa que criamos uma instância da classe
Bluray, chamada objBluray, lembrando que o termo instância e objeto são
sinônimos. A criação do objeto envolve o operador new( ) que foi o utilizado
no código acima. Em seguida, criamos a variável do tipo ItemBluRay cha-
mado objItem.
Na linha 18 criamos o método while( ) que controla a saída ou perma-
nência no programa e logo em seguida instanciamos a variável do tipo objItem
que será responsável por salvar as informações de cada item de Blu-Ray no
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
objeto Bluray.
Utilizamos também a classe Scanner( ) para adquirir todas opções do
menu digitadas pelo usuário.
Observe que por meio do objeto objBluray temos acesso a todos os méto-
dos da classe Bluray. E na linha 40 fazemos uso, pela primeira vez, do atributo
estático que criamos na InterfaceBluRay, lembra? Na linha 41 aproveita-
mos esse recurso para realizar um cálculo de desconto ao cadastrar o Blu-Ray.
Na nossa interface definimos que o valor do desconto seria de 20%. Caso um
dia o desconto mude, basta alterar o valor da variável estática e todos os progra-
mas que fazem uso dela serão atualizados automaticamente.
Pronto! Agora é só executar o programa e visualizar os resultados.
Se você leu a seção sobre classes abstratas, talvez esteja se perguntando por que
os projetistas da linguagem Java se deram ao trabalho de introduzir o conceito
de interfaces? Por que a interface que criamos InterfaceBluRay não pode
ser simplesmente uma classe abstrata?
Há, infelizmente, um sério problema com o uso de uma classe básica abs-
trata para expressar uma propriedade genérica. Uma classe só pode estender
uma única classe. Suponha que a classe Bluray já estenda uma classe diferente,
digamos Midia. Ela então, não poderá estender uma segunda classe. Mas cada
classe pode implementar quantas interfaces quiser.
Outras linguagens de programação, especialmente o C++, permitem que
uma classe tenha mais de uma superclasse. Esse recurso é chamado de Herança
Múltipla. Os projetistas do Java optaram por não dar suporte à herança múlti-
pla, porque ela torna a linguagem muito complexa (como no C++).
Ao invés disso, as interfaces suportam a maioria dos benefícios da herança
múltipla e, ao mesmo tempo, evitam as complexidades e ineficiências.
Abaixo um quadro comparativo para tornar mais fácil a compreensão entre
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
CONSIDERAÇÕES FINAIS
Classes Abstratas
Fonte: <http://www.youtube.com/watch?v=DyrztWb8Ok0>.
Material Complementar
Professor Dr. Edson A. Oliveira Junior
III
UNIDADE
ARRAYS E COLEÇÕES
Objetivos de Aprendizagem
■■ Criar códigos que declarem, inicializem e utilizem arrays.
■■ Estudar algumas das principais Interfaces e Classes do Framework
Collections.
Plano de Estudo
A seguir, apresentam-se os tópicos que você estudará nesta unidade:
■■ Entendendo um Array
■■ Declarando Array de Objetos e de Tipos Primitivos
■■ Construindo Arrays Unidimensionais
■■ Construindo Arrays Multidimensionais
■■ Inicializando Arrays
■■ Passando Arrays para métodos
■■ Exemplos com Arrays
■■ Visão geral das Coleções
■■ A Interface List
■■ A Interface Set
■■ A Interface Map
■■ A Interface Queue
73
INTRODUÇÃO
Caro(a) aluno(a), esta unidade irá abordar dois assuntos fundamentais no que
se refere à estrutura de dados, Arrays e Coleções.
Arrays são estruturas estáticas que consistem em itens de dados de um mesmo
tipo, ou seja, são objetos que armazenam diversas variáveis de um mesmo tipo
primitivo ou de referência a outros objetos. Uma vez criado, um Array mantêm
o mesmo tamanho, por isso são chamados de estáticos, embora seja possível atri-
buí-lo por referência a outro Array de tamanho diferente.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
ENTENDENDO UM ARRAY
Introdução
III
primeira posição de um Array com a posição um, a partir deste momento você
deve ter em mente que o primeiro elemento do Array meu meuArray é meuAr-
ray [ 0 ], o segundo elemento do Array meu meuArray é meuArray
[ 1 ], o quinto elemento do Array meu meuArray é meuArray [ 4 ].
Para fixar melhor esta regra, adote a seguinte expressão: o i-ésimo elemento do
Array meuArray é meuArray [
i - 1 ].
©Fonte: o autor
Se recordarmos a introdução
desta unidade e analisarmos melhor
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
o Array meuArray, podemos notar
que esse Array possui 6 elementos
(meuArray [ 0 ] com valor -45,
meuArray [ 1 ] com valor 6,
meuArray [ 2 ] com valor 0, ...,
meuArray [ 5 ] com valor -4)
onde todos são do mesmo tipo, isso
significa que todos os Arrays em Java
conhecem seu próprio tamanho. Esta
informação pode ser acessada por
Figura 33: Um Array de 6 elementos
meio da variável length. Portanto, para
recuperar o tamanho do Array meuArray, devemos usar a expressão meuAr-
ray.length.
ARRAYS E COLEÇÕES
75
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
CONSTRUINDO ARRAYS UNIDIMENSIONAIS
Dando sequência ao nosso estudo, agora vamos aprender como construir Arrays.
No tópico anterior apenas vimos como realizamos as declarações de Arrays e
as maneiras como estas declarações podem ser feitas da melhor forma possível.
Para que seja possível trabalhar com Arrays precisamos construir, ou melhor,
criar um objeto de Array e a maneira mais simples de alcançarmos este feito é
por meio do operador new. Todo e qualquer Array se trata de um objeto que
ocupa espaço na memória e para o compilador saber quanto espaço alocar você,
caro(a) aluno(a), precisa especificar o tamanho do seu Array na hora da sua cons-
trução. Para alocar 6 elementos para o Array de inteiros meuArray, devemos
usar a seguinte declaração.
ARRAYS E COLEÇÕES
77
©Fonte: o autor
©Fonte: o autor
Uma representação do Array
criado no código anterior
pode ser representada na
imagem que segue.
Agora, veremos uma repre-
sentação deste Array alocado
Figura 35: Representação de um Array Bidimensional com 3 linhas e 4 colunas
na memória.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
©Fonte: o autor
ARRAYS E COLEÇÕES
79
int[][] a;
a = new int[2][]; //aloca linhas
a[0] = new int[5]; //aloca 5 colunas para a linha 0
a[1] = new int[3]; //aloca 3 colunas para a linha 1
©Fonte: o autor
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Figura 37: Um Array com 2 linhas, onde uma contém 5 colunas e a outra 3 colunas
INICIALIZANDO ARRAYS
Inicializando Arrays
III
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
caro(a) aluno(a), o que teríamos de fazer para criar um Array com 4 carros? Sim,
4 carros. Veja a seguir.
A partir deste momento temos criados 4 objetos do tipo Carro, onde a refe-
rência de cada objeto na memória foi armazenado em um elemento do Array
carros. Note que para inicializarmos os elementos foram utilizados os índi-
ces de cada elemento, desta maneira, conseguimos acessar elementos específicos
e armazenar a referência de cada novo objeto Carro.
ARRAYS E COLEÇÕES
81
Bem, até aqui tudo perfeito e funcionando corretamente, mas o que acon-
teceria se você tentasse armazenar um novo objeto Carro ao elemento [4] do
Array carros? Ao recordarmos os estudos anteriores, vamos lembrar que a
partir do momento que usamos o operador new para construir um Array, esse
Array passa a conhecer o seu tamanho, portanto, se você tentar acessar um ele-
mento com um índice que não existe, será lançada em tempo de execução a
exceção java.lang.ArrayIndexOutOfBoundsException. A mesma
exceção será lançada se você tentar utilizar um índice com número negativo, ex:
-1. Veja os exemplos a seguir.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
long x = 2;
long[] id;
id = new long[3];
id[0] = 1;
id[1] = x;
id[2] = 3;
O código acima não possui nada de diferente do que vimos até agora. Contudo,
veja o código a seguir.
Inicializando Arrays
III
long x = 2;
long[] id = {1,x,3};
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
■■ Criamos um Array de long com tamanho igual a três, ou seja, três elementos.
■■ Atribuimos a estes elementos os valor 1, 2 e 3.
■■ Atribuimos um novo objeto de Array à variável de referência id.
ARRAYS E COLEÇÕES
83
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Arrays também são passados para os métodos como referência. Ora, isso sig-
nifica então que também podemos manipular os elementos de um Array? Sim,
podemos, o método chamado pode acessar os elementos dos Arrays originais
do chamador. Para isso, bastar passar para o método chamado o nome do Array
sem colchetes, que na verdade é uma referência para um objeto que contém os
elementos do Array. O exemplo, a seguir, demonstra esta situação.
ARRAYS E COLEÇÕES
85
Bem, mãos à obra. Chegou a hora de colocar em prática tudo aquilo que você
aprendeu até agora. Vamos criar exemplos funcionais para aplicar de forma prá-
tica os conceitos estudados até agora.
Como no nosso primeiro exemplo, vamos criar uma classe que declara e
aloca um Array de 10 elementos na memória. Em seguida, vamos recuperar o
valor contido nos elementos desse Array e imprimir em uma janela o índice e
o valor respectivo.
1
2
3 import javax.swing.*;
4
5 public class Exemplo1 {
6
7 public static void main(String[] args) {
8 int[] array; //declara referência para um
array
9 array = new int[10]; //cria um array com 10 elementos
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
10 String saida = "Índice\tValor\n";
11
12 //adicionando o valor de cada
13 //elemento do Array na variável saida
14 for (int i = 0; i < array.length; i++) {
15 saida += i + "\t" + array[i] + "\n";
16 }
17
18 JTextArea saidaArea = new JTextArea();
19 saidaArea.setText(saida);
20
21 JOptionPane.showMessageDialog(null, saidaArea,
22 "Criando um Array de Inteiros",
23 JOptionPane.INFORMATION_MESSAGE);
24
25 System.exit(0);
26 }
27 }
Vamos entender o que aconteceu. Note que na linha 8 foi declarada a variá-
vel array capaz de referir-se a um Array de elementos int. Na linha 9, foi
utilizado o operador new para construir o Array e alocar os 10 elementos na
memória. Declaramos também na linha 10 uma variável do tipo String cha-
mada saida, na qual será responsável por armazenar os índices e os valores dos
elementos para, posteriormente, serem exibidos em um diálogo de mensagem.
ARRAYS E COLEÇÕES
87
Nas linhas 14, 15 e 16, utilizamos uma estrutura for para adicionar o índice
e o valor de cada elemento do Array a saida. Note o uso da contagem na vari-
ável i, perceba que a contagem se inicia em zero (nesse momento, você deve
recordar que os índices iniciam em 0 em um Array). Desse modo, o laço irá aces-
sar cada elemento do Array iniciando por 0. Perceba agora o uso da expressão
array.length para recuperar o comprimento do Array. Neste nosso exem-
plo o comprimento do Array é 10 e o laço será executado enquanto a variável
de controle i for menor que 10. Lembre-se que para um Array com 10 elemen-
tos os valores dos índices vão de 0 a 9, portanto, ao utilizarmos o operador
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
menor que, <, garantimos que o laço não irá acessar um elemento além do fim
do Array, evitando assim, um erro e também o lançamento da famosa exceção
java.lang.ArrayIndexOutOfBoundsException. Veja na imagem,
a seguir, o resultado apresentado em um diálogo de mensagem quando execu-
tamos o exemplo que acabamos ver.
Vamos a mais um exemplo? Bem, o nosso segundo exemplo com Arrays será
bem semelhante ao exemplo anterior, a diferença é que agora vamos inicializar
os elementos do Array, apresentar o Array inicializado e, em seguida, vamos
somar os elementos deste Array. Por fim, também vamos apresentar esta soma
em um diálogo de mensagem.
1
2
3 import javax.swing.JOptionPane;
4 import javax.swing.JTextArea;
5
6 public class Exemplo2 {
7
8 public static void main(String[] args) {
9 //cria um array com 6 elementos
10 int[] array = {10, 15, 25, 3, 8, 7};
11 int total = 0;
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
12 String saida = "Índice\tValor\n";
13
14 //adicionando o valor de cada
15 //elemento do Array na variável saida
16 for (int i = 0; i < array.length; i++) {
17 total += array[i];
18 saida += i + "\t" + array[i] + "\n";
19 }
20
21 saida += "\n\nA soma dos elementos do array é: " +
total;
22
23 JTextArea saidaArea = new JTextArea();
24 saidaArea.setText(saida);
25
26 JOptionPane.showMessageDialog(null, saidaArea,
27 "Criando um Array de Inteiros",
28 JOptionPane.INFORMATION_MESSAGE);
29
30 System.exit(0);
31 }
32 }
Você pode notar que o exemplo acima é bem parecido com o primeiro exemplo
que estudamos há pouco. Em nosso primeiro exemplo, nós não inicializamos
o Array. Note que quando executamos o primeiro exemplo, os valores de cada
elemento do Array é zero. No segundo exemplo, não fizemos nada de diferente
do que estudamos até aqui. O que fizemos foi declarar na linha 10 uma variável
ARRAYS E COLEÇÕES
89
array que faz referência a um Array do tipo int, já inicializando este Array com
os valores (10, 15, 25, 3, 8, 7). Quando o programa executar esta linha, automa-
ticamente um Array com 6 elementos será alocado na memória e já inicializado.
Perceba agora, que na linha 11 foi declarada uma variável total do tipo int,
para podermos armazenar nesta variável a soma dos valores dos elementos do
Array. Se analisarmos a linha 17, note que uma soma está sendo realizada nessa
variável com base no valor do elemento. Nesse momento, utilizamos o índice
corrente no laço de repetição for para recuperar o valor do Array por meio da
expressão array[i]. Por fim, atribuimos na variável saida um texto apre-
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Figura 40: Resultado apresentando índices, valores e a soma dos elementos de um Array
Fonte: o autor
Dando continuidade aos nossos estudos, agora vamos ver um exemplo traba-
lhando com Arrays multidimensionais e passagem de Array por referência. O
exemplo, a seguir, irá demonstrar a inicialização de dois Arrays bidimensionais e
o uso de laços de repetição aninhados (laços aninhados é o mesmo que um laço
sendo executado dentro de outro e assim sussecivamente) for para percorrer
os Arrays. Vamos ao exemplo.
1 import java.awt.Container;
2 import javax.swing.JApplet;
3 import javax.swing.JTextArea;
4
5 public class Exemplo3 extends JApplet{
6 JTextArea saidaArea;
7
8 @Override
9 public void init() {
10 super.init();
11
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
12 saidaArea = new JTextArea();
13 Container container = getContentPane();
14 container.add(saidaArea);
15
16 int[][] array1 = { {1,2,3}, {4,5,6} };
17 int[][] array2 = { {1,2}, {3}, {4,5,6} };
18
19 saidaArea.setText("Os valores do array1 são\n");
20 buildSaida(array1);
21
22 saidaArea.append("Os valores do array2 são\n");
23 buildSaida(array2);
24 }
25
26 public void buildSaida(int[][] array) {
27 //percorre as linhas do array com um for
28 for (int linha = 0; linha < array.length; linha++) {
29 //percorre as colunas da linha corrente com outro
30for
31 for (int coluna = 0; coluna < array[linha].length;
32 coluna++) {
33 saidaArea.append(array[linha][coluna] + " ");
34 }
35 saidaArea.append("\n");
36 }
37 saidaArea.append("\n");
38 }
39
40 }
ARRAYS E COLEÇÕES
91
No começo do nosso estudo, vimos que Arrays são estruturas que consistem em
itens de dados de um mesmo tipo, seja este primitivo ou de referência a outros
objetos, e que quando precisamos manipular informações de um Array, temos
que criar programas que atendam a essa necessidade. Quando trabalhamos com
estruturas de Coleções, o desenvolvedor não precisa se preocupar como estas
estruturas foram criadas e sim qual a Coleção que ele irá utilizar e em que deter-
minada situação se encontra isso, graças às interfaces que a estrutura de Coleções
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
fornece. As interfaces definem várias operações a serem realizadas generica-
mente sobre vários tipos de Coleções minimizando a quantidade de código que
um programador precisa escrever para criar e manipular Coleções.
O conjunto de interfaces e classes de coleções contidos na API Java consti-
tui o chamado Framework Collections que tem por raíz duas interfaces
básicas: Collection, utilizada para manipular coleções onde os elementos
são objetos individuais, e Map, onde se mapeia uma chave única para um valor
específico, por meio de uma estrutura de pares de objetos, no qual um é utli-
zado como chave para acesso.
Veja, a seguir, algumas das principais interfaces fornecidas pelo pacote
java.util.*.
■■ Collection – interface raiz da hierarquia de Coleções a partir da qual se
derivam as interfaces Set e List.
■■ Set – dá relevância à exclusividade, ou seja, contém elementos únicos.
■■ List – interface onde o índice tem relevância. Esta interface possui diversas
operações relacionadas ao índice que outras interfaces não list não têm.
■■ Map – diz respeito a identificadores únicos, onde se mapeia uma única
chave para um determinado valor. Para os Maps são associados chaves e
valores onde estas não podem ser duplicadas, ou seja, cada chave pode
mapear somente um valor.
ARRAYS E COLEÇÕES
93
■■ Queue – o mesmo que fila. Geralmente utilizada para se manter uma lista
de execuções a serem processadas. A ela se atribui o conceito de FIFO (first
in, first out. Que em português significa primeiro a entrar, primeiro a sair).
©Fonte: o autor
<<interface>>
Collection
<<interface>>
SortedSet
<<interface>>
HashSet <<interface>>
NavigableSet
Map
<<interface>>
SortedMap
LinkedHashSet TreeSet
<<interface>>
Hashtable HashMap
NavigableMap
Object
LinkedHashMap TreeMap
Arrays Collections
A Interface List
III
da lista é zero. Uma das vantagens que uma coleção list possui sobre as cole-
ções não list é a grande variedade de métodos relacionados com índices, como
o get(int index), indexOf(Object o), add(int index, Object obj), entre outros. A
interface List possui três classes que a implementa: ArrayList, LinkedList
e Vector. A seguir, vamos estudar a classe mais utilizada entre as três, estamos
falando da classe ArrayList.
Quando falamos de ArrayList, devemos considerar esse conjunto como um
Array redimensionável, isto é, que pode crescer. Pois além de implementar a
interface List, essa classe fornece métodos que permitem manipular o tamanho
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
da matriz que á usada internamente para armazenar a lista. Cada instância de
uma ArrayList possui uma capacidade que define o tamanho da matriz usada
para armazenar os elementos da lista. Quando adicionamos um elemento a uma
ArrayList, sua capacidade aumenta automaticamente. A seguir, vamos ver um
exemplo de como se usa um ArrayList que contenha uma lista de frutas.
1import java.util.ArrayList;
2 import java.util.List;
3 import javax.swing.JOptionPane;
4 import javax.swing.JTextArea;
5
6 public class Exemplo4 {
7 public static void main(String[] args) {
8 List<String> listaFrutas = new ArrayList<String>();
9 String s = "uva";
10 listaFrutas.add("melancia");
11 listaFrutas.add(s);
12 listaFrutas.add("caju");
13
14 String saida = "";
15 saida += "Frutas da Lista: "+
16 listaFrutas.toString();
17 saida += "\nTotal de Frutas na lista: "+
28 listaFrutas.size();
29 saida += "\nA lista possui pera? "+
20 listaFrutas.contains("pera");
21 saida += "\nA lista possui caju? "+
22 listaFrutas.contains("caju");
ARRAYS E COLEÇÕES
95
23 listaFrutas.remove("uva");
24
25 saida += "\nTotal de Frutas na lista "
26 + "apos remover uva: "+listaFrutas.size();
27 saida += "\nFrutas da Lista "
28 + "apos remover uva: "+listaFrutas.toString();
29 saida += "\nÍndice da Fruta "
30 + "caju na lista: "+listaFrutas.
31 indexOf("caju");
32
33 JTextArea saidaArea = new JTextArea();
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
34 saidaArea.setText(saida);
35
36 JOptionPane.showMessageDialog(null, saidaArea,
37 "Trabalhando com ArrayList",
38 JOptionPane.INFORMATION_MESSAGE);
39
40 System.exit(0);
41 }
42 }
Perceba que este pequeno programa executou vários controles relacionados com
a ArrayList. Bem, caro(a) aluno(a), vamos entender o que acontece então? Se
você recordar ao nosso estudo sobre Arrays, sempre que precisávamos alocar um
Array na memória com o operador new era necessário definir o tamanho deste
Array assim como o seu tipo de dado (primitivo ou referenciando um objeto),
por exemplo, int[] meuArray = new int[6];. Perceba que quando
declaramos nosso ArrayList na linha 10, não demos a ele um tamanho e, mesmo
assim, conseguimos pedir para o ArrayList nos informar seu tamanho na linha
19 por meio do método listaFruta.size(), isso, graças à capacidade que
o ArrayList tem de definir o seu tamanho automaticamente quando adiciona-
mos ou removemos um objeto da lista como foi feito na linha 26. Note que ao
consultarmos novamente o tamanho da lista na linha 28, o ArrayList foi capaz
de nos informar esse novo tamanho sem a necessidade de você, caro(a) aluno(a),
precisar programar códigos e mais códigos para isso. Perceba agora que utiliza-
mos a sintaxe <String> no nosso ArrayList. Esse tipo de programação segue
A Interface List
III
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
com base no tamanho do seu Array, você percorreria esse Array, verificando ele-
mento por elemento por meio do índice. Trabalhoso, não? Note que você seguiria
a mesma ideia se precisasse recuperar o índice de uma determinada fruta se
estivesse trabalhando com Array. No nosso exemplo acima, simplesmente uti-
lizamos o método listaFrutas.indexOf(), como mostra a linha 33 do
nosso programa. Veja, a seguir, o resultado no nosso exemplo.
Continuando nossos estudos, agora vamos ver um exemplo que nos mostra
como classificar um ArrayList. Algo bem simples, por exemplo, classificar uma
lista com nomes por ordem alfabética. Certamente, você pensou: “Vou procu-
rar o método sort() na classe ArrayList”. Boa sorte. Essa classe não fornece de
forma alguma uma maneira que permita classificar o seu conteúdo. Mas não
desanime, para isso vamos utilizar a classe java.util.Collections. Veja
o exemplo a seguir.
ARRAYS E COLEÇÕES
97
1
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.List;
6 import javax.swing.JOptionPane;
7 import javax.swing.JTextArea;
8
9 public class Exemplo5 {
10
11 public static void main(String[] args) {
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
A Interface List
III
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Figura 44: Ordenando Arrays
Fonte: o autor
A INTERFACE SET
ARRAYS E COLEÇÕES
99
1
2
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.Collection;
6 import java.util.HashSet;
7 import java.util.Iterator;
8 import java.util.List;
9 import java.util.Set;
10 import javax.swing.JOptionPane;
11 import javax.swing.JTextArea;
12
13 public class Exemplo6 {
14
15 String saida = "";
16 private String[] cores = {"vermelho", "branco",
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
A Interface Set
III
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
na nossa lista de cores duplicadas, foi utilizado um Iterator para podermos
acessar os elementos do HashSet. Note que na linha 46 foi obtido um Iterator
de HashSet e nas linhas 50 e 51, utilizamos os métodos hasNext e next de
Iterator para acessarmos os elementos de HashSet. Veja, a seguir, a execução do
nosso exemplo.
ARRAYS E COLEÇÕES
101
1
2
3 import java.util.Arrays;
4 import java.util.Iterator;
5 import java.util.SortedSet;
6 import java.util.TreeSet;
7 import javax.swing.JOptionPane;
8 import javax.swing.JTextArea;
9
10 public class Exemplo7 {
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
11
12 String saida = "";
13 private String[] cores = {"vermelho", "branco",
14 "azul", "verde", "cinza", "laranja",
15 "bronzeado", "branco", "ciano", "pêssego",
16 "cinza", "laranja"};
17
18 public static void main(String[] args) {
19 new Exemplo7();
20 }
21
22 public Exemplo7() {
23 TreeSet tree = new TreeSet(Arrays.asList(cores));
24
25 saida += "\nSet de elementos não "
26 + "duplicados e ordenados:\n";
27 this.mostrarSet(tree);
28
29 saida += "\n\nSubconjunto de TreeSet "
30 + "menor que ‘laranja’:\n";
31 this.mostrarSet(tree.headSet("laranja"));
32
33 saida += "\n\nSubconjunto de TreeSet "
34 + "maior que ou igual a ‘laranja’:\n";
35 this.mostrarSet(tree.tailSet("laranja"));
36
37 saida += "\n\nPrimeiro elemento de set: "
38 + tree.first();
39 saida += "\nÚltimo elemento de set: "
40 + tree.last();
41
42 JTextArea saidaArea = new JTextArea();
43 saidaArea.setText(saida);
A Interface Set
III
44
45 JOptionPane.showMessageDialog(null, saidaArea,
46 "Trabalhando com Sets",
47 JOptionPane.INFORMATION_MESSAGE);
48
49 System.exit(0);
50 }
51
52 private void mostrarSet(SortedSet ss) {
53 Iterator iterator = ss.iterator();
54
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
55 while (iterator.hasNext()) {
56 saida += iterator.next() + " ";
57 }
58 }
59 }
Perceba que no código anterior a linha 28 cria-se um objeto TreeSet com base
no Array cores e atribui uma referência para esse objeto a tree. A linha 36
realiza uma chamada para o método headSet no qual retorna um subcon-
junto de TreeSet com elementos menores que "laranja". Para retornar os
elementos maiores que ou igual a "laranja", realizamos um chamada para
o método tailSet. Quaisquer alterações realizadas por meios destas duas
visões, headSet e tailSet, serão refletidas em TreeSet. Note agora as chamadas
para os métodos first e last nas linhas 43 e 45. Estes são responsáveis por obter o
menor e o maior elemento, respectivamente. Finalmente, vamos nos atentar ao
método mostrarSet declarado na linha 57. Este método recebe como argu-
mento um SortedSet e o imprime quando realizamos chamadas deste método
nas linhas 32, 36 e 40 para mostrar o set ordenado, os elementos menores que
"laranja" e os elementos maiores que ou igual a "laranja", respectivamente.
Veja o resultado desta execução.
ARRAYS E COLEÇÕES
103
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
A INTERFACE MAP
O primeiro ponto que você precisa saber sobre a interface Map é que embora as
classes SortedMap, Hashtable, HashMap, TreeMap e LinkedHashMap
sejam consideradas coleções, nenhuma destas estendem de Collection como
as classes que implementam as interfaces Set e List. Você deve considerar um
objeto Map como um objeto que mapeia chaves para valores não permitindo que
existam chaves duplicadas (assim como Sets, Maps conta apenas com o método
equals() para derterminar se as chaves são iguais ou diferentes) e que cada
chave pode ser mapeada para no máximo um valor.
Chamamos este tipo de mapeamento de mapeamento um para um. Um
objeto Map difere de um Set no fato de que Map possui chave e valor, enquanto
Set possui somente chave. A inteface que estente Map responsável por manter
suas chaves ordenadas é a SortedMap. Implementações realizadas com Maps per-
mitem buscar um valor com base em uma determinada chave, recuperar uma
coleção apenas dos valores ou apenas das chaves. No exemplo que iremos estu-
dar a seguir, vamos utilizar um HashMap para contar o número de Strings que
iniciam com uma determinada letra.
A Interface Map
III
1
2
3 import java.util.HashMap;
4 import java.util.Map;
5 import javax.swing.JOptionPane;
6 import javax.swing.JTextArea;
7
8 public class Exemplo8 {
9
10 private static String[] nomes = {"João", "José,
11 "Pedro", "Carlos", "Jaqueline",
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
12 "Matheus", "Marcelo"};
13
14 public Exemplo8() {
15 HashMap map = new HashMap();
16 Integer i;
17
18 for (int j = 0; j < nomes.length; j++) {
19 i = (Integer) map.get(
20 new Character(nomes[j].charAt(0)));
21
22 if (i == null) {
23 map.put(new Character(nomes[j].charAt(0)),
24 new Integer(1));
25 } else {
26 map.put(new Character(nomes[j].charAt(0)),
27 new Integer(i.intValue() + 1));
28 }
29 }
30
31 this.geraSaidaMap(map);
32 }
33
34 private void geraSaidaMap(Map mapRef) {
35 String saida = "";
36 saida += "Número de palavras iniciadas com a letra:";
37 saida += "\n" + mapRef.toString();
38 saida += "\nQuantidade de valores do Map: " + mapRef.
size();
39 saida += "\né vazio?: " + mapRef.isEmpty();
40
ARRAYS E COLEÇÕES
105
52 new Exemplo8();
53 }
54 }
A Interface Map
III
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
A INTERFACE QUEUE
Você, provavelmente, já deve ter ouvido falar do conceito FIFO (first in, first out),
ou em português: primeiro a entrar, primeiro a sair. Pois bem, uma Queue, que
significa fila em português, segue este conceito (embora outras ordens sejam
possíveis) e tem como objetivo manter uma lista de tarefas a serem processa-
das de alguma maneira. Além de suportar todos os métodos padrões de uma
Collection, ela também possui métodos adicionais para adicionar, extrair e revi-
sar os elementos da fila.
A classe responsável por implementar uma Queue é a PriorityQueue.
Adicionada no Java 5, seus elementos são ordenados pela ordem natural e seu
objetivo é criar uma fila onde o elemento que tem prioridade para entrar, tem
prioridade para sair (priority in, priority out), ou seja, os elementos ordenados
primeiro serão acessados pimeiro, o que difere de uma fila do tipo FIFO (pri-
meiro a entrar é o primeiro a sair).
Vimos no começo desse tópico que uma Queue é uma interface com o pro-
pósito de manter uma lista de tarefas ou coisas a se fazer. A seguir, vamos ver
um exemplo de implementação de Queue utilizando a classe LinkedList.
ARRAYS E COLEÇÕES
107
1
2
3 import java.util.LinkedList;
4 import java.util.Queue;
5 import javax.swing.JOptionPane;
6 import javax.swing.JTextArea;
7
8 public class Exemplo9 {
9
10 String saida = "";
11
12 public Exemplo9() {
13 Queue<Integer> queue = new LinkedList<Integer>();
14 this.adicionarElemento(queue);
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
15 saida += "\n";
16 this.removerElemento(queue);
17
18 JTextArea saidaArea = new JTextArea();
19 saidaArea.setText(saida);
20
21 JOptionPane.showMessageDialog(null, saidaArea,
22 "Trabalhando com Queues",
23 JOptionPane.INFORMATION_MESSAGE);
24
25 System.exit(0);
26 }
27
28 public static void main(String[] args) {
29 new Exemplo9();
30 }
31
Quadro 36: Implementação de Queue utilizando LinkedList
A Interface Queue
III
Vamos analisar nosso exemplo. Note que na linha 13 estamos declarando uma
Queue (fila) que recebe uma instância de uma LinkedList. Assim como um
ArrayList, LinkedList é uma classe onde seus elementos são ordenados pela
posição no índice exceto pelos elementos serem duplamente encadeados. Além
dos métodos obtidos da interface List, esse encadeamento fornece métodos para
inserção ou remoção do início ou final da fila tornando-se a melhor opção para
implementações de pilha ou fila.
Vamos agora analisar o método adicionarElemento() declarado na
linha 32. Este método recebe como argumento uma Queue na qual são adiciona-
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
dos 6 elementos. Perceba na linha 33 que foi declarada uma variável elemento
de tipo int e inicializa com o valor 5. A linha 34 realiza um laço for decre-
mento este valor até 0 e adicionando o valor decrementado na fila como mostra
a linha 33, ou seja, o primeiro elemento a entrar na fila é o 5, o próximo é o 4, 3
o seguinte e assim sucessivamente decrementando e adicionando até 0.
O método removerElemento declarado na linha 40 também recebe como
argumento uma Queue da qual serão removidos os elementos contidos nela. A
linha 41 realiza um laço while que enquanto a fila não for vazia (verificação
realizada com o método isEmpty()) será removido um elemento como mos-
tra a linha 42 ao utilizar o método remove(). Esse método tem a finalidade de
recuperar e remover um objeto da fila.
Como dito anteriormente, uma Queue segue o conceito FIFO, onde o pri-
meiro que entra é o primeiro que sai. Em nosso exemplo, o primeiro elemento
que entrou na fila é o 5 e o último foi o 0. Portanto, o primeiro elemento a sair
da fila será o 5 e o último será o 0. Veja, a seguir, a execução do programa.
ARRAYS E COLEÇÕES
109
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
CONSIDERAÇÕES FINAIS
Prezado(a) aluno(a), nesta unidade você estudou sobre duas estruturas de dados
muito utilizadas para armazenamentos e processamento de informações, Arrays
e Coleções.
Você aprendeu que Arrays são estruturas simples que consistem em uma
estrutura de dados de um mesmo tipo onde os elementos são armazenados um
após o outro sendo possível seu acesso por meio de um índice e, que para pro-
cessarmos algum tipo de informação é preciso criar programas que atendam a
tal necessidade.
Vimos que Coleções são estruturas de dados mais elaboradas que permi-
tem armazenar outros objetos. Diferentemente de Arrays, Coleções possuem um
conjunto de interfaces que possibilita manipular os elementos de uma Coleção
sem você se preocupar como a estrutura foi criada.
Considerações Finais
1. Três das declarações de Arrays são válidas. Selecione quais.
a) int [ ] idade;
b) [ ] int idade;
c) int idade [ ];
d) Thread [ ] threads;
e) [ ] threads Thread;
1
2
3 public class Exercicio2 {
4
5 public static void main(String[] args) {
6 String[] texto = new String[10];
7
8 for (int i = 0; i < 10; i++) {
9 texto[i] = "Texto"+(i+1);
10 }
11
12 for (int i = 0; i <= texto.length; i++) {
13 String stringTexto = texto[i];
14 System.out.println(stringTexto);
15 }
16 }
17 }
Material Complementar
Professor Dr. Edson A. Oliveira Junior
Professor Me. André Abdala Noel
INTRODUÇÃO À INTERFACE
IV
UNIDADE
GRÁFICA
Objetivos de Aprendizagem
■■ Entender o que é a biblioteca SWING.
■■ Estudar o tratamento de exceções do JAVA.
Plano de Estudo
A seguir, apresentam-se os tópicos que você estudará nesta unidade:
■■ O que é a biblioteca Swing
■■ Criando um Projeto no NetBeans IDE
■■ Criando um Container JFrame
■■ Adicionando componentes SWING
■■ Construindo Interface
■■ Escrevendo o código
115
INTRODUÇÃO
Introdução
IV
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
e especifique o local do projeto.
4. Deixe desmarcada a caixa de seleção Utilizar Pasta Dedicada para Arma-
zenar Bibliotecas.
5. Verifique se a caixa de seleção Definir como Projeto Principal está mar-
cada e desmarque o campo Criar Classe Principal.
6. Clique em Finalizar.
Observe que será criada uma nova tela com uma caixa de edição, onde você irá
construir toda sua interface gráfica, é possível redimensionar a tela com faci-
lidade. Observe ao lado direito da tela que há 2 seções, Paleta e Propriedades.
Em paleta se encontra todos os componentes para criar sua interface gráfica e
na seção Propriedades é possível definir vários atributos a cada componente.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
ADICIONANDO COMPONENTES SWING
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Figura 53: Definindo as bordas dos JPanels
CONSTRUINDO A INTERFACE
relacionado a um ButtonGroup.
4. Digite “Nome:” e pressione Enter para que o novo nome do Label seja
exibido.
Construindo a Interface
IV
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Figura 54: Inserindo os JTextField
Para inserir itens no JComboBox da opção ‘UF, você deverá clicar nas reticências
(...) da opção model em propriedades, insira o nome do item que você quer que
apareça e clique em adicionar. Nesse exemplo coloquei todos os estados brasileiros.
Para adicionar JRadioButton:
1. Na janela Paleta, selecione o componente Botão de Rádio na categoria
Controles do Swing.
2. Arraste e posicione os JRadioButton conforme figura abaixo.
Construindo a Interface
IV
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Figura 57: Inserindo componentes SWING no Formulário
Para permitir que seja marcada apenas uma opção nos JRadioButtons, da
opção Sexo de nosso cadastro, você deve adicionar ao projeto o componente
ButtonGroup, este componente não apresenta nenhum tipo de interface, ao
inseri-lo note que ele será adicionado no inspetor de componentes à esquerda
da tela. Em seguida, vá até as propriedades dos JRadioButtons, opção button-
Group e escolha buttonGroup1 (nome padrão para este componente), faça isso
para ambos os JRadioButtons.
Para adicionar JCheckBox:
1. Na janela Paleta, selecione o componente Caixa de Seleção na categoria Con-
troles do Swing.
2. Arraste e posicione os JCheckBox.
3. Altere o campo text de cada JCheckBox conforme abaixo.
Para alinhar os JCheckBox selecione todos ao mesmo tempo e com o botão direito
do mouse vá em redimensionamento automático horizontal.
Para adicionar JTextArea:
1. Na janela Paleta, selecione o componente Área de Texto na categoria
Controles do Swing.
2. Arraste e posicione o JTextArea.
Construindo a Interface
IV
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Figura 59: Inserindo componentes SWING no Formulário
ESCREVENDO O CÓDIGO
Observe que foi criado uma classe chamada Cadastro ao lado esquerdo da tela.
Agora, vamos inserir todos os atributos que serão utilizados em nosso projeto e
gerar todos os gets e sets. Para gerar os gets e sets clique com o botão direito do
mouse e selecione a opção “Inserir código”; na janela pop up selecione “Getter
e Setter ...” conforme a figura abaixo:
Escrevendo o Código
IV
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Figura 61: Implementando os métodos da Classe Cadastro
Observe que os nomes dos atributos são semelhantes aos campos em nosso
formulário. É importante manter nomes de atributos condizentes com as
variáveis utilizadas no form do Swing para facilitar na implementação.
Aqui, iremos implementar o código dos dados recebidos nos campos do nosso
Form. Primeiramente, é necessário instanciar o objeto que criamos da seguinte
maneira:
do código, nesse caso está claro que o atributo nome do objeto está recebendo
os dados do campo nome do formulário.
Agora implemente o mesmo método para os outros atributos de texto con-
forme abaixo incluído o campo JTextArea:
Escrevendo o Código
IV
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Figura 66: Atribuindo os valores das variáveis aos atributos
A mesma ideia será utilizada para o campo sexo do nosso formulário, porém
como é um buttonGroup, teremos de fazer uma condição para atribuir uma String
ao nosso Objeto quando um deles estiverem selecionados da seguinte forma:
Outro método que deve ser implementado em nosso projeto é o método lim-
par(). O objetivo desse método é eliminar da tela todas as informações que foram
digitadas no formulário após clicar no botão Salvar.
Para deixar o nosso código mais organizado vamos criar um método novo
na mesma classe Formulário, abaixo do método salvar da seguinte forma:
Aqui, vamos definir novos valores para limpar cada campo de nosso formulário.
Para os campos de texto, JTextField e JTextArea, basta atribuirmos “” por meio
do método setText(“”); para os JCheckBox devemos fazer uso do método setSe-
lected(false) conforme pode ser visto na figura abaixo:
Escrevendo o Código
IV
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Para alterar o estado dos JRadioButton definidos para representar Masculino e
Feminino deve-se modificar o componente buttonGroup1 por meio do método
clearSelecion(). Segue abaixo o método para limpar esse componente.
Para que o método limpar() seja executado fazemos a chamada no método Salvar
antes da mensagem de confirmação de cadastro salvo.
nas pressionar a tecla F6. A tela do cadastro deve ser semelhante à tela da figura
abaixo.
Observe que o formulário não possui validações quanto à inserção de dados
vazios. E nem tratamento de exceções. Vamos ver esse tópico a seguir.
Escrevendo o Código
IV
CONSIDERAÇÕES FINAIS
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
1. Crie o seguinte GUIs usando Java Swing. Você não tem de fornecer
qualquer funcionalidade.
1. System.out.print ("Inicio");
2. try{
3. System.out.print ("ola_mundo")
4. throw new FileNotFoundException();
5. }
6. System.out.print ("capturar_aqui");
7. catch (EOFException e){
8. System.out.print ("fim_da_exceção_do_arquivo");
9. }
10. catch (FileNotFoundException e){
11. System.out.print ("arquivo_nao_encontrado");
12. }
try {
} catch (Exception e) {
} catch (ArithmeticException a) {
}
MATERIAL COMPLEMENTAR
Quando trabalhar com Swing e projetar telas, lembre-se que as telas devem
ser equilibradas e ordenadas.
Material Complementar
Professor Dr. Edson A. Oliveira Junior
PERSISTÊNCIA DE
V
UNIDADE
DADOS COM JPA
Objetivos de Aprendizagem
■■ Estudar os principais fundamentos sobre JDBC.
■■ Estudar os principais fundamentos sobre a API JPA.
Plano de Estudo
A seguir, apresentam-se os tópicos que você estudará nesta unidade:
■■ JDBC – Java Database Connectivity
■■ Drivers JDBC
■■ Conectando a um SGDB com Connection
■■ Executando Instruções SQL com Statement
■■ Executando Instruções SQL com PreparedStatement
■■ Recuperando e utilizando dados de um ResultSet
■■ O JPA – Java Persistence API
■■ Entidades
■■ Principais Anotações JPA
■■ Relacionamentos JPA
■■ Unidades de Persistência (Persistence Unit)
■■ Gestor de Entidade (Entity Manager)
141
INTRODUÇÃO
Introdução
V
Antes de entrarmos de cabeça nos estudos sobre o JPA, vamos falar um pouco
sobre JDBC (Java Database Connectivity). JDBC trata-se de uma API para acesso
a banco de dados relacionais por meio de comandos SQL em que a programação
do sistema é a mesma para qualquer SGBD (Sistema Gerenciador de Banco de
Dados), ou seja, não há necessidade de desenvolver aplicações amarradas com
um banco específico.
Com JDBC é possível:
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
■■ Estabelecer uma conexão com um banco de dados ou com qualquer fonte
de dados tabular.
■■ Executar instruções SQL.
■■ Processar os resultados obtidos.
DRIVERS JDBC
Para que seja possível estabelecer uma conexão com um banco de dados permi-
tindo que uma aplicação Java interaja com esse banco, o JDBC utiliza drivers
específicos de acordo com cada SGDB. Por exemplo, para construir uma apli-
cação Java que realize acesso a um banco de dados MySQL é necessário utilizar
os drivers específicos desse SGDB. Normalmente, os drivers JDBC são forneci-
dos pelos seus fabricantes ou por comunidades de usuários.
Atualmente, existem quatro tipos de drivers que são classificados da maneira
a seguir.
1. Ponte JDBC-ODBC – é o mais simples, porém restrito a plataforma Win-
dows. Geralmente utilizado quando não existe para o SGDB um driver
nativo (tipo 4), sendo necessário um ODBC para se conectar ao banco
de dados.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
usuário e a senha, respectivamente. Veja, a seguir, um pequeno trecho de código
que representa uma conexão.
A primeira parte jdbc indica que a URL em questão é uma URL JDBC. A segunda,
<subprotocol>, representa o nome do driver de conexão utilizado para um
determinado SGDB. O terceiro, <subname>, representa a fonte de dados a qual
será realizada a conexão. Veja, a seguir, uma relação com os principais fabrican-
tes de banco de dados e o formato de URL JDBC de conexão de cada um.
3050)
Tabela 1: Formatos de URL JDBC de conexão com banco de dados
Eu sei que você já deve estar ansioso(a) para começar a ver exemplos e pôr em
prática o que estudamos até agora. Porém, você deverá executar alguns passos
antes disso. O exemplo, a seguir, cria uma conexão com um banco de dados
derby, portanto será necessário que você configure um banco de dados derby
no seu computador. O NetBeans IDE possui ferramentas para iniciar e parar
o serviço do derby e permitir criar o banco e as tabelas que iremos utilizar em
nossos exemplos a partir de agora. O link, a seguir, contém um tutorial sobre
como configurar o derby no NetBeans, siga o tutorial e para nossos estudos
crie um banco com o nome ead-bd.
<http://netbeans.org/kb/docs/ide/java-db_pt_BR.html>.
Voltando ao nosso exemplo, ele obtém informações da conexão e do banco de
dados utilizando os métodos estudados até então.
1
2
3 import java.sql.Connection;
4 import java.sql.DriverManager;
5 import java.sql.SQLException;
6 import javax.swing.JOptionPane;
7 import javax.swing.JTextArea;
8
9 public class ExemploConnection {
10
11 private Connection con = null;
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
12 private String usuario = null;
13 private String senha = null;
14 private String urlConexao = null;
15
16 public ExemploConnection() {
17
18 urlConexao = "jdbc:derby://localhost:1527/ead-bd";
19 usuario = "ead";
20 senha = "ead";
21
22 this.conectarBanco();
23
24 this.desconectaBanco();
25 }
26
27 public static void main(String[] args) {
28 new ExemploConnection();
29 }
30
31 private void conectarBanco() {
32 String saida = "";
33 try {
34 con = DriverManager.getConnection(urlConexao,
35 usuario, senha);
36
37 saida += "Informações de Conexão";
38 saida += "\nFabricante SGDB: "
39 + con.getMetaData().
getDatabaseProductName();
50
51 JTextArea saidaArea = new JTextArea();
52 saidaArea.setText(saida);
53
54 JOptionPane.showMessageDialog(null, saidaArea,
55 "Conexão realizada com Sucesso",
56 JOptionPane.INFORMATION_MESSAGE);
57 } catch ( SQLException ex) {
58 JOptionPane.showMessageDialog(null,
ex.getMessage(),
59 "Erro ao conectar no banco",
60 JOptionPane.ERROR_MESSAGE);
61 }
62 }
63
64 private void desconectaBanco() {
65 try {
66 if (!con.isClosed()) {
67 con.close();
68 }
69 } catch (SQLException ex) {
70 JOptionPane.showMessageDialog(null,
ex.getMessage(),
71 "Erro ao desconectar",
72 JOptionPane.ERROR_MESSAGE);
73 }
74 }
75 }
Um objeto Statement tem por objetivo executar uma instrução SQL sim-
ples sem parâmetros, retornando os resultados que ela produz por meio de um
ResultSet (falaremos sobre ResultSet mais adiante, neste momento você só
precisa saber que um ResultSet contém o resultado da execução de uma instru-
ção SQL). Por padrão, cada execução de Statement retorna apenas um ResultSet
contendo todos os resultados daquela instrução SQL realizada.
Quando criamos uma conexão com um determinado banco de dados utili-
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
zando um objeto Connection, podemos utilizar esta conexão para enviar instruções
SQL neste banco por meio desse objeto. Para isso, precisamos criar um objeto
Statement a partir do método createStatement() de Connection, como
mostra o trecho de código a seguir.
Para que seja possível executar instruções SQL com o objeto Statement obtido,
você pode utilizar alguns dos métodos execute fornecidos por ele, passando
como argumento uma String que contenha o SQL que será executado. Veja o
trecho de código a seguir.
Agora que já temos a tabela criada, implemente o exemplo a seguir. Este exemplo:
inserir um registro na tabela Produtos utilizando o método executeUpdate
do objeto Statement.
1
2
3 import java.sql.Connection;
4 import java.sql.DriverManager;
5 import java.sql.SQLException;
6 import java.sql.Statement;
7 import javax.swing.JOptionPane;
8
9 public class ExemploStatement {
10
11 private Connection con = null;
12 private String usuario = null;
13 private String senha = null;
14 private String urlConexao = null;
15 private String driverJDBC = null;
16
17 public ExemploStatement() {
18 driverJDBC = "org.apache.derby.jdbc.ClientDriver";
19 urlConexao = "jdbc:derby://localhost:1527/ead-bd";
20 usuario = "ead";
21 senha = "ead";
22
23 this.conectarBanco();
24 this.executarStatement();
25 this.desconectaBanco();
26 }
27
28 public static void main(String[] args) {
29 new ExemploStatement();
30 }
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
31
32 private void conectarBanco() {
33 try {
34 Class.forName(driverJDBC);
35 con = DriverManager.getConnection(urlConexao,
36 usuario, senha);
37 } catch (ClassNotFoundException | SQLException ex) {
38 JOptionPane.showMessageDialog(null,
ex.getMessage(),
39 "Erro ao conectar no banco",
40 JOptionPane.ERROR_MESSAGE);
41 }
42 }
43
44 private void desconectaBanco() {
45 try {
46 if (!con.isClosed()) {
47 con.close();
48 }
49 } catch (SQLException ex) {
50 JOptionPane.showMessageDialog(null,
ex.getMessage(),
51 "Erro ao desconectar",
52 JOptionPane.ERROR_MESSAGE);
53 }
54 }
55
60 Statement stmt = con.createStatement();
61 int qtdRegistrosInseridos = stmt.
executeUpdate(sql);
71 }
72 }
73 }
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Antes de uma instrução SQL ser executada com PreparedStatement você deve
definir um valor para cada ponto de interrogação. Isso pode ser feito por meio
de chamadas do método setter (setInt, setString, ...) apropriado para cada
tipo de parâmetro esperado pelo ponto de integerrogação. Por exemplo, se o
parâmetro esperado é do tipo long, então você fará uma chamado para o método
setLong passando dois argumentos para este método. O primeiro define a posi-
ção do parâmetro para qual será atribuído o valor (essa posição é iniciada por 1)
e o segundo argumento define o valor que será atribuído. Veja o código a seguir.
1
2
3 import java.sql.Connection;
4 import java.sql.DriverManager;
5 import java.sql.PreparedStatement;
6 import java.sql.SQLException;
7 import javax.swing.JOptionPane;
8
9 public class ExemploPreparedStatement {
10
11 private Connection con = null;
12 private String usuario = null;
13 private String senha = null;
14 private String urlConexao = null;
15 private String driverJDBC = null;
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
16
17 public ExemploPreparedStatement() {
18 driverJDBC = "org.apache.derby.jdbc.ClientDriver";
19 urlConexao = "jdbc:derby://localhost:1527/ead-bd";
20 usuario = "ead";
21 senha = "ead";
22
23 this.conectarBanco();
24 this.executarPreparedStatement();
25 this.desconectaBanco();
26 }
27
28 public static void main(String[] args) {
29 new ExemploPreparedStatement();
30 }
31
32 private void conectarBanco() {
33 try {
34 Class.forName(driverJDBC);
35 con = DriverManager.getConnection(urlConexao,
36 usuario, senha);
37 } catch (ClassNotFoundException | SQLException ex) {
38 JOptionPane.showMessageDialog(null,
ex.getMessage(),
39 "Erro ao conectar no banco",
40 JOptionPane.ERROR_MESSAGE);
41 }
42 }
43
44 private void desconectaBanco() {
45 try {
46 if (!con.isClosed()) {
47 con.close();
48 }
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
59 try {
60 PreparedStatement stmtProdutos = con.
prepareStatement(sql);
61 stmtProdutos.setInt(1, 2000);
62 stmtProdutos.setString(2, "DESCRICAO DO PRODUTO
2000");
63 int qtdRegistrosInseridos = stmtProdutos.
executeUpdate();
64 String saida = "Quantidade de registros inseridos:
"
65 + qtdRegistrosInseridos;
66 JOptionPane.showMessageDialog(null, saida,
67 "Registro Inserido com Sucesso",
68 JOptionPane.INFORMATION_MESSAGE);
69 } catch (SQLException ex) {
70 JOptionPane.showMessageDialog(null,
ex.getMessage(),
71 "Erro ao inserir registro",
72 JOptionPane.ERROR_MESSAGE);
73 }
74 }
75 }
retornando false quando não existir mais linhas para serem percorridas no
objeto. O trecho de código a seguir obtém um ResultSet a partir da execução de
uma instrução SQL com Statement.
Para recuperar os valores da coluna da linha atual, você pode utilizar os méto-
dos getter fornecidos pelo objeto de ResultSet como getBoolean, getLong etc.
Para isso, você pode utilizar o número do índice (mais eficiente) da coluna ou
nome da coluna. Quando você utiliza métodos getter, o driver JDBC tenta con-
verter os dados ao tipo Java especificado no método getter retornando um valor
Java adequado. Por exemplo, se você utilizar o método getString, será retor-
nado um valor do tipo String. Veja o exemplo a seguir.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
1 package br.uem.ead.exemplos.jdbc.resultset;
2
3 import java.sql.Connection;
4 import java.sql.DriverManager;
5 import java.sql.ResultSet;
6 import java.sql.SQLException;
7 import java.sql.Statement;
8 import javax.swing.JOptionPane;
9 import javax.swing.JTextArea;
10
11 public class ExemploResultSet {
12
13 private Connection con = null;
14 private String usuario = null;
15 private String senha = null;
16 private String urlConexao = null;
17 private String driverJDBC = null;
18
19 public ExemploResultSet() {
20 driverJDBC = "org.apache.derby.jdbc.ClientDriver";
21 urlConexao = "jdbc:derby://localhost:1527/ead-bd";
22 usuario = "ead";
23 senha = "ead";
24
25 this.conectarBanco();
26 this.recuperarResultSet();
27 this.desconectaBanco();
28 }
29
74 dados.first();
75 while (!dados.isAfterLast()) {
76 saida += "\n" + dados.getInt(1)
77 + "\t" + dados.getString(2);
78 dados.next();
79 }
80
81 saida += "\n\nRecuperando pelo nome da
coluna";
82 saida += "\nCódigo\tDescrição";
83 dados.first();
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
84 while (!dados.isAfterLast()) {
85 saida += "\n" + dados.getInt("ID")
86 + "\t" + dados.
getString("DESCRICAO");
87 dados.next();
88 }
89 }
90
91 JTextArea saidaArea = new JTextArea();
92 saidaArea.setText(saida);
93 JOptionPane.showMessageDialog(null, saidaArea,
94 "Recuperando com ResultSet",
95 JOptionPane.INFORMATION_MESSAGE);
96 } catch (SQLException ex) {
97 JOptionPane.showMessageDialog(null,
ex.getMessage(),
98 "Erro ao recuperar registros",
99 JOptionPane.ERROR_MESSAGE);
100 }
101 }
102 }
Quadro 49: Percorrendo registros obtidos com Statement por meio de um ResultSet
Bem, caro(a) aluno(a), até o momento você estudou e aprendeu como se conectar
a um banco de dados relacional e interagir com ele a fim de realizar consultas e
ENTIDADES
A partir deste momento vamos estudar os principais conceitos sobre JPA e ire-
mos aplicá-los em exemplos práticos no decorrer do nosso estudo.
O primeiro conceito que vamos estudar é o de entidades. Uma Entity (ou
em português, entidade) em JPA se refere a uma classe de entidade no qual
representa uma tabela em um banco de dados e cada instância dessa classe é
um objeto que se refere a um registro armazenado nesta tabela. Na programa-
ção em Java, o principal artefato que representa uma entidade é a Entity
Class. Entity Class é uma classe também conhecida por Classe de Entidade
em que o estado de persistência desta classe se dá pelos atributos com anota-
ções que representam um mapeamento objeto/relacional para uma tabela de
um banco de dados.
Para que uma classe possa ser considerada uma Entity Class, ela deve seguir
os seguintes requisitos:
■■ A classe deve ser anotada como @Entity (javax.persistence.
Entity).
■■ A classe deve possuir uma chave primária podendo ser um campo único
ou uma combinação de campos.
■■ A classe deve ter o mesmo nome da tabela quando não anotada como @
Table (javax.persistence.Table). Essa anotação define o
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
nome da tabela que a Entity Class representa.
■■ A classe deve possuir um construtor público ou protegido sem argumen-
tos havendo a possibilidade de declarar outros construtores.
■■ Tanto a classe como os métodos ou atributos de persistência não podem
ser declarados com o modificador final.
■■ Uma classe de entidade pode estender outras classes de entidades e clas-
ses que não são entidades podem estender classes de entidades.
■■ Uma classe de entidade deve implementar a interface java.io.Serializable.
■■ As variáveis de instâncias devem ser declaradas com os modificadores
de acesso private ou protected permitindo ser acessados direta-
mente pelos métodos da classe.
1 package br.uem.ead.exemplos.jpa.entidades;
2
3 import java.io.Serializable;
4 import java.math.BigDecimal;
5 import java.util.Date;
6 import javax.persistence.Entity;
7 import javax.persistence.Id;
8 import javax.persistence.Table;
9 import javax.persistence.Temporal;
10
11 @Entity
12 @Table(name="PRODUTO")
13 public class Produto implements Serializable {
14
15 @Id
16 private long id;
17 private String descricao;
18 @Temporal(javax.persistence.TemporalType.DATE)
19 private Date dataCadastro;
20 private BigDecimal quantidadeEstoque;
21
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
22 public Produto() {
23 }
24
25 public long getId() {
26 return id;
27 }
28
29 public void setId(long id) {
30 this.id = id;
31 }
32
33 public String getDescricao() {
34 return descricao;
35 }
36
37 public void setDescricao(String descricao) {
38 this.descricao = descricao;
39 }
40
41 public Date getDataCadastro() {
42 return dataCadastro;
43 }
44
45 public void setDataCadastro(Date dataCadastro) {
46 this.dataCadastro = dataCadastro;
47 }
48
49 public BigDecimal getQuantidadeEstoque() {
50 return quantidadeEstoque;
51 }
52
Vamos analisar a classe anterior. Perceba que na linha 10 foi declarada a anotação
@Entity de javax.persistence.Entity. Quando declaramos esta anotação, a classe
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
tornou-se uma Entity Class ou Classe de Entidade e, a partir desta linha passou
a representar uma tabela em um banco de dados. Note agora que os campos ou
atributos desta classe, definidos da linha 14 a 18, são todos privados podendo ser
acessados mediante os métodos públicos da classe. Repare na linha 20, o cons-
trutor da classe também é público. Com base nestas características podemos
dizer que esta classe se trata de um POJO.
Um POJO (Plain Old Java Object) – que em português significa Velho
e Simples Objeto Java – é uma classe que realiza referência a objetos
que não dependem de herança ou quaisquer outras classes externas. São obje-
tos que seguem uma estrutura simplificada onde os construtores são default
sem argumentos e os métodos seguem o padrão getter e setter para aces-
sar os atributos privados da classe.
Você já deve ter percebido até o momento que para definirmos uma classe como
entidade e os atributos desta classe como atributos de persistência foram utili-
zadas várias annotations (em português, anotações) JPA. A seguir, você vai
conhecer as principais anotações JPA e suas funcionalidades. Essas anotações
estão no pacote javax.persistence.
■■ @Entity – define que a classe em questão é uma entidade a ser persistida
em uma tabela no banco de dados. Caso esta tabela não exista o JPA cria
ela para você.
o banco de dados.
■■ @Temporal – define qual atributo será mapeado para uma coluna do tipo
temporal que pode ser Date (data), Time (tempo) ou Timestamp (carimbo
de tempo).
■■ @Enumerated – mapeia um atributo para um campo enumerado de uma
tabela onde a informação é persistida como uma string.
■■ @Column – define quais atributos da classe representam colunas de uma
tabela.
■■ @Embeddable – uma entidade com esta anotação pode ser embutida em
outra entidade.
■■ @Embedded – embuti uma entidade dentro de outra.
■■ @JoinColumn – indica que o atributo é um relacionamento para uma
outra entidade (outra tabela).
■■ @ManyToMany – define uma associação com multiplicidade de muitos
para muitos.
■■ @ManyToOne – define uma associação com valor único para outra enti-
dade com multiplicidade de muitos para um.
■■ @MappedSuperclass – os mapeamentos realizados em uma entidade com
esta anotação podem ser aplicados às entidades que herdam dela.
Veja, a seguir, uma classe mapeada com algumas das anotações vistas anterior-
mente. Memorize bem esta classe, pois mais adiante você verá um exemplo de
persistência com uma instância desta entidade.
1 package br.uem.ead.exemplos.jpa.entidades;
2
3 import java.io.Serializable;
4 import java.util.Date;
5 import javax.persistence.Column;
6 import javax.persistence.Entity;
7 import javax.persistence.EnumType;
8 import javax.persistence.Enumerated;
9 import javax.persistence.GeneratedValue;
10 import javax.persistence.GenerationType;
11 import javax.persistence.Id;
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
12 import javax.persistence.Temporal;
13 import javax.persistence.TemporalType;
14 import javax.persistence.Transient;
15
16 @Entity
17 public class Pessoa implements Serializable {
18
19 @Id
20 @GeneratedValue(strategy = GenerationType.AUTO)
21 private long id;
22 @Column(name = "nome", nullable = false, length = 60)
23 private String nomePessoa;
24 @Enumerated(EnumType.STRING)
25 @Column(name = "fis_jur", nullable = false, length = 1)
26 private TipoFisicaJuridicaEnum
27 tpFisicaJuridica = TipoFisicaJuridicaEnum.F;
28 @Temporal(TemporalType.DATE)
29 private Date dataCadastro;
30 @Transient
31 private String endereco;
32
33 public Pessoa() {
34 }
35
36 public long getId() {
37 return id;
38 }
39
40 public void setId(long id) {
41 this.id = id;
42 }
43
55
56 public void setTpFisicaJuridica(
57 TipoFisicaJuridicaEnum tpFisicaJuridica) {
58 this.tpFisicaJuridica = tpFisicaJuridica;
59 }
60
61 public Date getDataCadastro() {
62 return dataCadastro;
63 }
64
65 public void setDataCadastro(Date dataCadastro) {
66 this.dataCadastro = dataCadastro;
67 }
68
69 public String getEndereco() {
70 return endereco;
71 }
72
73 public void setEndereco(String endereco) {
74 this.endereco = endereco;
75 }
76 }
RELACIONAMENTOS JPA
Bem, caro(a) aluno(a), até agora você aprendeu como “dizer” para uma classe que
ela é uma entidade e como definir os atributos desta entidade como atributos de
persistência. Mas, como criamos relacionamentos entre estas entidades, assim
como é feito em um banco relacional? Ora, é simples. Para isso também existem
anotações que definem que uma determinada entidade se relaciona com outra
e vice-versa. Para ser mais preciso as anotações que definem relações ou asso-
ciações entre as entidades são quatro de acordo com a sua cardinalidade. Estas
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
associações mantêm uma forma de relação entre os objetos associados permi-
tindo que eles se comuniquem mantendo uma relação estática. As anotações de
que estamos falando são as seguintes:
@OneToOne (Um para Um) – define uma associação de um único valor
para outra entidade que possui multiplicidade de um para um. Por exemplo,
uma Cidade é governada por apenas um Prefeito e um Prefeito governa ape-
nas uma cidade.
@ManyToOne (Muitos para Um) – define uma associação com valor único
para outra entidade com multiplicidade de muitos para um. Por exemplo, um
título a pagar pertence a uma pessoa e uma pessoa possui muitos títulos a pagar.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
<properties>
<property name="javax.persistence.jdbc.url"
value="jdbc:derby://localhost:1527/ead-bd"/>
<property name="javax.persistence.jdbc.password"
value="ead"/>
<property name="javax.persistence.jdbc.driver" value="org.
apache.derby.jdbc.ClientDriver"/>
<property name="javax.persistence.jdbc.user" value="ead"/>
<property name="eclipselink.ddl-generation" value="drop-
and-create-tables"/>
</properties>
</persistence-unit>
</persistence>
Note que no exemplo acima foram adicionadas algumas informações como con-
figurações para conexão com o banco de dados. Perceba que estas configurações
definidas dentro da tag <properties></properties> pedem as mesmas infor-
mações que utilizamos quando configuramos uma conexão utilizando JDBC.
Outro ponto que você já deve ter notado é o mapeamento das classes de per-
sistência utilizando a tag <class></class>. Sempre que você anotar uma classe
com @Entity não se esqueça de mapear esta classe neste arquivo, caso contrário
ela não fará parte do contexto de persistência e não será possível realizar ope-
rações com esta entidade.
1
2
3 import br.uem.ead.exemplos.jpa.entidades.Pessoa;
4 import br.uem.ead.exemplos.jpa.entidades.
TipoFisicaJuridicaEnum;
5 import java.util.Date;
6 import javax.persistence.EntityManager;
7 import javax.persistence.EntityManagerFactory;
8 import javax.persistence.Persistence;
9 import javax.swing.JOptionPane;
10
11 public class ExemploEntityManager {
12
13 public static void main(String[] args) {
14 EntityManagerFactory factory =
15 Persistence.createEntityManagerFactory("UEM-
EADPU");
16 EntityManager manager = factory.createEntityManager();
17
18 Pessoa pessoa = new Pessoa();
19 pessoa.setNomePessoa("Joao da Silva");
20 pessoa.setDataCadastro(new Date());
21 pessoa.setTpFisicaJuridica(TipoFisicaJuridicaEnum.J);
22 pessoa.setEndereco("Rua das Pedras, 101");
23
24 manager.getTransaction().begin();
25 manager.persist(pessoa);
26 manager.getTransaction().commit();
27
28 String textoSaida = "Código Pessoa: " + pessoa.getId();
29
30 manager.close();
31 factory.close();
32
33 JOptionPane.showMessageDialog(null, textoSaida,
34 "Persistindo uma Pessoa com EntityManager",
35 JOptionPane.INFORMATION_MESSAGE);
36 }
37 }
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
No exemplo anterior criamos um objeto do tipo Pessoa. Se você recordar nos
nossos exemplos anteriores, você vai lembrar que criamos uma classe Pessoa e
a anotamos com a anotação @Entity. Pois bem, utilizamos uma instância dessa
entidade e a partir de uma instância de um EntityManager nós persistimos o
objeto no banco de dados. Mas como criamos uma instância de EntityManager?
Para isso, antes precisamos criar um EntityManagerFactory relacionado
a uma Persistence Unit. Perceba na linha 14 do nosso exemplo que criamos uma
variável factory do tipo EntityManagerFactory e a ela atribuímos uma referên-
cia de EntityManagerFactory obtida por meio da expressão Pesistence.
createEntityManagerFactory("UEM-EADPU"). Note que passamos
como referência o nome da unidade de persistência criada na sessão Unidades
de Persistência (Persistence Unit) mediante uma String com
o texto UEM-EADPU. Bem, caro(a) aluno(a), agora nós já temos um fábrica
de EntityManager associado à unidade de persistência UEM-EADPU, portanto
já podemos obter um EntityManager como mostra a linha 16 do nosso exem-
plo. Perceba que utilizamos factory para criar um EntityManager por meio da
expressão factory.createEntityManager() e atribuímos o objeto
criado à variável manager do tipo EntityManager. A persistência do objeto
pessoa do tipo Pessoa ocorre na linha 25 mediante a expressão manager.
persiste(pessoa).
CONSIDERAÇÕES FINAIS
Considerações Finais
1. Como atividade de autoestudo, vamos criar um pequeno projeto e aplicar os
conceitos estudados em exemplos simples e práticos. Como IDE de desenvolvi-
mento para este projeto vamos utilizar o Netbeans. Você pode realizar o down-
load do Netbeans no seguinte endereço:
<http://netbeans.org/downloads/7.0.1/start.html?platform=windows&lang=pt_
BR&option=all>.
Agora que você realizou o download da IDE, vamos ao projeto. Abra o Netbeans e
crie um novo projeto em Arquivo => Novo Projeto. Na tela que se abre, escolha Java
na guia Categorias e Aplicação Java na guia Projetos como mostra a imagem abaixo.
Agora que já temos um projeto criado precisamos definir um banco de dados para
nossos estudos e para isso vamos utilizar o já conhedico Derby. No Netbeans sele-
cione a aba Serviços e na estrutura de árvores selecione Banco de Dados => Java DB
e com o botão contrário do mouse clique em Iniciar Servidor. Após iniciar o servidor,
clique novamente com o botão contrário do mouse em JavaDB clique em Criar Ban-
co de Dados.
Na tela que se abre, você irá definir o nome do banco de dados como exemplo-jpa e
o usuário e senha como jpa e clique em OK como mostra a imagem a seguir.
Agora que temos o banco de dados criado, será necessário adicionar no projeto o
Driver JDBC para o Derby. Você pode realizar o download do Driver JDBC Derby-
Client no link a seguir:
<http://repo1.maven.org/maven2/org/apache/derby/derbyclient/10.9.1.0/derby-
client-10.9.1.0.jar>.
Com o download do Driver efetuado, vamos adicioná-lo ao nosso projeto. Para isso,
selecione a aba Projetos e na pasta Bibliotecas clique com o botão contrário do mou-
se e, em seguina, na opção Adicionar JAR/Pasta... como mostra a imagem a seguir.
175
Ainda na pasta biblioteca devemos adicionar a biblioteca do JPA, para isso clique
com o botão contrário do mouse em Bibliotecas e vá em Adicionar Biblioteca...
como na imagem abaixo.
Agora que já temos nosso projeto devidamente configurado, vamos criar algumas
classes de entidade? Bem, para isso precisamos definir o que nossa aplicação vai
fazer. Para nosso estudo vamos realizar o cadastro de um Estado, das Cidades deste
Estado e do Governador do Estado. Ora, então você já deve imaginar que teremos
que criar três Entity Class onde uma delas – neste caso, Estado – possuirá um mape-
amento @OneToMany para uma lista de Cidades e outro mapeamento @OneToOne
para o Governador do Estado como mostra o diagrama de classes a seguir.
A primeira entidade que vamos criar é a Entity Class Governador. No Netbens, clique
com o botão direito do mouse e crie um pacote chamado entidades.
Agora clique com o botão contrário do mouse no pacote entidades e crie uma clas-
se Governador de acordo com a classe vista anteriormente no diagrama de classes.
1 package estudojpa.entidades;
2
3 import java.io.Serializable;
4 import javax.persistence.Column;
5 import javax.persistence.Entity;
6 import javax.persistence.GeneratedValue;
7 import javax.persistence.GenerationType;
8 import javax.persistence.Id;
9 import javax.persistence.Table;
10
11 @Entity
12 @Table(name = "cidades")
13 public class Cidades implements Serializable {
14
15 @Id
16 @GeneratedValue(strategy= GenerationType.AUTO)
17 private long id;
18 @Column(name="nome", nullable=false, length=60)
19 private String nome;
20
21 public Cidades() {
22 }
23
24 public long getId() {
25 return id;
26 }
27
28 public void setId(long id) {
29 this.id = id;
30 }
31
32 public String getNome() {
33 return nome;
34 }
35
36 public void setNome(String nome) {
37 this.nome = nome;
38 }
39 }
1 package estudojpa.entidades;
2
3 import java.io.Serializable;
4 import java.util.List;
5 import javax.persistence.CascadeType;
6 import javax.persistence.Column;
7 import javax.persistence.Entity;
8 import javax.persistence.GeneratedValue;
9 import javax.persistence.GenerationType;
10 import javax.persistence.Id;
11 import javax.persistence.OneToMany;
12 import javax.persistence.OneToOne;
13 import javax.persistence.Table;
14
15 @Entity
16 @Table(name = "estados")
17 public class Estados implements Serializable {
18
19 @Id
20 @GeneratedValue(strategy = GenerationType.AUTO)
21 private long id;
22 @Column(name = "uf", nullable = false, length = 2)
23 private String unidade_federativa;
24 @Column(name = "nome", nullable = false, length = 60)
25 private String nome;
26 @OneToMany(cascade= CascadeType.ALL)
27 private List<Cidades> cidades = new ArrayList<Cidades>();
28 @OneToOne(cascade= CascadeType.ALL)
29 private Governador governador;
30
31 public Estados() {
32 }
33
34 public long getId() {
35 return id;
36 }
37
38 public void setId(long id) {
39 this.id = id;
Neste momento seu projeto deve possuir uma estrutura parecida com a seguir.
Perceba que seu projeto agora possui uma pasta META-INF e dentro dela está o
arquivo de persistência persistence.xml. Em cima deste arquivo dê um duplo cli-
que para abri-lo, a fim de adicionarmos nele as classes de persistência que criamos
anteriormente. Perceba que será aberta uma aba com o nome do arquivo como
183
Na tela que se abre, selecione as três classes e cliente em OK. Agora, você deverá ter
algo semelhante a isto.
Perceba que no arquivo gerado estão mapeadas as três classes que criamos por
meio da tag <class>. E em <properties> foi configurado o banco que criamos ante-
riormente.
Agora, vamos colocar o JPA para trabalhar por nós. Para isso, vamos programar na
classe principal do projeto as regras para inserir um Estado, duas cidades e um go-
vernador para o Estado. A classe principal do nosso projeto é aquela que definimos
no início da configuração do nosso projeto, no nosso caso ela se chama EstudoJPA.
185
1 package estudojpa;
2
3 import estudojpa.entidades.Cidades;
4 import estudojpa.entidades.Estados;
5 import estudojpa.entidades.Governador;
6 import java.util.List;
7 import javax.persistence.EntityManager;
8 import javax.persistence.EntityManagerFactory;
9 import javax.persistence.Persistence;
10 import javax.swing.JOptionPane;
11
12 public class EstudoJPA {
13
14 private static final String
15 NOME_UNIDADE_PERSISTENCIA = "EstudoJPAPU";
16
17 public static void main(String[] args) {
18 String saida = "";
19 EntityManagerFactory factory =
20 Persistence.
21 createEntityManagerFactory(NOME_UNIDADE_
PERSISTENCIA);
22 EntityManager manager =
23 factory.createEntityManager();
24
25 Cidades cidLondrina = new Cidades();
26 cidLondrina.setNome("São Paulo");
27
28 Cidades cidMaringa = new Cidades();
29 cidMaringa.setNome("Maringá");
30
31 Governador gov = new Governador();
32 gov.setNome("Beto Richa");
33
34 Estados ufPR = new Estados();
35 ufPR.setUnidade_federativa("PR");
36 ufPR.setGovernador(gov);
37 ufPR.setNome("Paraná");
38 ufPR.getCidades().add(cidMaringa);
39 ufPR.getCidades().add(cidLondrina);
40
41 manager.getTransaction().begin();
42 manager.persist(ufPR);
43 manager.getTransaction().commit();
44
45 saida += "Dados do Estado:";
46 saida += " \nId: " + ufPR.getId();
47 saida += " \nNome: " + ufPR.getNome();
48 saida += " \nUF: " + ufPR.getUnidade_federativa();
49 saida += " \nId Governador: " + ufPR.getGovernador().
getId();
50 saida += " \nNome Governador: " +
51 ufPR.getGovernador().getNome();
52 saida += " \n\nCidades do Estado : " + ufPR.getNome();
53
54 List<Cidades> listaCidades = ufPR.getCidades();
55
56 for (int i = 0; i < listaCidades.size(); i++) {
57 Cidades cidades = listaCidades.get(i);
58
59 saida += " \nId: " + cidades.getId()
60 + " - Nome: " + cidades.getNome();
61
62 }
63
64 manager.close();
65 factory.close();
66
67 JOptionPane.showMessageDialog(null, saida,
68 "Estudo JPA", JOptionPane.INFORMATION_MESSAGE);
69 }
70 }
Agora veja como ficou a estrutura do banco de dados depois que o JPA entrou em
ação. Você se lembra de ter criado alguma instrução SQL para criar as tabelas? Eu
também não lembro e mesmo assim elas estão lá.
Figura 98: Estrutura do banco de dados do Estudo JPA
MATERIAL COMPLEMENTAR
Material Complementar
CONCLUSÃO
Neste livro busquei mostrar a você conceitos mais avançados em programação com
a linguagem Java. A fim de possibilitar o seu entendimento, a unidade I apresentou
os conceitos de sobreposição e sobrecarga, muito úteis na estruturação do projeto
OO Java e futuras manutenções.
Na unidade II, trabalhamos classes abstratas e interfaces por meio do conceito de
programação por interfaces e contratos. Esses conceitos são muito poderosos para
resolver um grande número de padrões de projeto existentes.
A unidade III foi dedicada exclusivamente a arrays e coleções Java. Várias coleções
como List, Set e Map foram tratadas, bem como os conceitos essenciais sobre arrays
Java.
Na unidade IV apresentei os principais conceitos sobre a criação de interfaces gráfi-
cas com o cliente e tratamento de exceções. Interfaces gráficas foram implementa-
das por meio da biblioteca Swing e respectivos eventos.
E, para finalizar, vimos na unidade V os conceitos sobre persistência de objetos Java
por meio das APIs JDBC e JPA. JPA é uma poderosa biblioteca que permite o mape-
amento objeto-relacional entre objetos Java e um sistema gerenciador de banco
de dados relacional ou objeto-relacional, a fim de facilitar o desenvolvimento do
modelo de dados de uma aplicação.
Espero ter alcançado o objetivo inicial deste livro, que era apresentar conceitos mais
avançados em programação Java. Desejo que você seja muito feliz profissionalmen-
te utilizando os conceitos apresentados aqui e se puder ajudar de alguma forma,
estou a sua disposição.
Prof. Dr. Edson A. Oliveira Junior
191
GABARITO
UNIDADE I
1. O exercício tem seu escopo bastante aberto. Dentro desse exercício são possí-
veis diversas implementações corretas. O conceito a ser firmado com ele era a
possibilidade que a linguagem JAVA oferece de termos mais de um método com
o mesmo nome, desde que com assinaturas (retorno e sequência de parâme-
tros) diferentes.
Aproveitei para, na solução passada, utilizar os métodos de forma com que eles
pudessem ser reaproveitados dentro da própria resolução. Pensem nisso!
package br.edu.unicesumar.gabaritojavaii.unidade1.exercicio3;
return valorImposto;
}
return impostoRetorno;
}
}
GABARITO
Também montei uma classe de exemplo para testarmos nosso código. No exem-
plo a seguir, tomei como base o cálculo dos impostos no salário:
package br.edu.unicesumar.gabaritojavaii.unidade1.exercicio3;
package br.edu.unicesumar.gabaritojavaii.unidade1.exercicio4;
public Fornecedor(){
package br.edu.unicesumar.gabaritojavaii.unidade1.exercicio4;
3. Resposta: a. O código não compila, pois o conteúdo da linha 6 não pode estar
entre o bloco de try{} e de catch{}.
4. Resposta: sim. Não compila, pois Arithimetic Exception estende Exception, por-
tanto, colocando-o depois o código nunca seria executado.
195
GABARITO
UNIDADE II
1. A proposta deste exercício era julgar algumas assertivas com base no código
proposto. Irei detalhar cada uma delas na sequência:
a) O código será compilado sem alterações.
VERDADEIRA. O código não apresenta nenhum problema de sintaxe que im-
possibilite a publicação.
b) A classe MiniCarro criará uma declaração abstract do metodo2() ou imple-
mentará esse método para permitir que o código seja compliado.
FALSA. Não há a necessidade de que o metodo2() seja implementado na resolu-
ção apresentada do código.
c) É válido, mas não necessário que a classe MiniCarro crie uma declaração abs-
trata do método metodo2() ou implemente esse método para permitir que o
código seja compilado.
FALSA. Não há necessidade de executar nenhum dos procedimentos sugeridos
para que o código compile.
d) Já que a linha 8 existe, a classe Automovel deve declarar o método metodo1()
de alguma maneira.
FALSA. Nesse caso, o método abstrato não precisa ser implementado na classe
“Minicarro”, pois a classe também é abstrata.
e) Se a linha 6 fosse substituída por “MiniCarro extends Automovel { “ o código
seria compilado.
FALSA. O código já é compilado, portanto não é necessário fazer a mudança. Se
fizermos a mudança sugerida, iremos perceber que o código irá parar de com-
pilar, pois ao deixar de ser abstrata, a classe “Minicarro” precisaria implementar
o metodo1().
f ) Se a classe Automovel não fosse abstrata e o método metodo1() da linha 2
fosse implementado, o código não seria compilado.
FALSA. Se a classe não fosse abstrata ao implementar o método 1, o sistema não
apresentaria nenhum erro.
GABARITO
3. Três das opções são assinaturas de métodos válidos em uma interface. Quais?
(Selecione três).
Resposta: b, c, e.
a) private int getArea( );
Métodos privados não podem conter assinatura privada.
d) public static void main (String [ ] args);
Assinaturas não aceitam o modificador static.
UNIDADE III
1. Três das declarações de Arrays são válidas. Selecione quais.
Resposta: a, c, d.
b) [ ] int idade;
e) [ ] threads Thread;
Essas opções são inválidas. JAVA não aceita a declaração de [] na frente do tipo
de variável.
2. Linha 13. Quando ele tenta acessar texto[10], o sistema aciona uma exceção de
que a posição acessada não existe. Quando declaramos “String[] texto = new
String[10];” ele irá criar somente até o indíce 9.
UNIDADE IV
1. Apenas criar a GUI como a imagem.
REFERÊNCIAS
BAUER, Christian; KING, Gavin. Java Persistence com Hibernate. Ciência Moderna,
2007.
CORNELL, Gary; HORSTMANN, Cay S. Core Java. V. 2 – Advanced Features. Prentice
Hall, 2008.
DEITEL, Harvey M. Java – Como Programar. 8. ed. Prentice Hall Brasil, 2010.
GAMMA, Erich; JOHNSON, Ralph; VLISSIDES, John. Padrões de Projeto. Bookman,
2005.
HORSTMANN, Cay S; CORNELL, Gary. Core Java. V. 1 – Fundamentos. 8. ed. Pearson,
2010.
SIERRA, Kathy; BATES, Bert. Use A Cabeça! – Java. 2. ed. Alta Books, 2008.
199
ANOTAÇÕES
ANOTAÇÕES