Académique Documents
Professionnel Documents
Culture Documents
Java Para
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
O que o curso?
O que Java e como funciona?
Instalando e Aprontando o Java
Instalando e Aprontando o
Eclipse
Classe Pessoa (atributos e
construtor)
Classe Pessoa (mtodos get e set)
Usando o Scrapbook do Eclipse
JUnit no Eclipse - parte 1
JUnit no Eclipse - parte 2
"Test-First Development" no
Eclipse
Classe Livro
Adicionando Pessoa Classe
Livro
Listas e ArrayList
Iniciando a Classe Biblioteca
Criando os primeiros mtodos na
Classe Biblioteca
Criando os mtodos de
Emprstimo e Devoluo
Evoluindo os mtodos de
Emprstimo e Devoluo
Finalizando a Classe Biblioteca
Criando o mtodo main e o
arquivo JAR
HOSPEDADO POR:
O que o curso?
Caractersticas
O Curso Java para iniciantes (usando Eclipse) para voc que est se iniciando no mercado e precisa aprender Java de
uma forma rpida e objetiva.
Para iniciar o curso, voc precisa saber lgica de programao, pois no ensinamos isso aqui.
No mais, simplesmente querer aprender e gostar de pesquisar.
Este curso no tem durao pr-determinada. Voc define o seu ritmo e em consequncia a durao do curso. O material
est todo disponvel aqui nestas pginas, portanto basta seguir os links e as instrues.
O material, como diz o ttulo, destinado a iniciantes, ensinamos o bsico para que voc fique confortvel ao prosseguir
nos estudos mais avanados.
Para incentivar a interatividade, foi criada uma lista de discusso. Os estudantes interessados, podem se inscrever e
trocar informaes entre si e com instrutores voluntrios (assim que estes estiverem disponveis).
Origens do Curso
No, esta no uma ideia original. Este curso foi baseado no trabalho original de Mark Dexter datada de 2007, chamada
"Eclipse and Java for Total Beginners", disponvel aqui.
Em 2008, o Ronaldo Caldas fez uma traduo dos screencasts para Portugus. Eles podem ser encontrados aqui.
A questo que screencasts so mais difceis de produzir e manter atualizados. Minha inteno com esta verso Web do
curso composta por pginas estticas em Portugus, seja mais fcil de incrementar e manter atualizada no futuro.
Histria
Tudo comeou em Dezembro de 1990. O engenheiro Patrick Naughton, da Sun Microsystems, estava insatisfeito com as
ferramentas e APIs do C++ da Sun, estando disposto a passar a usar a plataforma Next, a Sun ofereceu a ele a chance de
trabalhar numa nova tecnologia, tendo incio assim, o projeto "Stealth".
Em 1991, o projeto foi renomeado para "Green", tendo James Gosling e Mike Sheridan se juntado a Patrick e junto com
outros engenheiros da Sun iniciaram os trabalhos. O objetivo deste projeto, era antecipar a "prxima onda" tecnolgica
do mundo digital. Eles acreditavam que em breve os equipamentos e eletrodomsticos de uso dirio estariam interagindo
mais e mais com os usurios, e para dar suporte a isso precisava ser criada uma plataforma de desenvolvimento
inteiramente nova, e principalmente: orientada a objetos.
Para implementar esta nova plataforma, eles precisavam de uma linguagem de programao que atendesse a dois
principais requisitos: ser compacta e ser confivel. Bill Joy, um dos fundadores da Sun, j havia proposto uma nova
linguagem de programao, combinando as linguagens "Mesa" e "C", e chegou a sugerir que os engenheiros da Sun
produzissem um ambiente orientado a objetos, baseado no C++.
Gosling, tentou modificar e estender o C++, mas acabou abandonando a ideia, em favor de uma linguagem inteiramente
nova. Esta linguagem foi inicialmente batizada de Oak, que quer dizer carvalho, em aluso a uma rvore que Gosling
podia observar quando olhava pela janela do seu escritrio.
Durante meses, 16 pessoas trabalharam num escritrio de Sand Hill Road, no Menlo Park, num prottipo para
demonstrar a ideia na prtica, e em Setembro de 1992, eles estavam prontos para demonstrar partes desta nova
plataforma, incluindo o sistema operacional "Green", a linguagem Oak, as bibliotecas e o hardware. O prottipo se
chamava *7 (leia-se "StarSeven"), um controle remoto com uma interface grfica touchscreen para Televises interativas.
A interface grfica possua um sistema de ajuda interativa apresentado por um personagem virtual, um mascote criado
por Joe Palrang que hoje amplamente conhecido no mundo Java, o Duke. O *7 tinha a habilidade de controlar
diversos dispositivos e aplicaes. Tudo isso foi criado usando a linguagem Oak. Infelizmente, apesar de todos os
esforos, esta tecnologia acabou se mostrando muito avanada para a indstria de TV a cabo daquela poca.
Por outro lado, a internet vinha se desenvolvendo paralelamente num ritmo muito acelerado.
No incio de Julho de 1994, depois de trs dias de brainstorming com John Gage, diretor de cincia da Sun, Gosling,
Joy, Naughton, Wayne Rosing, e Eric Schmidt, resolveram redirecionar o projeto para a internet, ficando Gosling
incumbido de liderar o projeto.
Eles vislumbraram que com o advento de navegadores com capacidade grfica como o Mosaic, a internet estava no
caminho para evoluir no mesmo caminho de mdia altamente interativo que eles haviam proposto para a industria de TV
a cabo. A ttulo de prottipo, Naughton escreveu um pequeno navegador chamado WebRunner (devido ao filme Blade
Runner), mais tarde renomeado para HotJava.
A primeira demonstrao pblica do WebRunner foi feita por John Gage e James Gosling no evento "Technology
Entertainment Design Conference" em Monterey, California no incio de 1995.
Este evento pode ser considerado um marco, pois no havia nada de muito interessante numa nova linguagem
apresentando uma pgina contendo um texto e imagens num clone do Mosaic. A apresentao se arrastava sem chamar a
ateno da audincia. Porm dois demos fizeram a audincia vibrar:
Num deles, Gosling moveu o mouse sobre a imagem 3D de uma molcula fazendo com que ela se movesse nos 3 eixos,
conquistada a ateno da plateia, Gosling foi alm, apresentando um algoritmo animado de ordenao onde trs
conjuntos de linhas horizontais de tamanhos randmicos eram ordenados da menor para a maior simplesmente movendo
as linhas para cima e para baixo. A plateia nunca tinha visto nada alm de imagens estticas num navegador. Aquilo era
realmente revolucionrio!
Mais tarde, no incio de 1995, a linguagem foi rebatizada para Java, depois que uma pesquisa de patentes revelou que o
nome Oak havia sido registrado pela empresa Oak Technology. A primeira verso pblica do Java foi anunciada em Maio
de 1995 no evento "SunWord". Era o Java 1.0a2 com o navegador HotJava.
No mesmo evento a Netscape anunciou que os seus navegadores iriam incluir suporte a Java. Em Janeiro de 1996 a Sun
criou o grupo JavaSoft para desenvolver a tecnologia Java.
Nesta nova verso da linguagem, Gosling, procurou implementar uma mquina virtual e uma linguagem usando notaes
semelhantes a linguagem C/C++. Com a promessa de se escrever uma vez e executar em qualquer lugar - "Write Once,
Run Anywhere" (WORA) - gerando executveis sem custo para as plataformas mais populares.
Rapidamente, a maioria dos navegadores Web incorporaram a habilidade de executar applets Java nas pginas Web,
fazendo com que Java se tornasse popular ainda mais rpido. Com o advento do Java 2 (lanado inicialmente como
J2SE 1.2 no incio de 1999), verses diferentes e customizadas comearam a surgir (J2EE, J2ME), em 2006 por
questes de marketing a Sun renomeou as verses mais novas de J2 para: Java EE, Java ME e Java SE respectivamente.
Em novembro de 2006, a Sun comeou a liberar a maior parte do Java como software de cdigo aberto "open source",
sob os termos da licena pblica GNU. Este processo terminou em Maio de 2007, tendo ficado toda a parte essencial do
Java disponvel nos termos de software livre e cdigo aberto, exceto uma pequena parte sobre a qual a Sun no detm o
copyright.
Logo aps a aquisio da Sun pela Oracle em 2010, a Oracle se auto proclamou como sendo a "Guardi da tecnologia
Java" com um compromisso incansvel de promover uma comunidade participativa e transparente.
Caractersticas
A linguagem Java, apenas um dos componentes da plataforma Java.
O termo "Java" na verdade se refere a um grupo de produtos e especificaes da Sun Microsystems, atualmente uma
subsidiria da Oracle, que juntos constituem uma plataforma de desenvolvimento de software e que permitem a
instalao e uso destes softwares em vrios ambientes (Sistemas Operacionais e Hardwares) diferentes.
Java usado num espectro muito amplo de plataformas: desde dispositivos dedicados e telefones celulares, passando por
computadores pessoais, indo at servidores Web e Aplicaes Corporativas.
A Linguagem Java, uma mistura de muitas outras, tais como: C, C++, LISP, Objective-C, MESA, Modula3, entre
outras. Sintaticamente, ela se assemelha muito a C e C++, porm muito mais simples que estas, devido ao fato de ser
fortemente tipada. Abaixo, citamos algumas outras caractersticas da linguagem Java que seus desenvolvedores buscavam
quando do seu desenvolvimento.
Simples
Portvel
Orientada a Objetos
Interpretada
Distribuda
Alta Performance
Robusta
Multi Tarefa
Segura
Dinmica
De Arquitetura Neutra
Como Funciona?
A execuo de um programa java se d em trs aes distintas:
1.
Crie um programa fonte em Java. Um programa fonte, contm texto escrito na linguagem de
programao Java. Um programa Java, pode ser entendido por voc e outros programadores. Qualquer
editor de texto pode ser usado para criar e editar programas fonte.
2.
Compile o programa fonte em um arquivo "bytecode". O compilador Java "javac"", traduz o seu
programa fonte em instrues que a Mquina Virtual Java (JVM)) pode entender. O compilador
armazena estas instrues num arquivo "bytecode".
3.
Primeiros passos:
Em primeiro lugar precisamos ter disponvel a plataforma de desenvolvimento Java.
Para tal, devemos acessar o site da Oracle que disponibiliza as vrias opes para Download aqui.
No caso de desenvolvimento em Java, o recomendado o JDK Se voc no tiver problemas de espao nem de
performance, opte pelo Java EE que o que se encontra em ambientes corporativos. Se tiver algum tipo de limitao,
opte pelo Java puro, que menor e mais simples.
Instalando o Java 7
Vamos escolher o Java EE, e na pgina seguinte escolher aquele apropriado para a nossa plataforma de trabalho.
Aps a instalao, devemos portanto, atualizar (ou criar se voc nunca tiver instalado um JDK antes) a varivel de
ambiente "JAVA_HOME".
Uma forma simples de testar se est tudo certo com a instalao, tentar obter a verso do compilador Java disponvel
com o comando "javac -version".
Agora voc tem no s o JDK instalado, como tambm o GlassFish, um servidor de aplicaes compatvel com Java EE
6.
Anterior | ndice | Prximo
O que o Eclipse?
O Eclipse na verdade muito mais que uma IDE. Pode-se dizer que uma plataforma de desenvolvimento, no s atendendo
vrias linguagens de programao, como tambm vrios objetivos, totalmente configurvel e customizvel.
O Eclipse composto por um ambiente integrado de desenvolvimento (IDE) e um sistema de plugins que pode ser estendido
pelos usurios. Ele foi quase totalmente escrito em Java, porm o seu sucesso se deve em boa parte ao fato de ser genrico o
suficiente para atender vrias outras linguagens tais como: Ada, C, C++, COBOL, Perl, PHP, Python, R, Ruby (incluindo a
framework Ruby on Rails), Scala, Clojure, Groovy e Scheme.
recomendado nesse momento que voc observe na seo de Atualizaes, um artigo sobre o que mudou no Eclipse verso
"Juno", que em Maio de 2013, a verso mais atual.
Um pouco de Histria:
As origens do Eclipse remontam ao VisualAge da IBM (uma IDE da dcada de 80), escrita em Smalltalk. Na dcada de 90, o
VisualAge se tornou a IDE padro para os ambientes de desenvolvimento da IBM.
No incio dos anos 2000 surge o VisualAge for Java, e logo depois o VisualAge Micro Edition, que suportava o
desenvolvimento de aplicaes Java multi plataformas. Foi na verdade a reimplementao desta IDE em Java. Esta verso do
VisualAge evoluiu para a plataforma de desenvolvimento Eclipse que conhecemos hoje.
Em Novembro de 2001, foi formado um consrcio para o futuro desenvolvimento do Eclipse como um projeto de cdigo
aberto. Em Janeiro de 2004 a Eclipse Foundation foi criada.
Em Junho de 2004, a primeira verso oficial do Eclipse (a 3.0), foi lanada, e desde ento, sempre no final de Junho de cada
ano novas verses dos projetos da plataforma Eclipse so lanadas:
Release
Data
Verso
Projetos
Juno
Juno projects
Indigo
Indigo projects
Helios
Helios projects
Galileo
Galileo projects
Ganymede projects
Europa
Europa projects
Callisto
Callisto projects
Primeiros passos:
Agora que j temos o JDK instalado, vamos instalar a nossa IDE de trabalho, o Eclipse.
Aqui tambm, se voc no tiver problemas de espao nem de performance, opte pelo Eclipse for Java EE que o que se
encontra em ambientes corporativos. Se tiver algum tipo de limitao, opte pelo Eclipse Clssico, que menor e mais
simples.
O processo de instalao extremamente simples, basta descompactar o arquivo baixado e criar um atalho na sua rea de
trabalho para o executvel "eclipse.exe".
O diretrio padro criado ao descompactar o arquivo ZIP o "eclipse" se voc j tiver outra verso do Eclipse instalada (que
foi o meu caso), basta renomear o diretrio para "eclipseEE" por exemplo:
Ao tentar acionar o Eclipse pela primeira vez, provavelmente voc vai receber uma mensagem de erro, acusando uma falha
ao tentar criar a mquina virtual.
Isso se deve ao fato de o arquivo de configurao padro no vir com a localizao da mquina virtual Java especificada.
Para defini-la, basta editar o arquivo "eclipse.ini", e adicionar as seguintes linhas:
-vm
D:\glassfish3\jdk7\bin\javaw.exe
contedo:
-startup
plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.100.v20110502
-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
256M
-vm
D:\glassfish3\jdk7\bin\javaw.exe
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms40m
-Xmx512m
Agora sim, ao chamar o Eclipse, a tela de carga deve surgir e logo em seguida, uma janela solicitando a escolha de um
diretrio para a rea de trabalho (onde os seus projetos vo ser armazenados). Voc pode aceitar a sugesto padro ou
escolher uma outra localizao ao seu gosto.
Voc pode fechar esta tela, e a qualquer momento, abri-la novamente usando: Help Welcome, e explorar todo o seu
contedo com calma.
Objetos
Objetos no mundo real so facilmente identificveis: conceitualmente falando, pessoas, carros, bicicletas, gatos, so todos
objetos, com caractersticas diferentes. No universo da programao, objetos so uma coleo de peas de software que
possuem estado e comportamento relacionados. Neste contexto, Classes so plantas baixas ou prottipos, a partir das quais,
os objetos so criados.
Classes Java
Uma Classe Java que pode servir de base para criar e atuar em objetos do tipo "bicicleta".
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
view raw
test/ Contendo os cdigos fonte e demais recursos necessrios aos Testes da Aplicao
package com.iniciantes.java.tutorial;
public class Controle {
public void movimentaMagrela() {
Bicicleta magrela = new Bicicleta(10,10,10);
magrela.aumentaVelocidade(15);
magrela.setMarcha(4);
magrela.acionaFreio(20);
magrela.setMarcha(2);
magrela.setCadencia(5);
}
}
view raw
A nossa Aplicao
Durante o curso, estaremos desenvolvendo uma aplicao simples para controle de emprstimo de livros de uma "biblioteca
entre amigos". A aplicao vai registrar livros, amigos e quais amigos pediram emprestado quais livros.
Para tal, vamos usar 3 classes:
Pessoa: nome e numero mximo de livros que esta pessoa pode pedir emprestado.
Livro: ttulo, autor, pessoa com quem est emprestado.
Biblioteca: lista de livros e lista de pessoas que podem emprestar livros.
Repare que se voc, assim como eu, instalou e configurou a verso mais atual do JDK, pode ocorrer algum tipo de
incompatibilidade.
Se for este o caso, escolha uma verso mais antiga que seja compatvel.
Podemos sempre tentar resolver os problemas usando: Boto direito do mouse sobre a linha do problema Quick Fix
Na opo "Java Build Path", na aba "Libraries", vamos selecionar a JRE disponvel e acionar o boto "Edit"
Seguindo o padro de nomenclatura anteriormente citado, vamos criar o pacote com o seguinte nome:
"com.iniciantes.java.tutorial"
A linha identificada com o nmero 1 registra o nome do pacote onde a classe est localizada.
A linha identificada com o nmero 2 registra a assinatura da Classe.
A estrutura de diretrios que d suporte ao nosso projeto neste momento a seguinte:
Com a classe pessoa criada, o prximo passo : definir os atributos que vo caracterizar os objetos pertencentes a esta
Classe.
Repare o asterisco antes do nome do arquivo. Ele indica que o arquivo foi alterado e ainda no foi salvo.
A linha identificada com o nmero 1 um comentrio simples (uma nica linha).
As linhas identificadas com os nmeros 2 e 4 so as definies dos atributos propriamente ditos.
O grupo de linhas identificado com o nmero 3 um comentrio composto de vrias linhas.
Tipos de dados primitivos do Java:
Tipo
Descrio
Caractere em notao Unicode de 16 bits. Serve para a armazenagem de dados alfanumricos. Tambm pode ser usado como um
dado inteiro com valores na faixa entre 0 e 65535.
byte
Inteiro de 8 bits em notao de complemento de dois. Pode assumir valores entre -27=-128 e 27-1=127.
short
Inteiro de 16 bits em notao de complemento de dois. Os valores possveis cobrem a faixa de -2-15=-32.768 a 215-1=32.767
int
Inteiro de 32 bits em notao de complemento de dois. Pode assumir valores entre -231=2.147.483.648 e 231-1=2.147.483.647.
long
Inteiro de 64 bits em notao de complemento de dois. Pode assumir valores entre -263 e 263-1.
float
Representa nmeros em notao de ponto flutuante normalizada em preciso simples de 32 bits em conformidade com a norma IEEE
754-1985. O menor valor positivo representvel por esse tipo 1.40239846e-46 e o maior 3.40282347e+38
double
Representa nmeros em notao de ponto flutuante normalizada em preciso dupla de 64 bits em conformidade com a norma IEEE
754-1985. O menor valor positivo representvel 4.94065645841246544e-324 e o maior 1.7976931348623157e+308
A Classe String:
java.lang.String Representa Strings de caracteres.
Uma das vantagens do uso do Eclipse, que ele avalia o que digitado dinamicamente, e quando o arquivo salvo ele exibe
erros e alertas na aba "Problems".
Neste caso, repare que as palavras em Portugus esto sublinhadas em vermelho. Isto ocorre porque o dicionrio padro
em Ingls.
Alm disso, existem dois alertas sobre a criao de variveis que no esto sendo utilizadas.
Sobre os alertas, eles desaparecero na sequncia, quando forem criados mtodos que usam as variveis criadas.
J sobre o dicionrio, vamos aprender a configur-lo para Portugus.
Para isso, o primeiro passo conseguir um dicionrio em Portugus no formato adequado. Na verdade, simples, um arquivo
texto com uma palavra por linha. Eu tenho uma verso deste arquivo que voc pode baixar daqui.
Descompacte o arquivo e coloque-o no diretrio onde o Eclipse foi instalado.
Agora use: Window Preferences
Na tela seguinte, selecione: General Editors Text Editors Spelling
Altere "Platform dictionary" para "none". E em "User defined dictionary" localize e selecione o arquivo que voc baixou.
Com isso, basta fechar e abrir novamente o arquivo, que a maioria das palavras ser reconhecida. Aquelas que no forem,
devem ser includas no dicionrio, assim:
6
7
8
9
10
11
12
13
view raw
Neste exemplo, o mtodo construtor no faz nada, mas no nosso caso, vamos us-lo para inicializar os objetos do tipo
"Pessoa" criados com valores default.
Outra vantagem do uso do Eclipse, que ele pode completar o cdigo que digitamos. Por exemplo: se digitamos um abre
chaves "{" e teclamos "Enter", ele cria e identa um fecha chaves "}" automaticamente.
Outra forma de completar o cdigo no Eclipse, digitar parte de um nome definido e usar: "CTRL" + "Espao". Esta ao
apresenta uma lista de nomes definidos que comeam com a parte digitada. Bastando escolher da lista o item desejado e
teclar "Enter".
Isso completa a nossa primeira aula. Tendo criado a Classe Pessoa, com seus atributos e mtodo Construtor. Os alertas sero
resolvidos na prxima aula quando os mtodos get e set para os atributos da Classe forem criados.
Quando o Eclipse carregado, ele nos apresenta uma espcie de bancada de trabalho (Workbench), Esta bancada
composta de algumas reas que vamos explorar um pouco na sequncia, mas a principal delas, claro, a do Editor.
Um duplo click na aba do arquivo sendo editado, maximiza a janela do Editor fazendo-a ocupar toda a rea da bancada de
trabalho. Vamos fazer isso, e comentar um pouco mais sobre as facilidades que o editor de cdigo do Eclipse oferece.
Alm daquelas mais bsicas como colorir o cdigo, separando as palavras chave da linguagem do restante do cdigo,
identificando os comentrios, os smbolos e outras partes do cdigo, edentao e formatao automtica. Existem vrios
auxlios visuais, como por exemplo: indicador de que o arquivo foi alterado mas no foi salvo, indicadores de erros e alertas,
indicadores de fechamento de blocos, e muitos outros.
Para mudar as configuraes do Eclipse em geral, normalmente existe mais de uma opo. Como exemplo, vamos alterar
uma caracterstica do editor que vai ser necessria, principalmente quando for necessrio usar o modo de debug. Exibir o
nmero das linhas do cdigo.
Para isso, temos duas opes:
1. Da barra de Menu, "Window" "Preferences..."
2. Na opo "General" "Editors" "Text Editors", marque o checkbox "Show line numbers".
1. CTRL+3
2. Digite: "line numbers"
3. ENTER
Usando esta ltima opo, temos:
E como resultado:
1.
2.
3.
4.
5.
6.
Cada uma destas reas pode ser configurada para exibir uma ou mais Vises (Views), a distribuio destas reas e os seus
respectivos contedos, vo compor uma Perspectiva (Perspective) do Eclipse para uma tarefa especfica. A perspectiva Java
por exemplo, visa facilitar o processo de codificao. Uma outra grande vantagem do Eclipse, que voc pode criar e salvar
novas perspectivas totalmente personalizadas.
A ttulo de exemplo, vamos abrir a perspectiva "Java Browsing" e observar como so distribudas as views que a compem
pela rea de trabalho do Eclipse.
Minha sugesto que voc procure alterar esta perspectiva de forma semelhante (no necessariamente igual), ao exemplo
abaixo, e salv-la com o seu nome para uso futuro.
De volta ao Java
Convm falar sobre alguns smbolos especiais da linguagem Java.
; - delimitador de comando
{ e } - delimitadores de bloco
( e ) - delimitadores de parmetros de mtodos
// - incio de comentrio
/* e */ - delimitadores de bloco de comentrio
= - operador de atribuio
Mtodos Java
Falando em termos de orientao a Objetos, um mtodo representa uma operao num objeto em particular. Sendo um
objeto uma instncia de uma Classe, quando definimos uma Classe, definimos os seus atributos atravs de variveis e seu
comportamento atravs de mtodos.
Aqui est um exemplo de uma tpica declarao de mtodo em Java:
public double calculaVoo(double envergadura, int motores,
double tamanho, double tonelagem) {
// faz o calculo complicado aqui.
return 10L;
}
1
2
3
4
5
view raw
Para declarar um mtodo, os nicos elementos necessrios so: o tipo de retorno, o nome do mtodo, um par de parnteses e
um corpo delimitado por chaves.
De maneira mais formal, seguem todos os elementos que podem vir a compor a declarao de um mtodo em Java:
1.
2.
3.
4.
Modificadores tais como: public, private, e outros que voc ver no futuro.
O tipo de dado retornado pelo mtodo, ou void se o mtodo no retornar um valor.
O nome do mtodo seguindo as regras de nomes de campos, mas com uma conveno um pouco diferente.
A lista de parmetros separados por vrgula, precedidos dos seus respectivos tipos de dado, delimitados por
parnteses, (). Se no houver parmetros, deve-se usar, os parenteses vazios.
5. Uma lista de possveis excees, que voc tambm ver no futuro.
6. O corpo do mtodo, com todo o seu cdigo delimitado por chaves, incluindo a declarao de variveis locais ao
mtodo.
Repare que imediatamente aps salvar o cdigo alterado, os contedos das Views "Package Explorer" e "Problems" so
alterados de acordo. Na primeira, a referncia ao novo mtodo surge. E na segunda, a referncia ao alerta de falta de uso do
atributo "nome" desaparece, enquanto a referncia ao mesmo tipo de alerta para o atributo "maxLivros" permanece.
Para criar o prximo mtodo, vamos usar a facilidade de "completar o cdigo" que o Eclipse nos d, assim:
Com esta combinao, o Eclipse nos d uma matriz para a criao de um mtodo pblico. Na sequncia, usando a tecla
TAB, vamos alterando os prximos elementos da matriz fornecida, assim:
Ento depois de preencher: o tipo de retorno, o nome, o parmetro e teclar TAB mais uma vez, estamos prontos para digitar
o cdigo que vai compor o mtodo.
Apesar de ter sido usada a facilidade de "completar cdigo" do Eclipse, estes dois primeiros mtodos foram criados
praticamente de forma manual. No entanto, O Eclipse possui uma facilidade ainda maior neste sentido, podendo gerar os
mtodos "getters" e "setters" automaticamente para ns. Vamos fazer uso desta facilidade para gerar os mtodos para o
atributo "maxLivros", assim:
Na Janela apresentada, selecionamos os campos para os quais queremos gerar os mtodos e acionamos o boto "OK".
Existem algumas diferenas entre os mtodos get e set que ns criamos e estes ltimos criados automaticamente pelo Eclipse:
a primeira o tipo de dado sendo tratado. A segunda o uso do qualificador "this", que indica a instncia corrente do
objeto, que um comportamento padro, por isso no o usamos anteriormente. Outro detalhe que o eclipse usa como
nome da varivel do parmetro do mtodo "set", o mesmo nome da varivel da classe, assim:
Revisando, uma Classe Java deve conter Atributos e Mtodos, definindo suas Caractersticas e seu Comportamento:
1.
2.
3.
4.
Campos de dados
Mtodos Construtores para criar objetos
Mtodos getters e setters para trabalhar as caractersticas do objeto
Mtodos de comportamento. A lgica de negcio propriamente dita
Reparem que se for retirado o qualificador "this" na instruo de atribuio do mtodo "setMaxLivros", um alerta exibido.
Isto se deve ao fato de o Java no saber mais se se trata de um atributo da classe ou uma varivel local. Para evitar este
problema, podemos manter o nome da varivel do parmetro igual ao do atributo retornando o qualificador "this", ou mudar
o nome da varivel do parmetro.
Para manter o padro usado no atributo "nome", vamos usar esta segunda opo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.iniciantes.java.tutorial;
public class Pessoa {
// Atributos
private String nome; // nome da pessoa
/* Nmero mximo de Livros que
* uma pessoa pode pedir emprestado
*/
private int maxLivros;
// Construtor
public Pessoa() {
nome = "Nome Desconhecido";
maxLivros = 3;
}
// Mtodos
public String getNome() {
return nome;
}
public void setNome(String outroNome) {
nome = outroNome;
}
public int getMaxLivros() {
return maxLivros;
}
public void setMaxLivros(int outroValor) {
maxLivros = outroValor;
}
}
view raw
Caso exista alguma diferena, volte e faa uma reviso nas duas primeiras aulas.
O que o Scrapbook?
Nesta aula, vamos explorar um pouco as caractersticas da Classe Pessoa usando o Scrapbook do Eclipse. O Scrapbook
uma "joia" escondida no Eclipse, principalmente para os iniciantes em Java, pois permite explorar as instrues Java de
forma interativa e ver o que cada uma delas faz internamente.
Usando o Scrapbook
Para usar o Scrapbook, devemos criar uma pgina de Scrapbook, que permite executar comandos e expresses Java sem
precisar criar um programa para isso.
Para criar uma pgina de Scrapbook, vamos fazer assim: Boto direito do mouse sobre o projeto New Other.
Na janela de "Wizards" que apresentada, selecione: Java Java Run/Debug Scrapbook Page Next.
Codificando e Inspecionando
Vamos comear claro, com algo bem simples:
Temos algumas alternativas para inspecionar o resultado de expresses como esta. Vamos comear, usando o menu da
seguinte forma: Selecione o texto da expresso desejada:
Os espaos entre os argumentos e operadores nas expresses Java, no tem significado para o compilador, portanto,
"2+2" e "2 + 2", so tratados exatamente da mesma forma.
Vamos ver agora um trecho de cdigo sendo inspecionado:
Ocorre que eu esqueci de encerrar o comando "a = a * 10" com um ";". Vamos corrigir isso e tentar novamente.
Vamos agora inspecionar uma expresso Java para criar um objeto do tipo Date "new java.util.Date()", assim:
Reparem que: na janela de inspeo, temos acesso a todos os atributos do objeto criado.
J para avaliar trechos de cdigo Java, devemos usar a opo Run Execute, ou ento:
Existem vrios pacotes criados por terceiros disponveis para uma aplicao Java. Sendo assim, nada impede de algum
ter criado uma outra Classe chamada Pessoa com caractersticas e comportamentos diferentes dos da Classe que ns
criamos. A criao e uso de pacotes facilita a identificao de classe de mesmo nome mas com caractersticas diferentes.
No nosso caso, quando mencionamos no nosso projeto a Classe "Pessoa", o compilador entende:
"com.iniciantes.java.tutorial.Pessoa".
Para que possamos portanto, fazer experincias com a Classe Pessoa no nosso Scrapbook, devemos importar o pacote
onde est localizada a Classe.
Vamos aproveitar e conhecer os botes da barra de ferramentas usados nas operaes do Scrapbook:
Usando o boto de configurao dos imports, vamos importar para o nosso Scrapbook o pacote da classe Pessoa.
Agora, o nosso Scrapbook entende que: quando mencionamos a Classe "Pessoa", estamos na verdade nos referindo a:
"com.iniciantes.java.tutorial.Pessoa".
Isso feito, podemos comear nossas experincias com a Classe Pessoa.
Vamos comear, criando um objeto (instncia da Classe) do tipo "Pessoa", com a seguinte instruo:
Pessoa p = new Pessoa();
Sendo:
"Pessoa": o tipo do objeto que est sendo criado (a Classe do objeto).
"p": a varivel que vai representar o objeto (instncia da Classe) que est sendo criado.
"new": palavra reservada de Java que instrui o compilador a criar um novo objeto do tipo desejado.
"Pessoa()": mtodo construtor da Classe, a ser usado na criao do objeto.
Para permitir a inspeo desta instruo, precisamos complementar este trecho de cdigo com a simples meno da
varivel "p", para que observemos o seu contedo, assim:
Podemos observar que: uma vez criado, o objeto assume as caractersticas definidas no mtodo construtor padro da
Classe Pessoa, ou seja:
maxLivros = 3
Alguns destes mtodos, foram criados por ns, como se pode ver no exemplo. Mas por outro lado, podemos ver vrios
outros que no foram criados por ns. De onde eles surgiram?
Na verdade, aqui podemos observar pela primeira vez um exemplo de "herana" em Java. Todas as Classes Java, so
subclasses da Classe "Object", portanto, todas as Classes Java, herdam os mtodos da Classe "Object". A Classe "Object"
pode ser considerada o "Poderoso Chefo" das Classes, ou "a Classe de todas as Classes".
A forma de chamar um mtodo de um objeto em Java, usando o ".", logo depois do nome da varivel que representa o
objeto. Quando usamos o "." no Eclipse, ele nos abre uma lista dos mtodos conhecidos daquele objeto para que
possamos escolher o que desejamos usar no momento.
Vamos comear nossas experincias, mudando o nome padro do objeto pessoa que acabamos de criar, assim:
Reparem que o Eclipse possui um sistema de ajuda instantneo, e j indica o tipo de dado que precisa ser passado para o
mtodo.
Prosseguindo temos o seguinte:
Inspecionando...
A ttulo de aprendizado, vamos ver uma outra forma de exibir o resultado, usando um mtodo "get" e usando a opo de
"Exibir o Resultado da Avaliao", assim:
Ainda a ttulo de aprendizado, vamos simular um erro e observar como o Eclipse lida com isso.
Vamos supor que ao tentar verificar o resultado da aplicao do mtodo "getMaxLivros()", tenhamos esquecido de
digitar o "()", assim:
Neste caso, informando que: devido ausncia do (), o nome "getMaxLivros", foi entendido como sendo um possvel
nome de varivel, e como no existe nenhuma varivel definida com este nome, o compilador simplesmente no
consegue "resolver" este nome.
O Eclipse portanto, no s ajuda evitando que voc precise digitar muita coisa, mas tambm ajuda quando ocorrem erros
de digitao, como no exemplo acima.
Testes de software
O assunto desta aula sobre testes. Teste de software um dos assuntos mais ricos e controversos que temos na rea de de
desenvolvimento de software e at no gerenciamento de projetos de software. Sendo assim, acabei por criar uma pgina
especfica para tratar deste assunto, de forma mais abrangente, indo alm de Java e JUnit. Esta pgina, pode ser acessada
aqui.
O que o JUnit?
O JUnit um framework de suporte a testes automatizados para a linguagem de programao Java. Ela tem sido importante
na popularizao do Test Driven Development (TDD) ou "Desenvolvimento Orientado a Testes".
Obtendo o JUnit
O JUnit, pode ser obtido no site da JUnit.org. Mas na prtica, no caso dos usurios do Eclipse, ele j vem disponvel como
um plugin, possuindo sua prpria View, a qual podemos exibir usando:
Window Show View Other, e na janela que se abre, selecionar Java JUnit.
Vamos ento criar uma pasta no mesmo nvel da pasta "src", com o nome "test". Vamos fazer da seguinte forma: Boto
direito do mouse sobre o projeto New Source Folder
Na janela que se abre, digitar o nome da pasta ("test" neste caso) e acionar o boto "Finish".
Para manter a organizao, vamos querer que as nossas Classes de teste fiquem sob os mesmos pacotes que as Classes sendo
testadas. Sendo assim, vamos criar o mesmo pacote sob a pasta "test" que acabamos de criar.
Para isso, vamos selecionar a pasta "test".
E na janela que se abre, digitar o mesmo nome de pacote usado na pasta "src", assim:
Obtendo:
O menu flutuante, usando o boto direito do mouse, tambm sobre um item selecionado:
Na janela que se abre, vamos digitar um nome para a nossa Classe de teste. Um padro que pode e deve ser seguido aqui :
usar para o nome da Classe de teste, o nome da Classe sendo testada, seguido do sufixo "Test". Alm disso, necessrio
digitar o nome da Classe sendo testada. Teremos portanto, a tela assim:
A tela no exibe nenhum erro ou alerta. Tudo est certo, pois o JUnit 4 j est disponvel nesta instalao. A ttulo de
aprendizado, vamos alterar a verso do JUnit para 3 e observar o que acontece:
Reparem que agora surge um alerta indicando que a Super Classe "TestCase" do JUnit no existe. Isso se deve ao fato de o
pacote (JAR) do Junit 3 no estar configurado no "caminho de construo" (build path) do projeto. O "build path" indica a
localizao de todas as bibliotecas externas necessrias compilao da aplicao. O JUnit uma dessas bibliotecas
externas, da a necessidade de uma referncia a ela constar no "build path".
Vamos ignorar isso no momento e seguir adiante com o boto "Next".
Na tela que se segue, podemos escolher os mtodos para os quais vamos gerar cdigo de teste. No s mtodos da Classe
Pessoa, como tambm os mtodos da Classe Object, da qual a Classe Pessoa herda. Vamos escolher no momento, o mtodo
construtor da Classe Pessoa e tambm os mtodos "set", assim:
Ao acionar o boto "Finish", o eclipse abre uma outra janela, dando chance de resolver o problema detectado
anteriormente, adicionado o JUnit 3 no "buid path". Vamos, mais uma vez, ignorar este problema selecionando a opo "Not
now" e acionado o boto "OK".
Como era de se esperar, a nossa classe de teste foi criada, porm surgem vrias indicaes de erro. Vamos analisar cada uma
destas indicaes:
1. No Package Explorer, podemos ver que o projeto como um todo, est marcado com erro, porque alguma parte
dele est com erro. Neste caso, a classe "PessoaTest" dentro do pacote "com.iniciantes.java.tutorial" dentro da
pasta "test".
2. Na janela de cdigo, podemos ver a nossa Classe de teste com indicaes de erro em toda linha que menciona
recursos do JUnit, inclusive no "import".
3. Na aba de "Outline", podemos ver de forma esquemtica onde ocorrem os erros no nosso cdigo.
4. Na aba "Problems", temos acesso individualizado a cada linha de cdigo causando problema, indicando sua
localizao exata.
Vamos ento usar esta ltima rea para aprender como resolver problemas no nosso cdigo com a ajuda do Eclipse.
Comeando pelo problema indicado da linha 3 (o import), vamos acionar a opo "Quick Fix", usando o boto direito do
mouse sobre ele, assim:
Podemos observar na rea inferior, na aba JUnit, o resultado da execuo de todos os mtodos de teste. Para cada um deles
a mensagem j esperada de "Not yet implemented" exibida.
O prximo passo, modificar os mtodos que foram criados automaticamente para efetivamente testar os mtodos
implementados na Classe Pessoa.
Teste de software
O que ?
A qualidade de um Software est intimamente ligada a qualidade dos testes empregados durante e aps o seu
desenvolvimento.
Teste de Software, qualquer atividade destinada a avaliar caractersticas e capacidades de um programa ou sistema, e
determinar se ele cumpre os seus requisitos. Apesar de admitido como crucial para a qualidade do software e apregoado
por desenvolvedores, o seu entendimento e aplicao permanece limitado devido a algumas dificuldades inerentes ao
processo de desenvolvimento de software.
A grande dificuldade em termos de testes comea com a complexidade da funcionalidade sendo desenvolvida. Um
correto entendimento do objetivo da funcionalidade, seus requisitos funcionais e no funcionais, as expectativas do
usurio em termos de usabilidade, produtividade e performance, so itens que vo influenciar diretamente a qualidade
do produto que ser desenvolvido e entregue.
Testar, muito mais do que simplesmente "debugar" partes da aplicao e verificar se cada mtodo que a compe est
fazendo o que dele se espera. necessrio e fundamental, perceber se a "orquestrao" destes mtodos foi feita de forma
coerente e atendendo s especificaes de necessidades e padres estabelecidos.
Tem uma frase do Robert C. Martin (o popular Uncle Bob) sobre isso que ficou muito conhecida:
"Desenvolvedor que no testa como um cirurgio que no lava as mos"
Existem fatores que influenciam a qualidade do software aos quais todo desenvolvedor deve estar atento:
Funcionamento (externo) Arquitetura (interno) Adaptabilidade (futuro)
Correo
Eficincia
Flexibilidade
Disponibilidade
Testabilidade
Reusabilidade
Usabilidade
Documentao
Manutenibilidade
Integridade
Estrutura
Fica bem claro, que os desenvolvedores em geral, se preocupam com os fatores internos durante o desenvolvimento.
Alguns at levam em conta os fatores futuros, mas poucos so aqueles que levam em conta os fatores externos. E por
incrvel que possa parecer aos desenvolvedores, so os fatores externos que causam o maior impacto, tanto para o lado
positivo quanto para o negativo. De que adianta por exemplo, entregar uma funcionalidade sem erros internos se:
Os padres de CSS e imagens definidos pelo cliente no esto sendo atendidos.
Os campos no possuem mscaras adequadas ao seu preenchimento.
O tamanho mximo dos dados dos campos no foram considerados, causando truncamento.
etc. etc. etc.
Alguns podem considerar estes problemas coisas menores, pequenas bobagens. Mas o fato que softwares entregues
com este tipo de problema, no podem sequer ser apresentados ao cliente!
claro que podemos definir alguns artefatos mnimos para a entrega de uma funcionalidade. No entanto, isso por si s,
no garante a qualidade do produto entregue.
Uma outra corrente, mais formal, prope que se codifique os testes aps o desenvolvimento da funcionalidade.
Existe um estudo de 2005, conduzido pelo NRC Institute for Information Technology sobre a eficcia do TDD,
Entendendo os requisitos
Sendo uma aplicao nova, estudar a documentao de requisitos detalhadamente. Havendo dvidas, buscar
esclarecimento diretamente com o usurio gestor ou patrocinador do projeto. Havendo necessidade solicitar a mediao
ou apoio de um analista de negcios.
Sendo uma aplicao j existente em fase de migrao ou aprimoramento, navegar pela verso atual da aplicao.
Navegar pelo projeto atual, entendendo todas as funcionalidades implementadas. Havendo dvidas, solicitar apoio de
quem conhea a verso atual da aplicao tanto no seu comportamento externo quanto no seu funcionamento interno.
Definindo o pacote da Funcionalidade
De acordo com o padro de projetos adotado, procurar separar a funcionalidade sendo implementada de maneira clara
dentro do projeto. Isso efetuado geralmente criando um pacote Java para cada funcionalidade.
Procure sempre criar um pacote especfico para mtodos e componentes de uso geral do projeto. A medida que as
funcionalidades forem desenvolvidas e implementaes relativas a uma funcionalidade se mostrarem teis a outra ou
outras, estas implementaes devem ser movidas para este pacote de uso geral e passar e ser usada de l por todas as
funcionalidades.
Iniciando a Implementao
De acordo com a maioria das frameworks Java adotadas, usando o modelo MVC, uma funcionalidade subdividida em
pacotes de implementao, separando bem as partes, assim:
Pacote
Objetivo
DAO
Acesso a dados
Facade
Lgica de Negcio
Requisitos mnimos
Existem claro aqueles requisitos mnimos que so exigidos de um desenvolvedor.
Um conjunto bastante popular hoje em dia o que fora o uso de Java doc e exige o uso de boas prticas de codificao:
Checkstyle e PMD.
Sendo esta uma prtica cada vez mais frequente, e estando o Eclipse adequadamente configurado, eu costumo adotar a
seguinte prtica: Depois de ter definido a interface (assinatura) de um mtodo, crio a interface para ele, e logo em
seguida o Java Doc correspondente. Ao criar a implementao do mtodo, basta usar a anotao "@inheritDoc". No
esquecendo de documentar os mtodos privados assim que sejam criados. Estas medidas simples evitam muita perda de
tempo quando se passa o projeto pelas ferramentas de validao.
Em relao a testes, o que considero o mnimo necessrio, so testes de JUnit para cada mtodo de acesso a dados que
for criado. Alm disso, em algumas situaes vale a pena criar testes de JUnit para os mtodos de negcio do pacote
facade.
Com a funcionalidade implementada, cabe ao desenvolvedor garantir que tudo que dela se espera, efetivamente esteja
sendo feito. No somente em termos de banco de dados, mas tambm em termos de interface. Neste momento, o
desenvolvedor deve fazer o papel de um usurio exigente, no permitindo que nenhum pequeno detalhe passe
desapercebido.
So os Testes do desenvolvedor
J a alguns anos o TDD deixou de ser o foco das atenes e passamos a conviver com o BDD (Behavior Driven
Development).
O Evan Light, deu uma outra interpretao a sigla TATFT, que eu tambm gosto muito.
Resumindo:
No incio, era o "pseudo cdigo"
Depois, vieram os "testes unitrios"
Depois, veio o "escrevendo testes antes"
Que evoluiu para o "Test Driven Development"
Depois, veio o movimento "think different"
Depois, veio o "Behavior Driven Development"
Por consequncia: "it.should become(:a_self_improving_feedback_loop)"
O que nos leva a: "you should THINK all the fucking time"
JUnit Bsico
Neste tpico vamos comear com um exemplo simples para ilustrar os conceitos bsicos envolvidos nos testes com
JUnit.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.iniciantes.java.tutorial;
import junit.framework.TestCase;
public class SimpleTest extends TestCase {
public SimpleTest(String name) {
super(name);
}
public void testSimpleTest() {
int answer = 2;
assertEquals((1+1), answer);
}
}
view raw
import junit.framework.*;
Como ns estamos usando recursos criados pela equipe do JUnit, precisamos importar as classes que desejarmos usar. A
maioria reside no subdiretrio "framework", da a necessidade do comando import.
A nossa Classe de teste precisa definir seus prprios mtodos para ter qualquer utilidade para ns. Sendo assim, ela
estende a Classe "TestCase" a qual vai nos permitir criar nossos prprios mtodos de teste.
Todo teste, recebe um nome para que quando observamos o resultado geral de todos os testes possamos distinguir qual
teste gerou o erro se for o caso. O mtodo construtor prov esta funcionalidade passando o parmetro recebido para a
Classe pai.
Este no momento o nico teste constante do nosso "TestCase". Poderiam haver mais, tantos quantos voc quisesse.
Voc pode ver que podemos definir variveis e efetuar clculos como qualquer outro programa Java.
Vamos ver o resultado da execuo deste teste, usando: boto direito do mouse sobre a Classe de teste Run As JUnit
Test
Se alterarmos o valor da varivel "answer" para algo diferente de "2" e executarmos o teste novamente, vamos obter um
erro, assim:
Este teste simples, testa se 1+1 igual ao valor de answer. Este apenas um exemplo de teste extremamente simples.
Normalmente, o que desejamos testar o resultado de algum mtodo. Por exemplo, um mtodo que remova todos os
caracteres "a", de um String. Voc pode test-lo assim:
public void testStringStripFunction() {
String expected = "bb"
StringStripper stripper = new StringStripper();
assertEquals(expected, stripper.stringStrip("aabaaaba"));
}
O que pode fazer o "assertEquals" falhar se o mtodo StringStripper no se comportar como esperado. Assim, podemos
tentar corrigir o mtodo e executar o teste novamente at que ele tenha sucesso.
Ele deve inicializar uma nova instncia da Classe Pessoa com "Nome Desconhecido" para o atributo "nome" e "3" para o
atributo "maxLivros". O que precisamos fazer criar um mtodo de teste que verifique se estes valores esto corretos.
Vamos usar alguns assistentes do Eclipse para nos ajudar a criar este teste, assim:
No mtodo "testPessoa()" retiramos a chamada do mtodo "fail" e digitamos a instruo "new" + CTRL + Espao, o que
nos apresenta o seguinte:
Vamos agora alterar cada um dos parmetros, usando a tecla TAB para navegar entre eles, o que nos leva ao seguinte:
Agora, temos definida uma instncia "p1" da Classe Pessoa. Reparem no alerta esquerda da linha 8. Ele indica que a
varivel "p1" no est sendo usada.
Se uma nova instncia da Classe Pessoa foi criada, o seu mtodo Construtor foi executado. Vamos agora complementar
o nosso teste verificando se os valores dos atributos esto com os valores esperados, usando o mtodo "assertEquals" do
JUnit, assim:
Para completar, vamos corrigir o erro indicado colocando o ";" ao final da linha, e adotar o mesmo procedimento para o
atributo "maxLivros". O que nos leva ao seguinte:
O que estamos fazendo aqui : verificando com o mtodo "assertEquals" se os atributos esto com os valores esperados
depois que o mtodo Construtor da Classe Pessoa foi executado.
Mas de onde vem o mtodo "assertEquals" ? Ele vem da Classe "TestCase" que a Super Classe da nossa Classe
"PessoaTest". E por que este mtodo no pode ser chamado da seguinte forma:
PessoaTest pt = new PessoaTest();
pt.assertEquals(...);
A resposta que o mtodo "assertEquals" um mtodo esttico (cuja declarao deve conter o modificador static). Um
mtodo esttico, no pertence a nenhuma instncia de uma Classe, e sim Classe como um todo.
A sintaxe de uso de um mtodo esttico, a seguinte: <Classe>.<mtodo>, o que nos levaria ao seguinte:
PessoaTest.assertEquals(...), sendo que o nome da Classe opcional dentro da mesma Classe. O Eclipse nos ajuda a
diferenciar os mtodos estticos, exibindo-os em itlico.
Vamos agora executar os testes novamente, usando o boto "Rerun Test":
Reparem que foram executados 3 de 3 testes. Destes, 2 falharam e um foi bem sucedido. Aquele sobre o mtodo
Construtor que acabamos de implementar. Ele foi bem sucedido, pois os valores dos atributos da instncia "p1" da
Classe Pessoa, foram atribudos pelo mtodo Construtor conforme o esperado.
Usando os mesmos passos, vamos implementar o mtodo de teste para o mtodo "setNome" da nossa Classe Pessoa,
obtendo o seguinte:
Agora, 2 dos testes foram bem sucedidos (os que implementamos), apenas um continua falhando. Vamos cuidar dele em
seguida.
Mais uma vez, usando os mesmos passos, vamos implementar o mtodo de teste para o mtodo "setMaxLivros" da nossa
Classe Pessoa. A ttulo de aprendizado, vamos forar um erro, usando um nome de varivel no definido. Teremos o
seguinte:
Mais uma vez, a ttulo de aprendizado, vamos forar um erro no teste do mtodo "setNome", e ver o que acontece:
Reparem no boto "Compare Actual With Expected Test Result" direita. Se acionado, ele exibe uma janela com as
diferenas entre o que era esperado pelo seu teste e o que foi obtido do mtodo sendo testado, assim:
Agora, basta voltar o teste sua condio anterior, onde todos os mtodos passam.
como se a codificao dos testes (ou comportamentos) representasse a especificao em cdigo da funcionalidade. E a
codificao da funcionalidade vai ento atender exatamente a especificao. Simples assim!
No nosso caso, vamos escrever nosso mtodo de teste unitrio antes de escrever o mtodo sendo testado. O Eclipse
possui um excelente suporte ao uso de TDD.
O mtodo toString()
Nossa prxima tarefa vai ser sobrepor o mtodo "toString". Vamos revisar algumas de suas caractersticas:
Ele herdado da Classe Object
Ele retorna a representao em String de um Objeto
Ele normalmente criado para todas as Classes
Vamos voltar nossa pgina de Scrapbook e ver o que este mtodo faz:
Preparando o cdigo assim:
Reparem que a nossa Classe Pessoa, est ali identificada (id=47). Mas de forma geral, estas informaes no so muito
teis. Isso se d, porque este mtodo herdado da Classe Object, e a Classe Object no "conhece" nada sobre a nossa
Classe Pessoa.
Em geral, quando criamos uma nova Classe, gostaramos de modificar o mtodo "toString" para melhor representar os
objetos da nossa Classe.
O que vamos fazer, chamado de "Override" de mtodo, ou seja, vamos "escrever por cima" de um mtodo j existente.
No estaremos criando um mtodo novo, mas sim aplicando um novo comportamento um mtodo j existente que a
nossa Classe est herdando de Outra.
Aplicando o TDD
Neste ponto, poderamos simplesmente abrir a nossa Classe Pessoa e comear a escrever cdigo novo. No entanto,
vamos aplicar a metodologia de TDD, e para isso, vamos recapitular o que esta metodologia prope:
1.
2.
3.
4.
5.
De volta nossa Classe de teste, vamos escrever um mtodo para testar a nossa verso do mtodo "toString". Mas
cumprindo o item 1 da metodologia, vamos pensar em: qual o comportamento desejado para "o nosso" mtodo
"toString" ?
1 - Um objetivo prtico, seria que o nosso mtodo "toString" retornasse o nome e o nmero de livros de uma
determinada pessoa da seguinte forma:
Romer Simpson (9 livros)
2 - Vamos escrever um caso de teste para isso na Classe "PessoaTest". Estaremos usando as facilidades j vistas
anteriormente, obtendo o seguinte resultado:
Este mtodo por si s, serve como documentao do nosso mtodo "toString". Se algum alterar o comportamento do
nosso mtodo "toString" e esquecer de alterar este teste, ele vai falhar, indicando que a documentao no est mais em
conformidade com a implementao.
3 - Vamos agora escrever a nossa verso do mtodo "toString"na Classe "Pessoa". Estaremos mais uma vez usando as
facilidades j vistas anteriormente, obtendo o seguinte resultado:
Ao salvar as alteraes, exibida uma tela de alerta indicando que uma parte do cdigo em memria no pode ser
atualizado, assim:
Isso ocorre porque o Scrapbook usa o modo Debug do Eclipse, e neste modo as alteraes feitas no cdigo quando
salvas, no substituem automaticamente o que est em memria.
4 - O prximo passo, executar os testes e ver o que acontece.
Todos os testes passaram, e era isso que pretendamos. Observem que existe um alerta na Classe Pessoa, indicando que o
nosso mtodo "toString" se sobrepe ao mtodo original, assim:
Fazer uso diretamente dos nomes dos atributos no lugar dos respectivos mtodos get, desta forma:
Pode nos causar restries no futuro. Imaginem a seguinte situao: algum resolve separar o atributo nome nos
atributos primeiroNome e sobreNome.
Da forma que fizemos, isso iria requerer uma alterao no nosso mtodo toString da Classe Pessoa. J se tivssemos
usado os mtodos get desta forma:
Na janela que apresentada, vamos informar o nome da nossa Classe de teste, deixando o nome da Classe sendo testada
vazio, pois ele ainda no existe, claro.
Vamos falar rapidamente sobre a Classe Livro. Quais so os atributos necessrios nossa Classe Livro?
ttulo. (por exemplo: "Menino Maluquinho")
autor. (por exemplo: "Ziraldo")
Pessoa que possui o Livro. (objeto do tipo Pessoa)
Vamos mais uma vez usar as facilidades do Eclipse para nos ajudar neste processo.
Primeiro, vamos criar o mtodo testLivro para testar o mtodo Construtor. Lembre-se: basta comear a digitar o
modificador "public" e CTRL+Espao, assim:
Vamos seguir adiante usando as facilidades do Eclipse para criar uma instncia da Classe Livro. Para isso, basta digitar
"new" e CTRL+Espao, assim:
Reparem que: desta vez o nosso mtodo construtor recebe como parmetro o nome do Livro.
Completando com os mtodos de teste propriamente ditos, teremos:
Reparem que a Classe de teste apresenta um erro de compilao. Claro, pois a Classe Livro, ainda no existe. Mas
mesmo assim, o Eclipse nos permite executar os testes, ento vamos fazer isso e ver o que acontece, assim:
Resultando no seguinte:
Na janela que apresentada, precisamos alterar a pasta onde a Classe vai ficar localizada, pois o valor default usado o
mesmo local da Classe de teste, e no isso que desejamos.
Gerando o seguinte:
Gerando o seguinte:
Mais uma vez, salvando a Classe Livro alterada, podemos cuidar do prximo erro:
Agora que a nossa Classe de teste no tem mais erros de compilao, podemos voltar nossa ateno para a Classe Livro
propriamente dita, e escrever o nosso mtodo Construtor.
Mas reparem, que ao gerar o nosso mtodo Construtor de forma automtica, o Eclipse colocou l um comentrio
especial, comeando pela palavra chave "TODO", que indica uma tarefa pendente.
Mais uma facilidade do Eclipse, uma view que exibe todas as tarefas pendentes. Vamos acion-la, assim:
Vamos ento executar a tarefa pendente e implementar o nosso mtodo Construtor da Classe Livro, assim:
Reparem que o nome do autor no o esperado, pois espervamos por "Ziraldo", mas o mtodo construtor gera "Autor
Desconhecido" por default.
Para corrigir esta situao, devemos poder definir o nome do autor, vamos ento implementar os mtodos get e set que
vo nos permitir manipular os atributos da Classe Livro.
Para isso, vamos mais uma vez, usar as facilidades que o Eclipse nos d, assim:
Na janela que se abre, vamos selecionar os mtodos get e set para o atributo autor, j para o atributo ttulo, apenas o get,
visto que podemos definir o ttulo diretamente no mtodo Construtor, assim:
De volta ao nosso mtodo de teste, podemos definir o nome do autor correto, assim:
Portanto, vamos revisar como foi criada a Classe Livro usando TDD:
1.
2.
3.
4.
5.
6.
Neste mtodo, vamos criar um objeto do tipo Livro e outro do tipo Pessoa, assim:
Em seguida, usamos um novo mtodo para definir para quem o Livro vai ser emprestado, e preparamos o teste do
mesmo, da seguinte forma:
Reparem nos indicativos de erro em relao ao fato de o mtodo "setPessoa" ainda no existir.
Como estamos lidando com um treinamento aqui, e considerando que comparar objetos em Java um tanto mais
complicado. Ao invs de verificar se o objeto Pessoa retornado pelo mtodo "getPessoa" igual ao objeto p2 definido
anteriormente, vamos comparar apenas os nomes, assumindo que cada Pessoa tem um nome nico.
Na sequencia, vamos usar o "Quick Fix" do Eclipse para criar estes mtodos, posicionando o mouse sobre o erro e
selecionando a opo "Create method":
Vamos agora completar o contedo real dos mtodos criados. Primeiro o mtodo set:
Reparem que o Eclipse alerta de que o campo "pessoa" no est definido na Classe Livro.
Mais uma vez, vamos usar o "Quick Fix" do Eclipse para corrigir isso, selecionando a opo "Create field", obtendo o
seguinte:
O que indica ter sido criado o campo "pessoa" do tipo (Classe) "Pessoa". A diferena sutil, apenas uma letra maiscula
ou minscula distingue o nome de um campo do nome de uma Classe.
Notem tambm que o Eclipse criou o campo "pessoa" usando a palavra "private" no incio de definio.
As palavras "private", assim como "public", neste contexto, so chamados "modificadores de acesso", indicando o
escopo de abrangncia do objeto sendo definido.
No caso, o nosso campo "pessoa" vai ser "visvel" apenas dentro do escopo desta Classe onde ele est sendo criado.
Modificadores de Acesso
Em Java existem 4 modificadores de acesso:
1.
2.
3.
4.
Sabendo disso, e se queremos que estes campos estejam disponveis para outras Classes deste "pacote" vamos retirar os
modificadores de acesso, ficando assim:
Vamos agora completar o mtodo get, retornando o objeto do tipo Pessoa j definido para a Classe Livro:
Salvando tudo que foi feito at aqui, estamos prontos para executar o nosso teste.
Desta vez, podemos experimentar a combinao de teclas de atalho do Eclipse para este fim. Voc pode estar com outra
Classe aberta na rea de edio, contanto que a Classe cujos testes voc deseja executar esteja selecionada no "Package
Explorer", assim:
Usando a combinao de teclas: Alt + Shift + X, T, os testes de JUnit sero executados sobre a Classe que estiver
selecionada no "Package Explorer".
O que neste caso, vai nos dar o seguinte resultado:
Refatorao
Vamos aproveitar para falar um pouco sobre "refactoring". Pois no podemos esquecer ele, um dos passos da
metodologia TDD que estamos aplicando aqui.
comum a todo artista durante o desenvolvimento da sua obra, tentar melhorar o resultado final. Reescrever um cdigo
que j funciona com o intuito de melhor-lo faz parte da "arte de programar". Desculpem-me alguns gerentes de projeto,
mas prefiro tratar os bons desenvolvedores como "artistas" do que como "operrios".
Podemos dar aqui um exemplo bem simples de refatorao. Voltando nossa Classe LivroTest, reparem no seguinte
trecho de cdigo:
Ele possui algumas deficincias tais como: Uso de variveis desnecessrias e nomes no representativos (quem est com
o livro no necessariamente o seu dono).
Primeiro vamos comentar o cdigo atual que vamos refatorar usando o atalho: CTRL + Shift + C, lembrando que ele
do tipo on/off, ou seja, cada vez que acionado, comenta ou descomenta o trecho de cdigo selecionado:
Salvando tudo e executando os testes novamente, devemos ter o mesmo resultado de sucesso de antes.
E assim sendo, podemos remover o cdigo anterior que foi comentado, ficando assim:
Vamos entender um pouco mais sobre a linha de cdigo que acabamos de implementar:
String quemPegouLivro = l2.getPessoa().getNome();
Nela, estamos atribuindo varivel do tipo String "quemPegouLivro", o nome da Pessoa. Mas como?
Primeiro, usamos o mtodo "getPessoa" para obter uma instncia do objeto do tipo Pessoa a qual o livro est
vinculado.
Depois, sobre a pessoa recuperada, aplicamos o mtodo "getNome", para obter o nome da pessoa
Neste momento, ns temos duas Classes de teste: PessoaTest e LivroTest, e vamos criar mais. Seria conveniente ter uma
forma de executar todos os testes de uma s vez. Podemos obter isso criando uma nova Classe de teste que agregue as
demais.
Suite de testes
Podemos agregar vrias Classes de teste, criando uma "Suite" de testes, da seguinte forma:
Boto direito do mouse sobre o nosso pacote de testes New Other.
A prxima janela, nos permite especificar as caractersticas da nossa Suite de testes. J so exibidos valores default, e
entre eles podemos ver que as Classes de teste j existentes, esto selecionadas. Vamos aceitar estes valores default e
finalizar:
Obtendo o seguinte:
Sem entrar em maiores detalhes aqui, fica claro que medida que novas Classes de teste forem criadas, basta incluir
novas linhas relativas a elas na nossa Suite de teste.
Mais uma vez, estando com a Classe da nossa Suite de testes selecionada no "Package Explorer", vamos usar a
combinao de teclas: Alt + Shift + X, T.
Reparem que agora, executando os testes a partir da nossa Suite de testes, todos os mtodos de teste de todas as nossas
Classes de teste so executados de uma s vez.
Caractersticas de um ArrayList
Pode lidar com um nmero qualquer de Objetos numa lista
Possui mtodos j construdos para gerenciar a lista
Vamos voltar a usar o Scrapbook para nos familiarizar com a Classe ArrayList.
A Classe ArrayList est no pacote "java.util". Portanto, a primeira coisa a fazer : importar este pacote para o Scrapbook:
Em seguida:
E na sequncia:
O fato de importar o pacote "java.util", significa que podemos digitar simplesmente "ArrayList" em vez de
"java.util.ArrayList" no nosso cdigo.
O nosso prximo passo, vai ser criar um ArrayList. Fazemos isso usando o comando "new" que a essa altura j
conhecemos. sempre usando os facilitadores do Eclipse.
Sobre este assunto, cabe aqui uma dica. Aparentemente, nas verses mais recentes do Eclipse, o assistente de cdigo no
est funcionando para o comando "new" no Scrapbook. Para solucionar este problema, siga os seguintes passos:
Window Preferences Java Editor Templates. Localize o item "new", assim:
Clique "OK".
E "OK" novamente.
Isso deve fazer funcionar o "code complete" para o comando new no Scrapbook.
Onde o construtor "<String>", define para o compilador que a nossa lista s vai poder conter Objetos do ipo String. Se
tentarmos colocar qualquer outro tipo de Objeto na lista, vamos receber um erro de compilao. Caso no especificado
este construtor, a lista dar suporte a qualquer tipo de Objeto Java. Mas esta no a forma mais comum de uso.
Vamos agora adicionar elementos na nossa lista usando o mtodo "add", assim:
Convm ressaltar que os ndices das listas em Java comeam com 0 (zero).
A ttulo de aprendizado, vamos tentar adicionar um Objeto do tipo inteiro nossa lista.
Seguindo adiante, vamos criar uma pessoa e associar esta pessoa a um dos livros:
Mais uma vez, inspecionando vemos que agora existe uma pessoa associada ao livro l1:
Podemos observar aqui, a hierarquia dos Objetos envolvidos: A nossa lista (ArrayList), contm l1 (Livro) que por sua
Usando a hierarquia vista anteriormente, podemos obter a pessoa associada diretamente do Objeto livro recuperado:
E assim:
Seguindo usando o mesmo princpio, j que obtivemos um Objeto do tipo Pessoa, podemos recuperar o nome da pessoa
diretamente dele, assim:
Sendo ele o segundo elemento da lista (ndice igual a 1), lembrando que o primeiro elemento da lista possui ndice igual
a 0 (zero).
Resumindo: se sabemos o ndice, podemos obter o Objeto. Se sabemos o Objeto, podemos obter o ndice.
Isso tambm se aplica ao uso do mtodo "remove".
Inspecionando, podemos ver que a nossa lista agora possui apenas um Objeto do tipo Livro, e que ele no l1 e sim o
l2, pois o l1 acabou de ser removido:
Agora que sabemos como inserir, localizar e excluir elementos de uma lista, podemos comear a usar estas listas nas
nossas aplicaes. o que vamos fazer na prxima aula.
Library e Biblioteca
A palavra "Library" no mundo Java define um conjunto de pacotes. Poderia haver alguma confuso de nomes se
estivssemos trabalhando em Ingls, pois Classe que vai representar os Livros que temos e as Pessoas que podem pegar
os livros emprestados, deveria tambm se chamar "Library". Mas, como aqui, estamos usando nomes em Portugus, no
h nenhum problema de confuso entre "Library" e "Biblioteca", que vai ser o nome da nossa Classe.
Vamos continuar a usar a metodologia TDD. Portanto:
O nome da nossa Classe de Teste vai ser "BibliotecaTest". E vamos deixar o nome da Classe sendo testada em branco,
pois ela ainda no existe.
Obtendo o seguinte:
Vamos primeiramente criar o mtodo de teste do Construtor da Classe. Sempre usando os facilitadores do Eclipse:
Aqui vamos usar um novo tipo de teste. o "assertTrue". O objetivo aqui, vai ser verificar se a nossa instncia da Classe
Biblioteca, possui um ArrayList contendo Livros e outro contendo Pessoas. Dessa forma:
Desta forma, sabemos que o nosso mtodo Construtor da Classe Biblioteca, alm de criar a instncia da nossa
Biblioteca, vai precisar tambm adicionar a ela uma lista de Livros e outra de Pessoas.
Vamos prosseguir usando o "Quick Fix" do Eclipse para nos ajudar a criar a Classe para atender a este Teste.
Posicionando o mouse sobre o erro, temos:
Na janela que se apresenta, precisamos lembrar de alterar o nome da pasta onde a Classe ser criada para "src".
A seguir, ainda usando o "Quick Fix" do Eclipse, vamos criar o Construtor da Classe:
Gerando o seguinte:
Vamos prosseguir usando o "Quick Fix" do Eclipse para solucionar os problemas apontados na nossa Classe de teste, e
ao mesmo tempo ir completando a nossa Classe Biblioteca.
Em seguida, devemos nos preocupar com os campos "livros" e "pessoas", mas reparem que ambos so do tipo
"ArrayList", e este tipo no est sendo reconhecido pelo compilador. A soluo para isso simples, basta importar o
pacote java.util que contm este tipo de dado.
Fazendo conforme indicado, o pacote importado para a nossa Classe de teste e o erro desaparece.
No esquecendo que para que os erros desapaream da Classe de teste, a Classe Biblioteca deve ser salva a cada
alterao. E tambm que alguns desses erros, s desaparecerem, se a prpria Classe de teste for salva.
Da mesma forma, vamos fazer para o campo "pessoas".
Neste momento, com todo o trabalho feito at aqui j salvo, no h mais erros de compilao no projeto.
Lembrando tambm, que existe uma outra forma de acessar os problemas e advertncias para trat-los. a aba
"Problems", geralmente localizada na parte inferior da janela do Eclipse.
Com isso, a nossa Classe de teste pode acessar estes campos da forma correta, mas classes fora deste pacote, no podem.
A prxima interveno em relao aos campos, atender os alertas, e definir que tipo de Objeto vai ser tratado em cada
uma das Listas.
Para isso, vamos usar a aba "Problems" j citada, selecionar uma das linhas, acionar o boto direito do mouse e
selecionar "Quick Fix", assim:
Na janela que se abre, selecionamos as duas linhas com este mesmo problema, e escolhemos o ajuste
"Add type arguments to ArrayList", assim.
Mas precisamos substituir os pontos de interrogao pelos tipos de Objetos realmente desejados, assim:
Podemos agora ajustar o Construtor propriamente dito, comeando pelo nome do campo de parmetro, de "string" que
foi gerado automaticamente para "nome", que bem mais apropriado.
Em seguida, vamos atribuir o parmetro "nome" recebido, ao atributo "nome" da instncia que estiver sendo criada,
assim:
O prximo passo, criar os atributos de Livros e Pessoas da instncia no formato de Listas, assim:
Existem algumas caractersticas que devem ser ressaltadas nestas duas linhas.
livros = new ArrayList<Livro>();
pessoas = new ArrayList<Pessoa>();
Quando chamamos o Construtor de um "ArrayList" usando o comando "new", e especificamos o tipo do Objeto
especfico que queremos usando o parmetro de tipo "<Tipo>", necessrio o uso de () para finalizar o construtor de
ArrayList, pois ele no possui parmetros.
Portanto, a sintaxe do construtor nesses casos, a seguinte:
new TipoGenrico<TipoEspecfico>();
Reparem que gerado um alerta para o fato de a varivel local "livros" no ter sido usada no escopo do mtodo. Este
um erro muito comum de acontecer com iniciantes em Java, portanto, vamos evit-lo, certo?
Com a nossa Classe Biblioteca criada, hora de executar o nosso teste, e ver o que acontece.
Um detalhe que deve ser observado em relao aos testes de JUnit, que os nomes dos mtodos de teste devem comear
por "test".
Mais uma vez, a ttulo de aprendizado, vamos ver o que ocorre se isso no for feito.
Com o nome do mtodo alterado desta forma, e executando o teste novamente, teremos:
Reparem no alerta dizendo que no foi encontrado nenhum teste na Classe. Tudo por conta do nome fora do padro
esperado. Fiquem atentos!
Uma ltima observao a respeito dos testes: eles podem nos ajudar saber de antemo, qual tipo de dado suportado
por cada mtodo.
Sabemos que os livros de uma Biblioteca so do tipo ArrayList. O que acontece se algum tentar adicionar um livro
usando um tipo de dado diferente do esperado?
Reparem que gerado um erro de compilao justamente dizendo que o mtodo no se aplica ao tipo de dado passado
como parmetro, pois ele esperava um "ArrayList" e foi passado um "String".
Obtendo o seguinte:
Aprendendo e aplicando um pouco mais sobre a metodologia TDD, aps qualquer modificao como a que acabamos
de fazer, uma boa hora de reexecutar os testes para garantir que as nossas alteraes no tenham gerado nenhum erro.
A palavra de ordem : "Ficou em dvida, reexecute os testes". Portanto, vamos fazer isso.
Mais uma vez, uma das formas de se fazer isso, : com a Classe BibliotecaTest selecionada.
Como era de se esperar, os testes continuam passando, afinal era uma alterao bem pequena e foi feita usando um dos
facilitadores do Eclipse, mas serve para exercitar o uso de TDD.
O nosso prximo passo ser escrever um mtodo de teste para os mtodos responsveis por adicionar e remover Livros.
No entanto, ns vamos precisar de alguns objetos para efetuar estes testes.
Objetos do tipo Livro
Objetos do tipo Pessoa
Um Objeto do tipo Biblioteca
Para evitar duplicidade de cdigo, pois estes objetos podem ser teis em outros mtodos que ainda vo ser criados,
existe no JUnit o mtodo "setUp()", que como o nome indica usado para inicializar o nosso procedimento de teste com
tudo que for necessrio.
Na verdade, existem alguns "mtodos padro" costumeiramente usados no s na inicializao, como tambm na
finalizao e nos prprios testes com JUnit
oneTimeSetUp()
setUp()
testEmptyCollection()
tearDown()
setUp()
testOneItemCollection()
tearDown()
oneTimeTearDown()
Mas isso assunto para um curso mais avanado. No momento, vamos abrir a nossa Classe de teste "BibliotecaTest", e
cri-lo, assim:
Mas existe um problema com esta implementao. Ocorre que as variveis: l1, l2, p1, p2 e b1, so locais ao mtodo
setUp. Desta forma, elas no estariam disponveis para os demais mtodos da nossa Classe de Teste.
A soluo para isso, simples: basta passar a definio das variveis para o escopo da Classe, transformando-as em
"campos". E mais uma vez, o Eclipse nos ajuda nesta tarefa com um dos seus facilitadores.
bom que se tenha em mente, que em geral, o Eclipse os d ao menos trs formas diferentes para obter um determinado
resultado: Um usando a barra de menus, outro usando o menu de contexto no prprio cdigo fonte e um terceiro usando
teclas de atalho.
Neste caso especfico, vamos ver cada um deles.
Comeando pelo menu de contexto no cdigo:
Com a varivel l1 selecionada, acionar o boto direito do mouse sobre ela e no menu de contexto, selecionar: Refactor
Convert Local Variable to Field...
Na tela que se abre em seguida, aceitar os valores default e acionar o boto OK.
Obtendo o seguinte:
Na tela que se abre em seguida, aceitar os valores default e acionar o boto OK.
Obtendo o seguinte:
Na tela que se abre em seguida, aceitar os valores default e acionar o boto OK.
Obtendo o seguinte:
Fazendo o mesmo para as variveis: p2 e b1, usando, dos mtodos expostos o que voc julgar mais cmodo, obteremos o
seguinte:
uma dvida frequente dos iniciantes neste ponto, querer saber qual a diferena entre uma Varivel e um Campo?
Como vimos nos procedimento acima, todos so Variveis, s que: aquelas variveis definidas a nvel da Classe, so
tambm chamadas de Campos (Fields), apenas nomenclatura.
Feito isso, podemos agora criar o nosso novo mtodo de teste para a incluso de Livros.
Mais uma vez, usando os facilitadores do Eclipse, inicie a construo do mtodo pela inicializao dos objetos
necessrios, assim:
Em seguida, precisamos garantir que o objeto principal do nosso teste esteja vazio, assim:
Ocorre que: o mtodo "addLivro" ainda no existe. Vamos usar o auxlio do Eclipse para a correo de erros que aparece
na imagem acima, e criar o mtodo (vazio por enquanto) na Classe Biblioteca, assim:
Uma vez adicionados os Livros, devemos garantir que o objeto no est mais vazio e possui 2 (dois) itens, assim:
Alm disso, devemos garantir que os ndices dos objetos so os esperados, assim:
Neste momento, o mtodo "removeLivro", no existe. Vamos usar o mesmo procedimento j usado anteriormente, para
criar este mtodo vazio (por enquanto), na Classe Biblioteca, obtendo o seguinte:
Alm dos testes j efetuados, podemos ainda garantir que o ndice do segundo Livro, passou a ser 0 (zero), lembrando
que: quando havia dois objetos do tipo Livro, o primeiro tinha ndice 0 (zero) e o segundo o ndice 1 (um). Agora que
retiramos o primeiro Livro, o ndice do segundo Livro deve passar a ser 0 (zero).
Vamos verificar isso, desta forma:
Para finalizar, vamos fazer de forma semelhante o teste dos efeitos de remover o Livro que havia sobrado, assim:
Devemos ter voltado situao inicial, ou seja, o objeto deve estar vazio.
chegada a hora de implementar os mtodos que vo cuidar de adicionar e remover os Livros, na Classe Biblioteca,
assim:
Agora, devemos usar exatamente os mesmos procedimentos para criar os mtodos para adicionar e remover Pessoas,
usando claro a metodologia TDD e comeando pelos seus respectivos testes.
Sendo assim, o mtodo de teste deve ficar assim:
Com todos os mtodos prontos, devemos executar novamente os testes, neste momento, o ideal que a nossa suite de
Com a nossa Suite de testes (AllTests) alterada desta forma, podemos testar toda a aplicao e devemos obter sucesso,
assim:
Podemos verificar neste momento, usando a Viso "Outline", que a Classe Biblioteca j possui vrios mtodos
implementados:
Planejamento e Design
Como j foi mencionado, estes mtodos vo ser um pouco mais complexos, portanto, vamos cuidar do seu planejamento
e design antes de comear a codificar.
Vamos estabelecer agora as caractersticas do nosso mtodo de Emprstimo.
Deve estabelecer o objeto Pessoa no campo pessoa do Livro
Usando o mtodo setPessoa
O que acontece se o Livro j foi emprestado?
No deve permitir o emprstimo
Precisa testar isso no prprio mtodo de Emprstimo
O mtodo deve indicar sucesso ou falha de acordo com a situao
Devemos informar ao mtodo chamador se o emprstimo foi bem sucedido ou no
Sabendo de tudo isso, vamos detalhar em Pseudo cdigo, o que o mtodo de Emprstimo deve fazer:
1. Garantir que o Livro ainda no foi emprestado.
2. Se ainda no foi emprestado, atribuir uma Pessoa para o Livro e retornar para o mtodo
chamador que o emprstimo foi bem sucedido.
3. Caso contrrio, simplesmente retornar ao mtodo chamador que o emprstimo no ocorreu.
Agora que sabemos o que o mtodo deve fazer, vamos estabelecer o "como" ele vai fazer, definindo a sua assinatura:
1. Vai retornar um booleano (true ou false), indicando sucesso ou falha.
2. No Pseudo-Cdigo, foi mencionado "uma Pessoa para o Livro". Mas qual Pessoa e qual Livro?
3. Livro e Pessoa portanto, vo ser parmetros do nosso mtodo.
Sendo assim, a assinatura do mtodo seria esta:
Com tudo isso em mente, podemos iniciar a construo do nosso mtodo de teste, na Classe BibliotecaTest.
Nada de novo aqui. Usando os facilitadores do Eclipse, estamos prontos para comear.
Os primeiros passos, vo ser: Inicializar os objetos, com o j conhecido mtodo setUp(). E adicionar Livros e Pessoas
Biblioteca, assim:
Neste ponto, vamos usar uma sintaxe um pouco diferente do mtodo assertTrue do JUnit. De forma que: caso o retorno
do mtodo sendo testado seja falso, uma mensagem seja exibida, assim:
Lembrando que o mtodo "emprestimo", que ainda vamos criar, retorna um valor booleano, indicando se a operao foi
bem sucedida ou no.
Depois disso, supondo que o emprstimo tenha sido bem sucedido, devemos verificar se o nome da Pessoa atribudo ao
Livro, o que se espera, assim:
Lembrando aqui, que devemos recuperar o nome da Pessoa, e no comparar com o objeto Pessoa simplesmente. Como
j foi mencionado, comparar dois objetos em Java pode ser enganador...
Tambm supondo que o emprstimo foi bem sucedido, podemos nos certificar que: uma tentativa de emprestar o mesmo
livro vai falhar, usando agora o mtodo assertFalse do JUnit. De forma que: caso o retorno do mtodo sendo testado seja
verdadeiro, uma mensagem seja exibida, assim:
Guarde na memria:
assertTrue - d certo se o mtodo sendo testado retorna true.
Caso contrrio, emite a mensagem.
assertFalse - d certo se o mtodo sendo testado retorna false.
Caso contrrio, emite a mensagem.
Com tudo isso, o mtodo de Emprstimo est razoavelmente bem criticado.
Usando a mesma tcnica e os mesmo dados, vamos fazer as verificaes para o mtodo de Devoluo, assim:
Teremos:
Neste ponto, estamos aptos a implementar os mtodos de Emprstimo e Devoluo propriamente ditos.
Mas para isso, devemos considerar alguns detalhes
Por exemplo: o mtodo de Emprstimo, vai precisar atribuir uma Pessoa a um Livro, mas apenas se o Objeto Pessoa
estiver vazio (null).
Desta forma:
No entanto, ns no tratamos disso no mtodo de emprstimo nem nos seus respectivos testes.
Lembrou? Ento vamos cuidar disso. Mais uma vez, usando TDD, vamos comear pelos testes.
Vamos incluir mais alguns testes no mtodo testMovimentaLivro da Classe BibliotecaTest.
Desta forma:
O primeiro teste com assertTrue, garante que eu devo conseguir emprestar o Livro "l2" para a Pessoa "p1".
J o segundo teste com assertFalse, garante que eu no devo conseguir emprestar o Livro "l1" para a mesma Pessoa
Realmente, como era de se esperar, os testes falham. E emitida a mensagem de Emprstimo indevido, pois como ns
ainda no implementamos um tratamento para o limite de Livros, o mtodo conseguiu emprestar mais um Livro para a
mesma Pessoa mesmo com o limite sendo excedido.
Agora, para que possamos testar se o nmero mximo de Livros que uma Pessoa pode pegar emprestado foi atingido,
precisamos antes de mais nada saber, quantos livros aquela Pessoa j havia pego emprestado.
Fica clara a necessidade de um mtodo getLivrosPorPessoa. Tendo este mtodo, seria bastante simples obter a
quantidade de Livros, desta forma:
quantidade = b1.getLivrosPorPessoa(p1).size();
Agora reparem naquelas 4 linhas do mtodo testMovimentaLivro, ns j as havamos usado mais acima, e vamos precisar
usar novamente neste novo mtodo.
Isso chamado de: redundncia de cdigo. Para evitar esse tipo de situao, assim que uma repetio de um
determinado trecho de cdigo detectada, devemos procurar transformar o contedo deste trecho, num mtodo parte.
mais um caso de Refatorao de Cdigo, como vimos no item 12, aula 08.
Nesses casos, mais uma vez, os facilitadores do Eclipse nos ajudam.
Com as linhas que nos interessam selecionadas, na barra de menus, selecionar: Refactor Extract Method..., ou usar o
atalho: Alt + Shift + M.
Isso faz com que todas as ocorrncias daquelas linhas sejam substitudas pela chamada do novo mtodo que foi
automaticamente criado pelo Eclipse. Desta forma:
Agora, com o mtodo addItems criado, podemos fazer uso dele no nosso novo mtodo de teste:
Podemos ver que apesar de o teste do mtodo "movimentaLivro" ter falhado, o teste do mtodo "getLivrosPorPessoa",
passou! Isso est correto, pois ns ainda no terminamos o mtodo "movimentaLivro".
Neste ponto, algum pode perguntar: mesmo necessria a primeira condio do if, verificando se o objeto Pessoa
associado ao Livro no est nulo? Vamos alterar o cdigo desta forma:
E testar novamente, selecionando a Classe de Teste BibliotecaTest e usando o atalho: Alt + Shift + X + T:
Feito isso, podemos voltar ao mtodo de Emprstimo, e implementar a verificao do limite de Livros por Pessoa, assim:
E a est. Todos os testes devem ter passado e a nossa aplicao j evoluiu bastante!
O mtodo getLivrosDisponiveis
Este mtodo vai retornar uma lista dos livros que ainda no foram emprestados.
Mais uma vez, comeando pelos testes...
Prosseguindo, podemos copiar e alterar linhas de mtodos anteriores at chegar a este ponto:
Depois de copiar e alterar mais alguma linhas de cdigo, o mtodo de teste deve estar assim:
O mtodo getLivrosIndisponiveis
De forma anloga ao mtodo anterior, vamos criar o mtodo de teste para este mtodo, tendo como base o mtodo
testGetLivrosPorPessoa.
Depois de copiar e alterar algumas linhas, devemos ter o mtodo de teste assim:
Criando o mtodo...
Com o mtodo vazio salvo, e de volta a nossa Classe de Teste, devemos estar livres dos erros.
Este mtodo de teste deve ser bem familiar a esta altura.
Sendo:
1.
2.
3.
4.
Mais uma vez, o prximo passo codificar o mtodo getLivrosIndisponiveis propriamente dito.
Para isso, vamos aproveitar o cdigo do mtodo getLivrosDisponiveis, e depois de copiar e alterar as suas linhas,
Com o trabalho feito at aqui salvo e com a classe BibliotecaTest selecionada, vamos usar o atalho: Alt+Shift+X, T para
executar os testes desta classe.
Novamente, se tudo correu bem na codificao, os testes devem passar:
Aproveitando algumas linhas do mtodo testGetPessoa, e efetuando as alteraes necessrias, vamos ter o seguinte
resultado:
A esta altura, o contedo deste mtodo tambm deve ser familiar a todos, mas vamos descrever as suas principais linhas:
35. Define a varivel local que vai armazenar a situao do Livro.
36. O "if" que define a situao do Livro.
Se o Livro no possui Pessoa associada, a situao "Disponvel".
Se o Livro possui Pessoa associada, a situao "Emprestado para" esta Pessoa.
42. Retorna a combinao: Ttulo + Autor + Situao como um String.
Com o trabalho feito at aqui salvo e com a classe LivroTest selecionada, vamos usar o atalho: Alt+Shift+X, T para
executar os testes desta classe.
Novamente, se tudo correu bem na codificao, os testes devem passar:
Aproveitando algumas linhas j conhecidas, e efetuando as alteraes necessrias, vamos ter o seguinte resultado:
Mais uma vez, com o trabalho feito at aqui salvo e com a classe BibliotecaTest selecionada, vamos usar o atalho:
Alt+Shift+X, T para executar os testes desta classe.
Novamente, se tudo correu bem na codificao, os testes devem passar:
Para finalizar esta aula, podemos executar toda a Suite de testes para garantir que todas as Classes continuam
funcionando adequadamente.
E a est. Todos os testes devem ter passado e a nossa aplicao est praticamente pronta!
O progresso at agora
Neste ponto, a nossa aplicao est praticamente completa. Vejamos:
Temos as Classes Pessoa, Livro e Biblioteca codificadas.
Como usamos a metodologia TDD, temos um alto grau de confiana de que as nossas Classes vo funcionar
de acordo com o que foi projetado.
No entanto, ns s executamos partes da aplicao, e ainda assim, partindo das Classes de Teste: PessoaTest, LivroTest e
BibliotecaTest usando o JUnit.
Um exemplo:
Se a nossa aplicao tivesse algum tipo de Interface Grfica com o Usurio (ou GUI), bastaria apresentar um formulrio
no mtodo "main" e deixar o usurio prosseguir da.
Criar uma Interface Grfica em Java, est alm do escopo deste curso, portanto:
No nosso caso:
Vamos simular uma ao do usurio sobre as nossas Classes no mtodo "main" e exibir os resultados na console do
sistema.
Para finalizar, assim que tivermos tudo isso funcionado dentro do Eclipse, vamos usar o seu "Ajudante de Exportao"
para criar uma arquivo executvel do tipo JAR.
Arquivos do tipo JAR, podem ser executados em qualquer computador (ou dispositivo) que execute Java (que tenha o
JRE ou JDK instalados).
Na prtica
Podemos colocar o mtodo "main", em qualquer das nossas Classes, mas vamos fazer isso, na Classe Biblioteca,
considerando que ela a principal Classe da nossa Aplicao.
Mais uma vez, usando o assistente de cdigo do Eclipse, vamos deixar que ele crie o mtodo para ns.
Vamos digitar a palavra "main", seguida por Ctrl+Espao e aceitar o mtodo "main" proposto:
Obtendo o seguinte:
O mtodo "main", um mtodo esttico (static), que no retorna nada (void), e recebe como parmetro um Array de
Strings chamado "args" (String[] args).
Isso permite a um programa Java ler parmetros da linha de comando. No vai ser o caso do nosso exemplo.
Vamos prosseguir usando o assistente de cdigo e fazer o seguinte:
Criar uma Biblioteca.
Criar Livros e Pessoas.
Associar Livros e Pessoas Biblioteca.
Efetuar alguns emprstimos e devolues.
Tudo isso, exibindo os resultados parciais na console.
Comeamos assim: "new" + Ctrl+Espao, e selecionando "create new object".
O prximo passo, exibir o status atual da Biblioteca. Vamos criar o mtodo "imprimeStatus" para esta finalidade.
Mtodo esse que ser utilizado sempre que for necessrio exibir o status atual da Biblioteca medida que o nosso
programa vai sendo executado.
Assim: "sysout" + Ctrl+Espao.
Obtendo:
Obtendo:
Depois de devidamente alterado para exibir a situao de cada Livro, de cada Pessoa e da Biblioteca como um todo, o
mtodo deve ficar assim:
Agora que a nossa Classe possui um mtodo "main", ela pode ser considerada uma aplicao Java, e como tal pode ser
executada.
Para isso, temos algumas opes: usando o menu principal, usando teclas de atalho ou usando o menu de contexto.
Com a Classe Biblioteca selecionada, usar o boto direito do mouse para acionar o menu de contexto e selecionar: Run
As Java Application
Agora que temos a nossa aplicao funcionando no Eclipse, podemos nos preocupar em gerar um arquivo "executvel"
para ela.
No ambiente Java, este arquivo "executvel" do tipo JAR (ou Java Archive).
Este arquivo vai poder ser executado fora do Eclipse em qualquer sistema que seja compatvel com Java.
Para isso, vamos usar o menu: File Export...
Na janela seguinte, fica claro o motivo de ter criado os nossos testes em um pacote separado. Neste momento, podemos
exportar apenas o cdigo fonte que o que efetivamente necessrio.
A qual selecionada:
Para testar este nosso executvel fora do Eclipse, ser necessrio abrir uma console do sistema operacional no diretrio
onde o arquivo JAR foi gerado.
No Windows XP, a maneira clssica era usar o comando "Run" ou "Executar", digitar o comando "cmd", para chamar a
console do sistema, e a partir da, chegar ao diretrio desejado e executar os comandos necessrios.
J no Windows 7, o comando "Run" no fica habilitado por default, e a opo da barra de pesquisa, por vezes, muito
lenta.
Se voc j est usando o Windows 7 como eu, vai aqui uma dica de como habilitar esta opo no menu "Start" ou
"Iniciar":
Acione o boto direito do mouse no menu "Start" ou "Iniciar" e selecione a opo: Properties ou Propriedades
De volta ao nosso objetivo, vamos usar esta opo Run do menu Start. Na tela que se abre, vamos digitar "cmd".
Agora, com os comandos normais do DOS, devemos nos posicionar no diretrio onde o arquivo JAR foi gerado:
Lembrando que o comando "java" pode ser executado de qualquer lugar, pois a sua localizao est contida na varivel
de ambiente do sistema chamada PATH.
IDE Eclipse.
Voc pode agora, seguir no processo de aprendizagem como um Iniciante em
Java.
Grato por ter decidido usar este material para a sua iniciao.
Uma palavra final.
Alguns de vocs podem estar se perguntando: Mas onde est o cdigo fonte?
Sim, comum neste tipo de curso, um link para que os alunos faam o Download do cdigo completo.
Sinto desapontar alguns, mas no vai ser esse o nosso caso.
A principal idia aqui fazer com que voc pratique, e digitar o cdigo, no nosso caso, faz parte do aprendizado.
O Eclipse possui inmeros recursos de auxlio, dos quais vimos apenas uma pequena parte.
Quando voc digita o seu prprio cdigo, coisas inesperadas podem ocorrer, erros de digitao podem ser cometidos...
Tudo isso bom! Vai permitir a voc aprender mais.
Usem a lista de discusso para trocar idias e dar feedback!
Google Groups
Java para Iniciantes
Grande Abrao.
Anterior | ndice | Prximo