Vous êtes sur la page 1sur 41

Sumrio

Ol, eu sou o DevMan! Desta pgina em diante, eu estarei lhe


ajudando a compreender com ainda mais facilidade o contedo
desta edio. Ser um prazer contar com sua companhia!
Confira abaixo o que teremos nesta revista:

05 Controle as verses do cdigo no NetBeans


Tutorial, Core Utilizando o Subversion durante o desenvolvimento de aplicaes
[ Everton Arajo, Cleiton Siqueira e Thiago Lenz ]

13 Uso de Expresses Regulares em Java


Tutorial, Core Manipulando caracteres por meio da anlise de padres
[ Guilherme de Cleva Farto ]

27 O IDE NetBeans Parte 3


Minicurso, Core Criando aplicaes profissionais com a plataforma Java
[ Carlos Arajo ]

37 Conhecendo as mtricas de software


Tutorial, Boas Prticas Saiba como medir seu cdigo
[ Eduardo Spnola ]

[Tutorial] Artigo no estilo tutorial passo-a-passo. [Boas Prticas] Um dos objetivos da revista levar para o leitor [Minicurso] Srie de artigos apresentando o desenvolvimento de
no somente as melhores tcnicas, mas tambm as melhores pr- aplicaes e/ou o ensinamento de tecnologias Java.
[Core] Tcnicas Server-side, ferramentas, IDEs, e outros assuntos ticas de desenvolvimento, orientadas ao aumento da qualidade e
que fogem s demais categorias. produtividade. [Engenharia de Softaware] Artigo dentro do contexto de
Engenharia de Software: anlise, design, testes, metodologias
em geral.
Editorial

D
esenvolver aplicaes desktop sempre um desafio para quem est iniciando no
Java. Conhecer as terminologias, saber onde implementar as funcionalidades,
utilizar os elementos visuais para criar uma boa inferface com o usurio, qual
Ano I Edio 08 2011 layout adotar, so algumas das muitas dvidas que enfrentamos neste to importante
momento. Para nossa tranquilidade, muitas destas questes so facilitadas atravs do uso
de uma IDE, e sobre isso que preparamos uma matria para destaque desta edio.
O artigo O IDE NetBeans Parte 3 trata da criao passo a passo de uma pequena
aplicao Swing usando recursos do IDE NetBeans estudados nas etapas anteriores,
Edio alm de mostrar como customizar o cdigo gerado pelo NetBeans. O estudo de caso
Editor complementado com uma apresentao dos gerenciadores de layout, que tornam o esforo
Eduardo Spnola (eduspinola@gmail.com)
consumido no desenho das interfaces grficas bem mais leve.
Produo Durante o desenvolvimento de aplicaes, muitas vezes avanamos na codificao
Jornalista Responsvel Kaline Dolabella - JP24185 acreditando que estamos fazendo as mudanas corretas e que ao final o sistema ir
funcionar corretamente. No entanto, nem sempre isso acontece. E ento, o que voc faz?
Atendimento ao leitor
Tenta resolver os novos problemas ou faz um esforo para se lembrar de tudo o que mudou
A DevMedia possui uma Central de Atendimento on-line, onde voc pode
tirar suas dvidas sobre servios, enviar crticas e sugestes e falar com um de para fazer o sistema voltar a funcionar? Controlando as verses do cdigo no NetBeans
nossos atendentes. Atravs da nossa central tambm possvel alterar dados detalhar uma excelente ferramenta para evitar estas dores de cabea, o Subversion.
cadastrais, consultar o status de assinaturas e conferir a data de envio de suas
No dia a dia frequentemente lidamos com tarefas onde necessrio avaliar, validar e/ou
revistas. Acesse www.devmedia.com.br/central, ou se preferir entre em
contato conosco atravs do telefone 21 3382-5038. obter informaes vindas de uma cadeia de caracteres. Para contemplar esta tarefa, Uso de
Expresses Regulares em Java relata os conceitos de um poderoso mecanismo que pode
Publicidade ser empregado para a manipulao de informaes baseadas em cadeias de caracteres,
publicidade@devmedia.com.br 21 3382-5038
nos fornecendo os passos a serem seguidos para a utilizao de expresses regulares.
Anncios Anunciando nas publicaes e nos sites do Grupo DevMedia, voc Para finalizar esta edio, Conhecendo as mtricas de software demonstra que conhecer
divulga sua marca ou produto para mais de 100 mil desenvolvedores de todo o
Brasil, em mais de 200 cidades. Solicite nossos Media Kits, com detalhes sobre o cdigo fonte um requisito essencial para que seja possvel implementar novas
preos e formatos de anncios. funcionalidades e manter o cdigo com qualidade. Assim, neste artigo veremos como
obter informaes do cdigo para que possamos tomar as melhores decises a respeito
da evoluo e manuteno do mesmo.
Deste modo conclumos a oitava edio da Easy Java.

Boa leitura e at a prxima!

Fale com o Editor!


muito importante para a equipe saber o um artigo na revista ou no site Easy Java
que voc est achando da revista: que tipo Magazine, entre em contato com o editor, Eduardo Oliveira Spnola
de artigo voc gostaria de ler, que artigo voc informando o ttulo e mini-resumo do tema
eduspinola@gmail.com
mais gostou e qual artigo voc menos gostou. que voc gostaria de publicar:
Fique a vontade para entrar em contato com @eduspinola / @Java_Magazine
os editores e dar a sua sugesto! Eduardo Spnola - Editor da Revista
Se voc estiver interessado em publicar eduspinola@gmail.com
Controlando as verses do
cdigo no NetBeans
Utilizando o Subversion durante o desenvolvimento de aplicaes

Everton Coimbra de Arajo, Cleiton Siqueira e Thiago Lenz

O Resumo DevMan
controle de verso de software uma das caractersticas
da Gerncia de Configurao (GC). De acordo com o
MPS.BR (Melhoria do Processo do Software Brasileiro), o De que se trata o artigo:
propsito da GC estabelecer e manter a integridade de todos os Este artigo aborda o uso do controle de verso no desenvolvimento de
produtos de trabalho, de um processo ou projeto e disponibiliz- software. Alm da conceituao pertinente a este processo, a utilizao
los a todos os envolvidos. A GC busca minimizar os problemas de uma ferramenta que subsidie esta atividade apresentada. O Sub-
no processo de desenvolvimento de software como, por exemplo, version, integrado ao NetBeans, propicia equipe de desenvolvimento
a falta de rastreabilidade das alteraes dos arquivos fontes, a um ganho em produtividade, pois o desenvolvimento e o controle de
perda (ou recuperao) dos mesmos em caso de excluso local verso ficam acessveis em um nico ambiente.
ou no repositrio, e ainda o controle de alteraes simultneas
nesses arquivos. Para que serve:
A GC define um item de configurao como um artefato a ser Por mais que o controle de verses seja uma necessidade, muitos
gerenciado por ele. Esses artefatos podem ser documentos de desenvolvedores desconhecem este recurso. Este artigo tem como
requisitos, cdigo-fonte ou modelos de anlise e projeto, dentre objetivo demonstrar a simplicidade no uso de uma ferramenta para
outros. O processo para o controle de verso composto por um este fim, integrada a um ambiente de desenvolvimento.
software instalado em uma mquina caracterizada como servidor
e um aplicativo cliente no computador do programador para aces- Em que situao o tema til:
sar os dados deste servidor. O servidor possibilita gerenciar uma Controlar as alteraes de um software no uma tarefa simples,
estrutura de diretrios onde os artefatos estaro armazenados, quer seja por um desenvolvedor independente, quer seja por peque-
mantendo, a partir da sua primeira verso, todas as demais de cada nas equipes, ou, principalmente, quando se trabalha em equipes com
artefato. Este servidor permite que os usurios (programadores) muitos integrantes. Este processo se torna ainda mais complicado
possam fazer uma cpia do repositrio para seu computador atra- quando os mesmos no trabalham no mesmo local (prdio, cidade, pas,
vs de aplicativos clientes. Um aplicativo cliente um software etc.). Saber quem fez, quando fez e por que fez se torna bastante difcil
que tem por objetivo realizar a comunicao com o servidor, quando no se usa uma ferramenta para controle de verso.
sendo ele o responsvel por enviar os comandos para o servidor
e processar as informaes retornadas. Este processo possibilita Controlando as verses do cdigo no NetBeans:
a criao de novos artefatos ou a realizao de alteraes nos Esse artigo apresenta os conceitos relacionados s atividades de con-
existentes, para posterior envio ao repositrio (Figura 1). trole de verso e como um software especfico para este fim se integra
O objetivo principal de um sistema para controle de verso ao IDE NetBeans. Em seguida os comandos oferecidos pelo Subversion
gerenciar diferentes verses de um documento qualquer (no ape- so apresentados de forma integrada ao NetBeans. So eles: Checkout
nas cdigo fonte) durante o seu desenvolvimento, possibilitando (download do projeto), Atualizar (sincronizar os arquivos locais com a
a edio colaborativa e o compartilhamento de dados (SVNBook). verso atual existente no servidor), Submeter (enviar os artefatos lo-
Deste modo possvel armazenar, em um repositrio, qualquer cais atualizados para o servidor), Comparar (verificar a diferena entre
tipo de arquivo. Para esta atividade existem diversas ferramentas verses de um artefato), Exibir Alteraes (histrico de revises de um
que atendem a esta demanda, entre elas: artefato), Resolver Conflitos (quando dois usurios alteram o mesmo
Gratuitas: SVN (Subversion), CVS (Concurrent Version System), artefato) e Reverter Modificaes (desfazer algo feito localmente ou
Mercurial e GIT (Global Information Tracker); que j esteja no repositrio). O artigo trabalha o conceito de cada co-
Comerciais: SourceSafe da Microsoft, ClearCase da IBM, entre mando, trazendo sempre uma aplicao prtica para cada um deles.
outros. Esta aplicao demonstra os benefcios da integrao do Subversion
com o NetBeans, destacando os cuidados a serem tomados e as boas
De acordo com Andr Felipe Dias (ver Referncias), os sistemas prticas de utilizao.
mais conhecidos e utilizados na maioria dos projetos de software

Edio 08 Easy Java Magazine 5


Controlando as verses do cdigo no NetBeans

livre so: CVS, utilizado durante muitos anos, porm, devido a disponvel na Internet: o SourceForge. Alm do SourceForge
algumas limitaes tem sido substitudo por outras ferramentas; (http://sourceforge.net/), existem diversas outras possibilidades
e o Subversion, conhecido por SVN, tem sido o mais utilizado para registro e configurao de servidores para o controle de
atualmente, pois atende de forma plena os comandos e recursos verso. Mais informaes sobre isso podem ser encontradas na
oferecidos pelo CVS, seu antecessor, cobrindo inclusive as antigas seo Links.
limitaes deste.
Para que um sistema de controle de verso possa efetivamente
atender a seu objetivo, ele precisa resolver dois dos principais
problemas no compartilhamento de informao: como o sistema
ir permitir que os usurios compartilhem informaes, e como
prevenir e gerenciar os conflitos dessas alteraes?

Figura 2. Funcionamento das revises do Subversion (Extrada do Livro SVNBook)

Figura 1. Arquitetura do Controle de Verso


Figura 3. Painel MyProjects
Subversion (SVN)
O Subversion um sistema de cdigo aberto, desenvolvido e Para a utilizao do servio oferecido pelo SourceForge, neces-
mantido pelos mesmos desenvolvedores do CVS. Ele disponi- sria a criao de uma conta. Feito isso, preciso registrar um novo
biliza uma srie de funcionalidades, as quais esto diretamente projeto, que ter seu uso aplicado neste artigo. Esta funcionalidade
relacionadas com o processo de desenvolvimento de software e est disponvel no painel de controle do SourceForge mais pre-
necessrias para um correto controle de verso. cisamente na aba Projects de acordo com a Figura 3. Assim, para
No contexto de controle de verso, cada alterao em um arquivo criar um projeto, clique no link Register a new Project.
vista como uma reviso (ou verso). No entanto, diferentemente No momento da criao do projeto necessrio informar alguns
de outros sistemas, o Subversion no mantm uma reviso por dados sobre ele, como: Project Name (nome do projeto); URL (en-
arquivo alterado. Cada nova verso possui uma cpia de toda dereo nico do projeto sujeito a validao); e Public Description
a estrutura de arquivos e diretrios, como pode ser observado (descrio mais elaborada do projeto, sendo necessrio informar
na Figura 2. Deste modo, o Subversion no gera apenas um novo no mnimo 20 e no mximo 250 caracteres), como apresenta a
arquivo para aqueles alterados, mas sim, para todos. Ou seja, Figura 4.
mesmo que um arquivo no sofra alteraes ao longo do tempo, Com a criao do projeto, possvel obter na aba Develop, locali-
ele estar sempre presente na ltima reviso. O servidor armazena zada no painel de controle, a URL do Subversion a ser utilizada no
todas as submisses recebidas, tratando cada uma como uma nova cliente. No nosso exemplo, o cliente um plugin que ser instalado
verso. Assim, ser considerada a verso atual a ltima enviada e configurado no NetBeans, e o endereo, neste caso, https://
ao servidor. artigosvn.svn.sourcegorge.net/svnroot/artigosvn (veja a Figura 5).

Configurando um Servidor Subversion Utilizando o Subversion integrado ao NetBeans


Para utilizao de um controle de verso faz-se necessria a exis- A integrao do IDE com o servidor de controle de verso ser
tncia de um servidor, o qual hospeda o projeto e todas as verses realizada atravs de um plugin, que trar ao IDE um cliente para o
criadas durante o processo de desenvolvimento. Por questes de controle de verso. Este plugin j instalado por default no NetBe-
praticidade, para este artigo utilizaremos um servidor gratuito ans, sendo necessria apenas a sua configurao. Para realizar esta

6 Easy Java Magazine Edio 08


tarefa, com o NetBeans iniciado, acesse o menu Equipe > Subversion Comparar: checa a diferena, atravs de comparaes entre
> Checkout. Caso seja o primeiro acesso, certamente o cliente no diferentes verses, de um mesmo artefato;
estar configurado, ento, ser exibida uma janela de erro, seme- Exibir Alteraes: exibe, no IDE, o histrico das verses de
lhante Figura 6. Nessa janela possvel informar o Cliente de um artefato;
SVN que o NetBeans far uso. Neste momento, certifique-se de Resolver Conflitos: resolve conflitos de alteraes realizadas
ter selecionado a opo marcada na Figura 6 e clique no boto OK. por mais de um usurio em um determinado artefato;
Para que a instalao realizada possa ser concluda, necessrio Reverter Modificaes: reverte a verso local do artefato para a
que o NetBeans seja reiniciado. selecionada no controle de verso, ou reverte a verso mais recente
a partir de uma mais antiga dentro do repositrio.

Figura 6. Configurando o Cliente de SVN

Figura 4. Criando um novo projeto Para demonstrar a utilizao desses comandos vamos criar um
projeto no NetBeans. Em nosso exemplo o nome dado a ele foi:
Projeto01. A etapa seguinte enviar este projeto para o servidor,
o que realizado atravs do comando Submeter. Aps a execuo
deste comando, toda a equipe poder obter o projeto e iniciar o
desenvolvimento.
Para executar o comando Submeter, clique com o boto direito
do mouse sobre o nome do projeto e selecione a opo Subversion
> Submeter. Em seguida apresentada uma janela semelhante
Figura 7. Nela, visualizam-se todos os artefatos a serem subme-
tidos, que so os arquivos criados pelo NetBeans para o projeto,
bem como a ao a ser realizada no processo de submisso.
Figura 5. URL do repositrio

Comandos do Subversion
A interao do cliente com o servidor, para subsidiar o controle
de verso, realizada atravs do envio de comandos por parte do
cliente para o servidor. No exemplo apresentado, sero emprega-
dos os comandos mais utilizados no dia-a-dia, que so:
Checkout: comando que faz o download da cpia de trabalho
a partir do repositrio (o termo Cpia de Trabalho refere-se a
uma cpia de todo o projeto, que fica armazenada na mquina
local do programador);
Atualizar: este comando realiza a atualizao da cpia de tra-
balho, trazendo a verso atual existente no servidor;
Submeter: confirma as alteraes ou criao de artefatos, da
cpia de trabalho, para o servidor, registrando a submisso como
a reviso atual; Figura 7. Janela de Commit no NetBeans

Edio 08 Easy Java Magazine 7


Controlando as verses do cdigo no NetBeans

Estas aes referem-se a o que ser feito no servidor em relao


a cada artefato, como pode ser verificado na quarta coluna do grid
apresentado na mesma figura.
Nesta submisso e em todas as que sero realizadas durante o
desenvolvimento, extremamente importante o registro de um
texto que possa explicar o que foi implementado, que problema
foi corrigido, ou, como neste caso em que o projeto foi criado, uma
descrio do mesmo. Este registro de grande importncia para
o controle do cdigo e para que os membros da equipe possam
saber o que foi implementado em cada submisso.

Checkout
Este comando responsvel pelo download da verso mais atu-
Figura 8. Configurando a URL
alizada do projeto existente no repositrio do servidor, para um
diretrio no computador local, obtendo-se assim a cpia para Aps configurar a URL para Checkout, deve-se informar o
trabalho. Este diretrio local informado no momento do Checkout. diretrio do computador local onde ser criada a cpia do reposi-
Neste processo, o cliente Subversion gera alguns arquivos, os trio, o que pode ser visto na Figura 9. Ao finalizar essa operao,
quais no esto ligados ao projeto, porm, so necessrios para a todos os arquivos e pastas que forem adicionados neste diretrio
interao do cliente com o servidor. Estes arquivos, que possuem estaro disponveis para serem publicados no repositrio aps
extenso svn, so ocultos ao usurio e cada diretrio da estrutura qualquer alterao.
possui um deles. A estes arquivos atribuda uma caracterstica Como j discutido, pode-se notar na Figura 9 a possibilidade
que informar ao cliente SVN que o diretrio faz parte do controle de informar a partir de qual diretrio do repositrio deseja-se
de verso gerenciado por ele (o cliente). Estes arquivos so tam- fazer o download dos artefatos, bem como a verso do projeto
bm utilizados pelo cliente durante as interaes com o servidor. que est no repositrio. Caso no seja informado nada nestes
Nesta cpia local o programador pode realizar suas incluses e campos, o Checkout ser feito a partir do diretrio raiz do repo-
alteraes nos artefatos e diretrios, e quando houver a condio sitrio, sendo realizado o download de todos os artefatos. Com
de estabilidade dessa cpia, faz-se a publicao da mesma atra- a execuo deste comando, o programador ter em sua cpia
vs de outro comando, chamado Submeter. A estabilidade de um local a verso mais recente do projeto.
artefato atingida quando ele tenha passado por todos os testes
de validao e esteja apto a ser posto em produo, sem riscos de
erros para o usurio ou para outros pontos da aplicao.
O programador no precisa a cada interao com o servidor
realizar o download completo do projeto. O Checkout pode ser
realizado de forma parcial. Esta situao ocorre quando determi-
nado usurio necessita somente de partes do repositrio. Deste
modo, possvel informar no momento do Checkout a partir de
qual diretrio deseja-se fazer o download.
Outra caracterstica interessante do comando Checkout a pos-
sibilidade de se informar a verso desejada para download. Isto
pode ser til quando for necessrio trabalhar com uma verso
especfica do repositrio. Um exemplo desta situao ocorre
quando equipes necessitam trabalhar com verses diferentes de
um software.
Figura 9. Configurando o diretrio no computador local
Na prtica
Para realizar o Checkout deve-se saber de onde os arquivos que Atualizar
compem o projeto sero obtidos. Sendo assim, necessrio in- Este comando tem a responsabilidade de manter a cpia de tra-
formar o endereo de um servidor Subversion no NetBeans. Este balho atualizada, buscando por atualizaes no repositrio. Em
endereo o do repositrio para o projeto criado anteriormente. resumo, o comando Atualizar vai comparar a verso que est na
A configurao realizada atravs do menu Equipe > Subversion cpia de trabalho com a ltima verso do repositrio. Caso a cpia
> Checkout. Como pode ser visto na Figura 8, deve-se informar o de trabalho esteja desatualizada, ele far o download das altera-
link do repositrio (Figura 5) juntamente com o usurio e a senha es da ltima reviso. Durante a execuo do comando Atualizar,
referentes conta criada no SourceForge.net. algumas aes, listadas na sequncia, sero realizadas:

8 Easy Java Magazine Edio 08


Os artefatos que no existirem na cpia de trabalho sero Submeter
adicionados; Este comando tem por finalidade enviar as alteraes, excluses
Os artefatos que foram excludos no repositrio sero removidos e criaes de artefatos e diretrios da cpia de trabalho para o re-
da cpia de trabalho; positrio do Subversion. Enquanto o comando Atualizar sincroniza
Quanto aos artefatos que sofreram alterao na cpia de tra- os artefatos e diretrios locais com base nos artefatos e diretrios
balho, o comando Atualizar buscar uma juno das alteraes do repositrio, o comando Submeter faz o processo inverso.
realizadas na cpia de trabalho com as possveis alteraes feitas Durante a execuo do comando Submeter algumas aes,
por outros usurios e publicadas no repositrio. Esta operao referentes criao e atualizao de verso sero realizadas.
conhecida como Merge. Se o comando Atualizar no conseguir So elas:
realizar o Merge, ele marcar o artefato como portador de conflito Para os artefatos que foram renomeados na cpia de trabalho, o
de verso e a juno dever ser feita manualmente. As possveis Subversion remover o arquivo antigo do repositrio e adicionar
resolues para os conflitos so apresentadas no tpico Resolver no repositrio o arquivo com novo nome, mantendo todo o hist-
Conflitos. rico do artefato antigo neste novo artefato renomeado;
Os artefatos que foram excludos na cpia de trabalho sero
- possvel usar o comando Atualizar para atualizar partes da cpia de trabalho removidos do repositrio;
ou at mesmo apenas um artefato. Os artefatos que sofreram alterao de contedo sero atualiza-
dos no repositrio e registrados com a nova verso.
Caso existam artefatos que foram renomeados na cpia de trabalho
e no foram submetidos, durante a execuo do comando Atualizar, Durante a execuo deste comando verificado se a verso da
o artefato que foi renomeado ser restaurado na cpia de trabalho cpia de trabalho a mesma do repositrio. Caso a verso da cpia
e assim sero mantidos dois artefatos com o mesmo contedo, caso de trabalho seja mais antiga que a do repositrio, o processo
a cpia local no tenha sofrido alterao de contedo. interrompido e solicitado ao usurio que faa a atualizao da
cpia de trabalho ou artefato a ser submetido atravs do comando
Na prtica Atualizar. Este comportamento visa garantir a consistncia das
Para executar o comando Atualizar seleciona-se o projeto, um verses no repositrio.
diretrio ou at mesmo um artefato em especfico, e em seguida Pode-se exemplificar esta situao da seguinte maneira: um
clica-se com o boto direito do mouse escolhendo no menu a op- usurio A atualizou sua cpia de trabalho e alterou um artefato
o: Subversion > Atualizar. O resultado ser apresentado na console de nome Classe01.java, submetendo o arquivo para o repositrio
do NetBeans (veja a Figura 10). Neste momento sero listados os em seguida. Enquanto isso, outro usurio (B) tinha a mesma ver-
arquivos que foram afetados pelo comando, ou seja, que foram so antes da ltima submisso do usurio A, e acabou alterando
atualizados, removidos ou adicionados na cpia de trabalho. o mesmo artefato. Deste modo, se o usurio B tentar realizar a
Observe que no incio da linha de atualizao de cada arquivo submisso desse artefato, o Subversion interromper o processo
exibido um caractere representando a ao que foi executada. A solicitando que B faa uma atualizao da cpia de trabalho ou
lista a seguir define o significado de cada uma destas letras: artefato para s ento realizar a submisso do artefato.
D: o artefato foi excludo (em ingls, Deleted); Caso ocorra conflito entre as verses dos usurios A e B, o co-
G: o artefato j havia sofrido alteraes locais, assim como o mando Atualizar marcar o artefato como possuidor de conflito,
artefato existente no repositrio, desta forma, houve uma mescla e para corrigir este problema deve-se usar o comando Resolver
entre estas verses (em ingls, Merged); Conflitos.
A: indica que o artefato foi adicionado (em ingls, Added); uma boa prtica informar uma descrio referente s submis-
U: indica que o artefato foi atualizado (em ingls, Updated); ses realizadas, para posteriormente, ao rastrear as alteraes
C: significa que no foi possvel mesclar as alteraes locais de verso do artefato, ser possvel identificar o motivo de cada
com as alteraes do repositrio. Por isso, o artefato foi marcado submisso realizada. Nessa descrio, a disciplina de Gerncia
com a existncia de um conflito (em ingls, Conflited). de Configurao recomenda informar o motivo que levou alte-
rao do artefato.

Na prtica
Para executar o comando Submeter, localize o diretrio ou arte-
fato a ser submetido e, clicando com o boto direito do mouse,
selecione a opo Subversion > Submeter. Feito isso, apresentada
uma janela semelhante Figura 11. Nesta janela visualiza-se
todos os artefatos a serem submetidos, bem como a ao a ser
realizada neste processo de submisso. No momento em que o(s)
Figura 10. Sada do comando "Atualizar" na console artefato(s) (so) enviado(s) para o servidor, pode-se informar um

Edio 08 Easy Java Magazine 9


Controlando as verses do cdigo no NetBeans

texto descrevendo o motivo da alterao realizada, para posterior bloco de cdigo, um ponto especfico de implementao. Para
acompanhamento. realizar esta atividade preciso identificar os pontos que neces-
sitam da reverso e ento clicar nas pequenas flechas que esto
apontando para a direita. Estas flechas do significado semntico
de que o cdigo no servidor ser enviado para a verso local do
artefato (observe a Figura 12).

Exibir Alteraes
Durante o ciclo de vida do desenvolvimento de um software,
muitas alteraes so submetidas ao repositrio. Deste modo,
comum a ocorrncia de situaes em que seja necessrio rastrear
alteraes realizadas nos artefatos por alguma necessidade espe-
cfica, como por exemplo, a correo de erros.
O comando Exibir Alteraes um recurso de pesquisa que
permite visualizar todas as verses de um artefato desde a sua
Figura 11. Janela de Commit no NetBeans
primeira submisso ao repositrio. Este comando retorna as se-
guintes informaes sobre cada verso do artefato:
Comparar Nmero: Identificador sequencial de cada reviso/verso;
Este comando tem a finalidade de comparar as verses dos Usurio: Autor da reviso;
artefatos gerenciados pelo Subversion, verificando as diferenas Data/Hora: Data e hora da submisso que gerou a reviso;
entre elas. Estas diferenas podem ser entre verses do projeto Mensagem: Texto informado no momento da submisso do
existentes no servidor, ou ainda entre a verso do projeto da cpia artefato;
de trabalho com a existente no repositrio. Para o Subversion, as Arquivos/Pastas: Lista de arquivos e diretrios que sofreram
alteraes a serem verificadas e controladas em um artefato a alteraes ou foram adicionados.
linha de cdigo (ou de texto). Isso quer dizer que uma simples
alterao de caractere far com que a linha inteira seja marcada - Este comando pode ser usado em todo o repositrio, em um determinado diretrio
como diferente entre as verses. ou ainda para um artefato especfico.

Na prtica Na prtica
Este comando pode ser executado ao clicar com o boto direito Para visualizar o histrico de alteraes de um arquivo, diretrio
do mouse em qualquer arquivo localizado na paleta de projetos ou projeto, basta selecionar o item desejado e em seguida clicar
do NetBeans e escolher o item de menu Subversion > Comparar. A com o boto direito sobre o mesmo, escolhendo a opo de menu
Figura 12 exibe o resultado de uma comparao aps algumas Subversion > Pesquisar no Histrico. Feito isso ser exibida uma
alteraes realizadas no arquivo NovoArquivo.java. janela com as opes de filtro, de acordo com a Figura 13.

Figura 13. Parmetros utilizados para seleo de Logs

O resultado da pesquisa, aplicando os filtros informados,


apresentado em uma janela com duas abas (Figura 14): Resumo e
Figura 12. Comparando a cpia local com a verso do repositrio Comparar, acessveis ao clicar nos botes que as representam. A
aba Resumo exibe, em ordem descendente pelo nmero da verso,
Durante a implementao de uma funcionalidade, pode ocorrer as informaes de submisso de cada artefato modificado, sendo
a necessidade de reverter o cdigo para o estado anterior s alte- estas: o nmero da reviso, autor, data/hora e mensagem. E logo
raes realizadas. O processo para reverter um artefato para uma abaixo so listados todos os arquivos que foram submetidos com a
verso existente no repositrio - vista como reverso parcial, pois verso. possvel, ainda nesta aba, comparar ou reverter o artefato
realizada para um nico artefato refere-se a um determinado da cpia de trabalho para a verso do repositrio selecionada.

10 Easy Java Magazine Edio 08


A aba Comparar permite visualizar as diferenas entre as verses mesmo resolver o conflito no repositrio, pode acabar sobrepondo
do repositrio. Estas diferenas podem ser vistas no modo grfico o cdigo j submetido por outro usurio, e se resolver em sua c-
ou textual, de acordo com a Figura 14. Verifica-se nesta figura, pia local, poder perder suas alteraes. Assim, a melhor soluo
por exemplo, que houve uma alterao no cdigo da Classe01, verificar os conflitos de sua cpia local com a do repositrio,
a qual foi implementada na reviso 3 do projeto. A comparao implementar no artefato da cpia local os cdigos conflitantes de
apresentada est relacionada com a alterao realizada na reviso maneira a resolv-los e ento realizar a submisso. Deste modo,
3 desta classe. Este exemplo compara duas revises no servidor. ao concluir a atualizao da cpia local, os conflitos de uma nova
Porm, as comparaes tambm podem ocorrer entre a cpia local submisso podero ser resolvidos com base nesta cpia.
e a verso mais recente disponibilizada no servidor.

Figura 15. Editor de conflitos

Aps o termino da edio de conflitos, ou seja, quando no


houver mais nenhuma linha em vermelho, clica-se no boto OK
para marcar os conflitos como resolvidos.

Reverter Modificaes
O comando Reverter Modificaes tem por finalidade desfazer as
Figura 14. Janela Exibir Alteraes alteraes de artefatos na cpia de trabalho. Com este recurso
possvel reverter toda a cpia de trabalho ou apenas parte dela.
Resolver Conflitos A reverso das modificaes pode ser feita a partir de qualquer
comum a existncia de conflitos de verses quando se traba- verso existente no repositrio.
lha com uma equipe grande, pois nesta condio a quantidade Este procedimento til quando se deseja desfazer alteraes sub-
de submisses aumenta. Quando isso acontece, pode ocorrer a metidas ou no para o repositrio. Desfazer alteraes j atualizadas
situao de um usurio ter em seu repositrio uma verso que pode ser uma atividade necessria quando, por exemplo, uma imple-
j tenha sido submetida antes que ele consiga finalizar suas alte- mentao submetida possua um erro que no tenha sido verificado
raes. Assim, quando o desenvolvedor submeter seu cdigo, o pela equipe de testes. Neste caso, reverte-se o projeto, ou o artefato
Subversion verificar que a verso no repositrio mais recente e em questo, para uma verso que no apresente este erro.
solicitar a este usurio que execute o comando Atualizar, para s
ento submeter sua verso. Na execuo desta atualizao, con- Na prtica
flitos podero ser detectados, pois o trabalho local foi realizado Para executar a reverso de modificaes, clique com o boto
em uma verso desatualizada. direito do mouse no diretrio ou arquivo e selecione a opo Sub-
De acordo com o SVNBook, quando ocorre um conflito em um version > Reverter Modificaes. Feito isso, a janela da Figura 16 ser
artefato so gerados outros trs artefatos a partir dele: apresentada com as seguintes opes:
filename.mine: arquivo que contm as alteraes locais implemen- Reverter alteraes locais: esta opo permite reverter artefatos,
tadas no artefato com conflito, antes do comando Atualizar; sincronizados com o repositrio, que sofreram alteraes locais e que
filename.OLDREV: arquivo que possui o contedo da verso na se deseja reverter para a verso a qual estavam anteriormente;
qual o arquivo local estava baseado, antes da atualizao; Reverter modificaes de submisso nica: opo na qual
filename.NEWREV: arquivo que contm a ltima reviso postada ocorrer substituio de um ou mais artefatos na mquina local
no repositrio. com base em determinada reviso do repositrio. Para concluir a
reverso preciso executar a submisso posteriormente, para que
Na prtica esta verso revisada se torne a atual no repositrio;
Os conflitos que porventura ocorrerem so apresentados pela Reverter modificaes de submisses anteriores: esta opo
ferramenta, como exibido na Figura 15. Assim, o programador semelhante anterior, porm possvel escolher a verso ini-
precisa optar se esta resoluo de conflitos ser em sua cpia cial e final para reverso, especificando assim que modificaes
local ou na cpia do repositrio. No entanto, esta limitao no realizadas em revises deste intervalo sero revertidas, ou seja,
traz para o desenvolvedor muita praticidade e facilidade, pois se o canceladas.

Edio 08 Easy Java Magazine 11


Controlando as verses do cdigo no NetBeans

atividades da equipe, tais como atualizaes no repositrio local


e submisses das alteraes implementadas para o servidor.
A adoo de um software para a gerncia de verses permite o
desenvolvimento em equipe de uma forma segura e sem perda
de cdigo. Isso significa que diversos programadores podem
trabalhar concomitantemente em um mesmo projeto ou artefato
deste, e as alteraes feitas por cada um podem ser mescladas em
uma verso final no repositrio. Alm disso, durante o desen-
volvimento, pode ocorrer a situao de uma alterao submetida
no ter o sucesso esperado, ou gerar problemas em outros pontos
da aplicao. Neste caso, a reverso para uma verso estvel
aconselhvel, e com o controle de verso esta atividade se torna
bastante simples. Com estes pontos, dentre outros apresentados,
altamente recomendado o uso deste tipo de ferramenta para
controlar os trabalhos de uma equipe de desenvolvimento.

Figura 16. Janela do comando Reverter Modificaes http://svnbook-pt-br.googlecode.com/svn/snapshots/1.4/index.html


SVNBook.
Os artefatos criados em sua cpia local e que no tenham sido
submetidos ainda, so vistos como "artefatos no versionados". http://www.softex.br/mpsbr/_guias/guias/MPS.BR_Guia_de_
Eles so registrados em seu projeto para submisso e podem ser Implementacao_Parte_2_2009.pdf
removidos pelo prprio Subversion, caso a criao dos mesmos MPS.BR.
no seja necessria. Para isso, marca-se a opo Remover novos http://www.pronus.eng.br/artigos_tutoriais/gerencia_configuracao/subversion.php
arquivos e pastas adicionados, apresentada na Figura 16. claro que Subversion Autor: Andr Felipe Dias.
o programador tambm pode optar pela remoo dos mesmos
direto no NetBeans, o que torna desnecessria esta opo. http://www.assembla.com, http://www.xp-dev.com e http://code.google.com/
As duas ltimas opes apresentadas no so recomendadas hosting
para revises muito antigas, pois a probabilidade de ocorrer Sites que oferecem servios para sistemas de controle de verso.
conflito com verses posteriores grande. O trabalho em verses
antigas de um projeto pode ser necessrio quando uma imple- Everton Coimbra de Arajo
mentao existente nestas verses j no est disponvel na atual everton@utfpr.edu.br
e a execuo da mesma (ou recuperao) necessria. Desde 1987 atua na rea de treinamento e desenvolvimento. mestre
Aps escolher a opo de reverso e clicar no boto Reverter, ser em Cincia da Computao, e professor efetivo da UTFPR, Campus Me-
exibido o resultado do comando na console do NetBeans, como dianeira. Tem se dedicado s disciplinas relacionadas ao desenvolvimento de
mostra a Figura 17. aplicaes web e na persistncia de objetos, focando seus estudos e pesquisas
na plataforma Java e .NET. autor da Visual Books, com oito livros j publicados.

Cleiton Luiz Siqueira


cleiton@websystem.com.br
Bacharel em Cincia da Computao, atua desde 2004 em anlise
Figura 17. Sada do comando Reverter Modificaes e desenvolvimento de sistemas que utilizam tecnologia Java, mais
especificamente em projetos JEE. Atualmente funcionrio pblico
municipal concursado pelo Municpio de Cascavel PR, atuando como
Concluso
encarregado de setor e analista programador de sistemas.
O controle de verso em um projeto de software de extrema im-
portncia para garantir a integridade e a consistncia do mesmo.
Esta atividade minimiza diversos problemas que normalmente Thiago Alexandre Lenz
fazem parte de qualquer processo de desenvolvimento. No entan- thiagolenz@gmail.com
to, para que o desenvolvimento integrado ao controle de verso Ps graduando em Engenharia de Software pela Universidade
possa ser utilizado de maneira eficiente, necessrio o emprego de Tecnolgica Federal do Paran (UTFPR). Desenvolvedor Java h trs
anos na plataforma JEE, trabalhando em projetos de software de gesto
ferramentas para este propsito, e o Subversion uma delas. Este
empresarial. Atualmente Analista de Sistemas na TOTVS S.A.
software, aliado ao NetBeans atravs de um plugin, simplifica as

12 Easy Java Magazine Edio 08


Uso de Expresses
Regulares em Java
Manipulando caracteres por meio de anlises de padres

Guilherme de Cleva Farto

E Resumo DevMan
xpresso Regular ou Regular Expression, bem como a
abreviao RegEx, um mecanismo poderoso utilizado
para manipulao de informaes baseadas em cadeias de De que se trata o artigo:
caracteres, permitindo identificar, de maneira precisa e flexvel, Este artigo apresenta os conceitos de um poderoso mecanismo que
dados de interesse por meio de anlises de padres. A pesquisa pode ser utilizado para a manipulao de informaes baseadas em
ou anlise de padres objetiva criar recursos com a finalidade de cadeias de caracteres, nos fornecendo os passos a serem seguidos para a
facilitar a localizao e recuperao de informaes. utilizao de expresses regulares na tecnologia Java, tornando possvel
As consultas de dados que fazem uso de expresses regulares so a implementao de aplicaes Java que necessitem executar operaes
descritas em uma linguagem formal, podendo ser interpretadas como validao, substituio e extrao de dados de forma rpida, efi-
a partir de um sistema processador de expresses, ou seja, uma ciente e segura.
aplicao desenvolvida para realizar a validao, compilao e
execuo. Este processador responsvel pela examinao do Para que serve:
texto original, identificando partes que combinam com a especi- Este artigo foi criado com o objetivo de introduzir os desenvolvedores
ficao dada pela expresso regular. tecnologia de expresses regulares, possibilitando incorporar recursos
As principais finalidades quando se utiliza expresses regulares de pesquisas complexas de cadeias de caracteres em aplicaes Java de
incluem a necessidade de realizar pesquisas a partir da identifica- maneira fcil e produtiva. Apesar de ser um artigo introdutrio, aborda-se
o de padres, assim como a validao e substituio de cadeias os principais assuntos sobre a implementao de aplicativos que fazem
de caracteres por meio da anlise de padres. uso de expresses regulares.
A definio e uso de expresses regulares em sistemas computa-
cionais torna possvel o acesso rpido e direto a dados desejados, Em que situao o tema til:
agilizando os processos de busca e extrao de informaes. Este artigo ser til para desenvolvedores que desejam aprender como
Conforme o refinamento e detalhamento dos padres desejados implementar aplicaes Java que, por meio do uso de expresses regu-
durante a fase de construo, as expresses regulares facilitam, lares, possam trabalhar de modo mais eficiente, contribuindo para a exe-
de forma mais precisa e rpida, a obteno de resultados em con- cuo correta e rpida de pesquisas complexas, onde se torna necessrio
sultas, criando mecanismos mais eficientes e consistentes para a a utilizao de anlise de padres.
realizao de pesquisas complexas e demoradas.
Em resumo, uma expresso regular um mtodo formal, ou Uso de Expresses Regulares em Java:
seja, uma tcnica da computao baseada na matemtica para A tecnologia Java nos fornece mecanismos para o desenvolvimento de
descrever propriedades de um sistema, desenvolvido com a fina- aplicaes que fazem uso de expresses regulares, permitindo a criao
lidade de se especificar um padro de texto. So utilizadas para de aplicativos que validem informaes de entrada, manipulando cadeias
definir um padro abrangente de maneira especfica. Definindo-se de caracteres, facilitando a execuo de tarefas onde h a necessidade de
um padro de pesquisa, possvel obter uma lista de resultados realizar pesquisas complexas de maneira eficiente.
capazes de atender tal expresso. Entre outras operaes, as ex- As expresses regulares tornam possvel a definio de instrues
presses regulares servem, principalmente, para buscar e validar abrangentes de maneira simplificada e especfica, ou seja, diversos padres
padres de textos. podem ser montados a partir de uma nica cadeia de caracteres.
Alguns exemplos de informaes que podem ser validadas O desenvolvimento e utilizao de expresses regulares podem ser feitos
so campos como data, hora, endereos eletrnicos, telefone, em diversas linguagens e tecnologias de programao, como JavaScript,
CPF, RG, CEP entre outros dados. Porm, pode-se ir mais alm ASP, PHP, C# e Java. Neste artigo, sero abordados os principais conceitos
com expresses regulares, sendo possvel trabalhar com busca para o uso de expresses regulares em Java, possibilitando que muitas ta-
e identificao de ocorrncias como padres em sequncia de refas sejam simplificadas graas a essa maneira especial de criar pesquisas
DNA, dados genticos e at extrao de padres em banco de complexas atravs de padres.
dados biolgicos.

Edio 08 Easy Java Magazine 13


Uso de Expresses Regulares em Java

Neste artigo, voc ir aprender, entre outras coisas, os conceitos dos os principais conceitos para o uso de expresses regulares
de expresses regulares, regras de definio, identificao, vali- em Java, possibilitando que muitas tarefas sejam simplificadas
dao e substituio de caracteres de dados, assim como aplicar graas a essa maneira especial de criar pesquisas complexas
todo o conhecimento adquirido por meio de exemplos prticos que atravs de padres.
demonstram o poder desta tecnologia de pesquisas complexas. A tecnologia Java possui, em seu pacote java.util.regex, as trs
principais classes para a criao e execuo de algoritmos que
Introduo a Expresses Regulares necessitem de expresses regulares. Abaixo, segue uma pequena
A tecnologia de expresses regulares busca descrever conjuntos descrio dessas classes que sero abordadas com mais detalhes
de cadeiras de caracteres, de maneira precisa, exercendo o papel no decorrer deste artigo:
de um mtodo utilizado para se especificar um padro de infor- j ava.util.regex.Pattern: A classe Pattern responsvel pela represen-
mao. Com o uso desse padro, textos podem ser pesquisados, tao do padro a ser compilado e utilizado nas pesquisas. Para
validados e dados extrados, agilizando e facilitando o processo a sua utilizao, deve-se obter uma referncia de Pattern por meio
de manipulao de cadeias de caracteres. do mtodo esttico compile(String padrao).
Em resumo, expresses regulares so composies de smbolos e
Pattern pattern = Pattern.compile(teste);
metacaracteres que, unidos entre si e com caracteres literais, criam
sequncias ou expresses de dados. Possuindo-se um texto, essa j ava.util.regex.Matcher: A classe Matcher responsvel pelas opera-
expresso regular utilizada para identificar e validar trechos de es de pesquisa e anlise de cadeias de caracteres de entrada,
informaes, retornando sucesso caso a expresso seja atendida possibilitando a execuo de buscas, retorno de resultados, ex-
em todas as suas condies e regras. trao de ndices de informaes e dados agrupados. Para a sua
Esta pesquisa e validao pelos padres de dados permite que utilizao, deve-se obter uma referncia de Matcher por meio do
uma mesma expresso regular seja criada para validar diferentes mtodo matcher(String texto) de uma referncia de Pattern.
situaes encontradas em trechos de textos, evitando que aplica-
es desenvolvidas em Java testem cadeias de caracteres inmeras Matcher matcher = pattern.matcher(Executando um teste de RegEx);

vezes por meio de estruturas condicionais, como se... ento... se- java.util.regex.PatternSyntaxException: A classe PatternSyntaxException
no..., e repetitiva, como enquanto... faa. Ou seja, a construo permite o controle e tratamento de excees lanadas durante o
de expresses regulares pode ser combinada possibilitando que uso de expresses regulares. Atravs da verificao desse tipo de
expresses complexas sejam construdas, da mesma maneira que exceo, possvel ter um controle maior sobre os erros gerados
expresses aritmticas e de lgica. a partir de consultas quando a sintaxe do padro informada
As expresses regulares permitem definir instrues abrangen- aplicao invlida.
tes de maneira simplificada e especfica. Partindo da definio de
uma expresso regular possvel obter uma lista de resultados Possuindo uma referncia para a classe Matcher, conforme
finita ou infinita a partir de seu confrontamento com um texto demonstrado nos pargrafos anteriores, possvel realizar as
ou outra fonte de dados textual. operaes de pesquisa, validade e extrao de informaes
Essas expresses, entre outras vantagens, so teis para busca, utilizando-se a expresso regular compilada em uma instncia
validao ou substituio de informaes como: de Pattern. O mtodo find(), da classe Matcher, responsvel pela
1. Data e hora; verificao da existncia de padres na cadeia de caracteres
2. Nmeros IP e endereos MAC; informada, j os mtodos start() e end() indicam, respectivamen-
3. Endereos de e-mail; te, as posies de incio e trmino quando uma parte do texto
4. Endereos de Internet; informado apresenta o padro pesquisado e, por fim mas no
5. Validao de documentos ou elementos XML; menos importante, o mtodo group(), responsvel pela extrao
6. Documentos pessoais como RG, CPF e Carto de Crdito. do trecho da cadeia de caractere que atende expresso regular
validada.
Em termos de software, expresses regulares so comumente
utilizadas por editores de textos e em linguagens de programao, Principais mtodos das classes Pattern e Matcher
tornando possvel a execuo de diversas tarefas como pesquisa, Esta seo define e detalha os principais mtodos para a elabo-
validao, substituio e extrao de informaes sejam simplifi- rao e uso de expresses regulares durante o desenvolvimento
cadas utilizando-se definies de sequncias e padres de anlise de aplicaes Java.
de dados, facilitando e agilizando diversas operaes. Na Tabela 1 esto descritos os principais mtodos da classe
Pattern, porm existem outros que podem ser consultados nos
Expresses Regulares em Java documentos da especificao do Java SE por meio dos links ane-
O desenvolvimento e utilizao de expresses regulares podem xados a este artigo.
ser feitos em diversas linguagens e tecnologias de programao, A Tabela 2 apresenta, de forma resumida, os mtodos mais
como JavaScript, ASP, PHP, C# e Java. Nesta seo, sero aborda- utilizados por uma instncia de Matcher.

14 Easy Java Magazine Edio 08


Compila a expresso regular passada como parmetro, transformando-a em um padro de pesquisa.
static Pattern compile(String regex)
Retorna uma instncia de Pattern.
Compila a expresso regular passada como parmetro, transformando-a em um padro de pesquisa,
juntamente com flags de configurao especial. As flags so: CASE_INSENSITIVE, MULTILINE, DOTALL,
static Pattern compile(String regex, int flags)
UNICODE_CASE, CANON_EQ, UNIX_LINES, LITERAL e COMMENTS.
Retorna uma instncia de Pattern.
String pattern() Retorna a expresso regular original, a partir da qual o padro foi compilado.
Cria uma instncia de Matcher que ser responsvel pela pesquisa na cadeia de caracteres passada como
Matcher matcher(CharSequence input)
parmetro utilizando a expresso regular j compilada.
Retorna os flags utilizados durante a compilao e criao do padro a partir da expresso regular. As
int flags()
flags so as mesmas que foram citadas anteriormente.
Compila a expresso regular passada como parmetro e verifica ocorrncias de padres na cadeia de
static boolean matches(String regex, CharSequence input)
caracteres de entrada, tambm informada como parmetro.
Tabela 1. Principais mtodos da classe Pattern

Pattern pattern() Retorna a instncia de Pattern possuindo o padro interpretado pela instncia de Matcher.
Retorna o ndice de incio da ocorrncia do padro na cadeia de caracteres de entrada. O aplicativo Java desenvolvido na Listagem 1 faz
int start()
uso do mtodo start() para recuperar o ndice de incio do texto quando o padro da expresso regular localizado.
Retorna o ndice de incio da ocorrncia do padro na cadeia de caracteres de entrada a partir do ndice do grupo desejado, conforme
int start(int group) valor passado como parmetro para o mtodo start(). O conceito de grupos de caracteres ser apresentado, de forma detalhada, na seo
Controle de grupos de informao em expresses regulares.
Retorna o ndice de trmino da ocorrncia do padro na cadeia de caracteres de entrada. O aplicativo Java desenvolvido na Listagem 1 faz
int end()
uso do mtodo end() para recuperar o ndice de trmino do texto quando o padro da expresso regular localizado.
Retorna o ndice de trmino da ocorrncia do padro na cadeia de caracteres de entrada a partir do ndice do grupo desejado, conforme
int end(int group)
valor passado como parmetro para o mtodo end().
String group() Retorna uma subsequncia da cadeia de caracteres de entrada a partir de uma ocorrncia do padro definido pela expresso regular.
Retorna uma subsequncia da cadeia de caracteres de entrada por meio de uma ocorrncia do padro definido pela expresso regular a
String group(int group)
partir do ndice do grupo desejado, conforme valor passado como parmetro para o mtodo group().

int groupCount() Retorna o nmero de grupos definidos no padro de pesquisa de uma instncia de Matcher conforme a estrutura de uma expresso regular.

boolean matches() Verifica ocorrncias de padres na cadeia de caracteres de entrada, retornando verdadeiro (true) ou falso (false).
Verifica a existncia de uma ocorrncia na cadeia de caracteres de entrada, retornando verdadeiro (true) ou falso (false). O mtodo find()
boolean find()
utilizado quando se deseja garantir que o texto analisado possui o padro da expresso regular.
Tabela 2. Principais mtodos da classe Matcher

Implementao de Expresses Regulares em Java Listagem 1. Exemplo1.java: Implementao de seu primeiro exemplo de expres-
Aps uma breve apresentao dos principais conceitos e informa- ses regulares.
es sobre expresses regulares, possvel aprofundar os conheci-
package principal;
mentos em programao de padres de anlise a partir da utilizao
de diversos recursos que fazem parte desta tecnologia. import java.util.regex.Matcher;
A fim de servir de exemplo, a Listagem 1 apresenta o uso das import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
classes e mtodos descritos anteriormente, permitindo a voc,
leitor, a implementao de seu primeiro aplicativo Java que faz public class Exemplo1 {
uso de expresses regulares. public static void main(String[] args) {
try {
A implementao realizada na Listagem 1 permite o entendimento
Pattern pattern = Pattern.compile(teste);
de uma das tarefas mais bsicas porm mais utilizadas pelo uso de ex- Matcher matcher = pattern.matcher(Este um teste de RegEx);
presses regulares: pesquisa e extrao de informaes. O aplicativo
desenvolvido objetiva a localizao do padro de informao teste while (matcher.find()) {
System.out.println(( + matcher.start() + , + matcher.end()
em uma cadeia de caracteres maior: Este um teste de RegEx. Para + ) + matcher.group());
verificar a existncia de ocorrncias do padro da expresso regular, }
este exemplo faz uso do mtodo find(), da instncia da classe Matcher, } catch (PatternSyntaxException ex) {
ex.printStackTrace();
percorrendo o texto de entrada em busca de trechos que atendam
}
ao formato da pesquisa. Quando este padro detectado, obtm-se }
os ndices de incio e trmino da localizao do texto, bem como se }
extrai esse trecho da cadeia de caracteres.

Edio 08 Easy Java Magazine 15


Uso de Expresses Regulares em Java

O resultado aps a execuo ser: A Tabela 3 apresenta um exemplo prtico da manipulao


e busca de padres em cadeias de caracteres. Utilizando-se o
(10,15) teste
padro teste, possvel efetuar uma pesquisa sequencial at
Os ndices 10 e 15 apontam para a posio inicial e final do que esse seja localizado entre os ndices de incio e trmino, ou
trecho teste localizado na cadeia de caracteres Este um teste seja, a ocorrncia do padro inicia-se no caractere de posio
de RegEx. igual a 10 e encerra quando o caractere de posio igual a 15
deixa de atender ao padro pesquisado.
Manipulao de cadeias de caracteres e metacaracteres A API de expresses regulares tambm fornece mecanismos
Uma das formas mais bsicas de comparao de padres su- para a implementao de pesquisas fazendo-se uso de carac-
portados pela tecnologia de expresses regulares a localizao teres especiais que contribuem para a formao de expresses
de informaes literais ou textuais. Para exemplificar, a Tabela 3 mais complexas e detalhadas, denominados de metacaracte-
possibilita visualizar a separao, caractere a caractere, da cadeia res. Cada metacaractere possui uma funcionalidade nica,
de entrada utilizada pela aplicao da Listagem 1. permitindo que novas caractersticas sejam adicionadas a
expresses regulares.
Listagem 2. Exemplo2.java: Uso dos metacaracteres [ e ]. Nesta seo, alm de serem abordados os metacaracteres e
suas funcionalidades, tambm sero apresentados diversos
package principal;
exemplos prticos de expresses regulares, objetivando a fcil
import java.util.regex.Matcher; compreenso e uso de recursos providos por esses caracteres
import java.util.regex.Pattern; especiais.
import java.util.regex.PatternSyntaxException;

public class Exemplo2 { Metacaractere \


public static void main(String[] args) { O metacaractere \ utilizado para a transformao de me-
try {
Pattern pattern = Pattern.compile([rgf ]ato); tacaracteres em caracteres literais. Sua utilizao bem simples:
Matcher matcher1 = pattern.matcher(rato); diversos caracteres possuem funcionalidades especiais, conforme
Matcher matcher2 = pattern.matcher(gato); apresentado durante essa seo. Porm, diversas vezes, torna-se
Matcher matcher3 = pattern.matcher(fato);
Matcher matcher4 = pattern.matcher(tato); necessrio utilizar o caractere em si e no sua funcionalidade. Por
exemplo, o caractere . permite a ocorrncia de quaisquer caracte-
if (matcher1.matches()) {
res, mas para utilizar esse smbolo sem sua funcionalidade, ele deve
System.out.println(Matcher1 validada: + matcher1.group());
} else { ser precedido pelo metacaractere \. Quando este caractere especial
System.out.println(Matcher1 invalidada); necessrio, deve-se utilizar \\, ao invs de apenas uma barra
}
invertida, com a finalidade de evitar caractersticas especiais.
if (matcher2.matches()) { Seu uso faz-se necessrio quando se deseja tornar caracteres
System.out.println(Matcher2 validada: + matcher2.group()); especiais em caracteres literais, isolando suas caractersticas ini-
} else {
System.out.println(Matcher2 invalidada);
ciais. Alguns exemplos do uso do metacaractere \ encontram-se
} a seguir. A partir do exemplo seguinte, cada smbolo, como .,
+, * e seguintes, exerce a funo de caractere, sem apresentar
if (matcher3.matches()) {
System.out.println(Matcher3 validada: + matcher3.group()); suas funcionalidades como metacaractere.
} else {
System.out.println(Matcher3 invalidada); \. \+ \* \? \| \{ \( \[ \^ \$
}
Metacaracteres [ e ]
if (matcher4.matches()) { Os metacaracteres [ e ] so empregados para se definir
System.out.println(Matcher4 validada: + matcher4.group());
um conjunto vlido de caracteres, possibilitando criar listas de
} else {
System.out.println(Matcher4 invalidada); caracteres que podem atender, de diversas formas, a uma mesma
} expresso regular. O uso destes metacaracteres muito til, pois
} catch (PatternSyntaxException ex) {
permitem que uma mesma expresso regular apresente diversos
ex.printStackTrace();
} caracteres que podem ser aceitos. A Listagem 2 apresenta um
} exemplo de uso dos metacaracteres [ e ] para a validao de
}
trs padres de anlise em apenas uma expresso regular.

E s t e u m t e s t e d e R e g E x
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

Tabela 3. Exemplo de manipulao de cadeias de caracteres

16 Easy Java Magazine Edio 08


O aplicativo apresentado na Listagem 2 utiliza a cadeia de Listagem 3. Exemplo3.java: Uso do metacaractere ? para determinar a existncia
caracteres[rgf]ato como padro de pesquisa. A partir dos de um determinado caractere, em zero ou uma vez.

metacaracteres [ e ], a expresso regular validar textos que package principal;


podem ter parte de seus trechos variando entre os caracteres
definidos em uma lista. No exemplo desta listagem, as palavras import java.util.regex.Matcher;
import java.util.regex.Pattern;
rato, gato e fato so vlidas conforme o padro, pois os import java.util.regex.PatternSyntaxException;
caracteres r, g e f compem uma lista que faz parte da
expresso regular completa, enquanto a palavra tato consi- public class Exemplo3 {
public static void main(String[] args) {
derada invlida pois no apresenta nenhum padro conforme try {
definido pela instncia de Pattern. O resultado da execuo do Pattern pattern = Pattern.compile(ab?);
Matcher matcher1 = pattern.matcher(a);
aplicativo ser:
Matcher matcher2 = pattern.matcher(ab);
Matcher matcher3 = pattern.matcher(abb);
Matcher1 validada: rato
Matcher2 validada: gato if (matcher1.matches()) {
Matcher3 validada: fato System.out.println(Matcher1 validada: + matcher1.group());
Matcher4 invalidada } else {
System.out.println(Matcher1 invalidada);
}
Metacaracteres ( e )
Os metacaracteres ( e ) so utilizados para se definir grupos if (matcher2.matches()) {
de informaes que fazem parte de uma expresso regular. So System.out.println(Matcher2 validada: + matcher2.group());
} else {
muito teis quando se deseja criar agrupamentos de expresses System.out.println(Matcher2 invalidada);
regulares, permitindo que informaes sejam extradas caso }
esse padro seja localizado em uma cadeia de caracteres a ser if (matcher3.matches()) {
System.out.println(Matcher3 validada: + matcher3.group());
validada. } else {
A extrao ou recuperao de informaes, assim como a pes- System.out.println(Matcher3 invalidada);
}
quisa por ocorrncias, uma das tarefas mais comuns quando
} catch (PatternSyntaxException ex) {
se desenvolve aplicaes com expresses regulares, pois nos ex.printStackTrace();
permite a pesquisa e recuperao de dados. Para exemplificar }
}
seu uso, esses metacaracteres podem ser empregados em siste-
}
mas que fornecem dados como balanas de pesagem, ambientes
automatizados e softwares que se comunicam por meio da troca
de mensagens. Metacaractere *
Os metacaracteres de agrupamento de dados sero descritos, de O metacaractere *, precedido de um elemento ou conjunto de
maneira detalhada, na seo Controle de grupos de informao elementos qualquer, utilizado para definir que esse elemento
em expresses regulares. deve combinar zero ou mais vezes.
A Listagem 4 exemplifica o uso do metacaractere * em uma
Metacaractere ? aplicao para verificar a ocorrncia de determinado caractere de
O metacaractere ?, precedido de um elemento ou conjunto de maneira quantitativa, ou seja, levando-se em conta a quantidade
elementos qualquer, utilizado para definir que esse elemento de caracteres.
deve combinar zero ou uma vez. O aplicativo apresentado emprega o caractere especial * para
A Listagem 3 exemplifica o uso do metacaractere ?, possibi- definir que o caractere b deve aparecer zero ou mais vezes, logo
litando a ocorrncia, em zero ou uma vez, de um determinado aps do caractere a. Esse metacaractere permite que o limite de
caractere que faz parte da expresso regular. busca de padres de anlise seja infinito, diferente de quando se
O aplicativo apresentado na Listagem 3 faz uso do caractere utiliza o metacaractere ?.
especial ? para determinar, na construo da expresso regular, O resultado da execuo da Listagem 4 ser:
que o caractere b deve aparecer zero ou uma vez, logo aps do
caractere a. Esse metacaractere possibilita uma nica ocorrncia, Matcher1 validada: a
Matcher2 validada: ab
ou no, de um determinado caractere ou cadeia de caracteres, Matcher3 validada: abb
possibilitando que o padro de anlise seja mais varivel, depen- Matcher4 validada: abbb
dendo das informaes de pesquisa desejadas.
O resultado da execuo do exemplo ser: Metacaractere +
O metacaractere +, precedido de um elemento ou conjunto de
Matcher1 validada: a elementos qualquer, utilizado para definir que esse elemento
Matcher2 validada: ab
Matcher3 invalidada deve combinar uma ou mais vezes.

Edio 08 Easy Java Magazine 17


Uso de Expresses Regulares em Java

A Listagem 5 apresenta uma aplicao empregando este indicando quantas vezes esse elemento deve ser repetido. Existem
metacaractere. diversas formas de se utilizar quantificadores, conforme apresen-
O exemplo demonstrado na Listagem 5 emprega o caractere tado na seo Tipos de Quantificadores.
especial + para definir que o caractere b deve aparecer uma O aplicativo desenvolvido na Listagem 6 exemplifica o uso dos
ou mais vezes, logo aps o caractere a. metacaracteres { e }.
Quando este aplicativo executado, o resultado apresentado Conforme apresentado no exemplo, os caracteres especiais { e
no console ser: } so empregados para definir que o caractere b deve aparecer
exatamente trs vezes aps o caractere a. Esse metacaractere
Matcher1 invalidada possibilita a existncia de ocorrncias, em nmero exato, de um
Matcher2 validada: ab
Matcher3 validada: abb determinado caractere ou cadeia de caracteres, definindo o limi-
Matcher4 validada: abbb te da ocorrncia de caracteres em padres de anlise durante a
elaborao da expresso regular.
Metacaracteres { e } Quando a Listagem 6 executada, o resultado exibido no con-
Os metacaracteres { e } so comumente empregados para sole ser:
possibilitar a criao de contadores de repetio de dados, tam- Matcher1 invalidada
bm chamados de quantificadores. Um elemento ou conjunto Matcher2 validada: abbb
Matcher3 invalidada
de elementos qualquer pode ser sucedido de um quantificador,

Listagem 4. Exemplo4.java: Uso do metacaractere * para determinar a existncia Listagem 5. Exemplo5.java: Uso do metacaractere + para determinar existncia
de um determinado caractere, em zero ou mais vezes. de um determinado caractere, em uma ou mais vezes.

package principal; package principal;

import java.util.regex.Matcher; import java.util.regex.Matcher;


import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException; import java.util.regex.PatternSyntaxException;

public class Exemplo4 { public class Exemplo5 {


public static void main(String[] args) { public static void main(String[] args) {
try { try {
Pattern pattern = Pattern.compile(ab*); Pattern pattern = Pattern.compile(ab+);
Matcher matcher1 = pattern.matcher(a); Matcher matcher1 = pattern.matcher(a);
Matcher matcher2 = pattern.matcher(ab); Matcher matcher2 = pattern.matcher(ab);
Matcher matcher3 = pattern.matcher(abb); Matcher matcher3 = pattern.matcher(abb);
Matcher matcher4 = pattern.matcher(abbb); Matcher matcher4 = pattern.matcher(abbb);

if (matcher1.matches()) { if (matcher1.matches()) {
System.out.println(Matcher1 validada: + matcher1.group()); System.out.println(Matcher1 validada: + matcher1.group());
} else { } else {
System.out.println(Matcher1 invalidada); System.out.println(Matcher1 invalidada);
} }

if (matcher2.matches()) { if (matcher2.matches()) {
System.out.println(Matcher2 validada: + matcher2.group()); System.out.println(Matcher2 validada: + matcher2.group());
} else { } else {
System.out.println(Matcher2 invalidada); System.out.println(Matcher2 invalidada);
} }

if (matcher3.matches()) { if (matcher3.matches()) {
System.out.println(Matcher3 validada: + matcher3.group()); System.out.println(Matcher3 validada: + matcher3.group());
} else { } else {
System.out.println(Matcher3 invalidada); System.out.println(Matcher3 invalidada);
} }

if (matcher4.matches()) { if (matcher4.matches()) {
System.out.println(Matcher4 validada: + matcher4.group()); System.out.println(Matcher4 validada: + matcher4.group());
} else { } else {
System.out.println(Matcher4 invalidada); System.out.println(Matcher4 invalidada);
} }
} catch (PatternSyntaxException ex) { } catch (PatternSyntaxException ex) {
ex.printStackTrace(); ex.printStackTrace();
} }
} }
} }

18 Easy Java Magazine Edio 08


Os metacaracteres { e } tambm podem ser empregados ocorrncia, em nmero inicial e final definidos, de um determinado
conforme apresentado na Listagem 7, possibilitando a ocorrncia, caractere que faz parte do padro.
em nmero inicial definido, de um determinado caractere que faz Conforme apresentado, possvel compreender que, por meio
parte da expresso regular. dos caracteres especiais { e }, pode-se definir que o caractere
b deve aparecer, pelo menos trs vezes, mas no mais que cinco,
Listagem 7. Exemplo7.java: Uso dos metacaracteres { e } para determinar quan- logo aps do caractere a.
tidade inicial de ocorrncias do caractere.
A sada gerada no console aps a execuo da Listagem 8
package principal; ser:
import java.util.regex.Matcher;
Matcher1 invalidada
import java.util.regex.Pattern;
Matcher2 validada: abbb
import java.util.regex.PatternSyntaxException;
Matcher3 validada: abbbbb
Matcher4 invalidada
public class Exemplo7 {
public static void main(String[] args) {
try {
Pattern pattern = Pattern.compile(ab{3,}); Listagem 8. Exemplo8.java: Uso dos metacaracteres { e } para determinar quan-
tidade inicial e final de ocorrncias do caractere.
Matcher matcher1 = pattern.matcher(a);
Matcher matcher2 = pattern.matcher(abbb);
package principal;
Matcher matcher3 = pattern.matcher(abbbb);
Matcher matcher4 = pattern.matcher(abbbbb);
import java.util.regex.Matcher;
import java.util.regex.Pattern;
if (matcher1.matches()) {
import java.util.regex.PatternSyntaxException;
System.out.println(Matcher1 validada: + matcher1.group());
} else {
public class Exemplo8 {
System.out.println(Matcher1 invalidada);
public static void main(String[] args) {
}
try {
Pattern pattern = Pattern.compile(ab{3,5});
if (matcher2.matches()) {
Matcher matcher1 = pattern.matcher(a);
System.out.println(Matcher2 validada: + matcher2.group());
Matcher matcher2 = pattern.matcher(abbb);
} else {
Matcher matcher3 = pattern.matcher(abbbbb);
System.out.println(Matcher2 invalidada);
Matcher matcher4 = pattern.matcher(abbbbbb);
}

if (matcher1.matches()) {
if (matcher3.matches()) {
System.out.println(Matcher1 validada: + matcher1.group());
System.out.println(Matcher3 validada: + matcher3.group());
} else {
} else {
System.out.println(Matcher1 invalidada);
System.out.println(Matcher3 invalidada);
}
}

if (matcher2.matches()) {
if (matcher4.matches()) {
System.out.println(Matcher2 validada: + matcher2.group());
System.out.println(Matcher4 validada: + matcher4.group());
} else {
} else {
System.out.println(Matcher2 invalidada);
System.out.println(Matcher4 invalidada);
}
}

} catch (PatternSyntaxException ex) {
if (matcher3.matches()) {
ex.printStackTrace();
System.out.println(Matcher3 validada: + matcher3.group());
}
} else {
}
System.out.println(Matcher3 invalidada);
}
}

A aplicao de exemplo desenvolvida na Listagem 7 utiliza os if (matcher4.matches()) {
System.out.println(Matcher4 validada: + matcher4.group());
caracteres especiais { e } para definir uma expresso regular que } else {
descreve a seguinte situao: o caractere b deve aparecer, aps o System.out.println(Matcher4 invalidada);
caractere a, pelo menos trs vezes, porm, sem limite final, ou seja, }
} catch (PatternSyntaxException ex) {
no h uma restrio para a quantidade limite de ocorrncias. ex.printStackTrace();
Quando este cdigo executado, a sada ser: }
}
}
Matcher1 invalidada
Matcher2 validada: abbb
Matcher3 validada: abbbb
Matcher4 validada: abbbbb Metacaractere ^
O metacaractere ^ utilizado para definir o incio de uma linha.
Com a finalidade de demonstrar outro uso comum dos metacarac- Esse metacaractere tambm utilizado, juntamente com listas, para
teres { e }, a Listagem 8 apresenta um aplicativo possibilitando a a criao de listas negadas, permitindo a elaborao de expresses

Edio 08 Easy Java Magazine 19


Uso de Expresses Regulares em Java

regulares que restringem ou excluem a ocorrncia de determinado pois a tecnologia Java torna opcional sua existncia. Para exem-
caractere ou grupo de caracteres. A Listagem 9 apresenta um exem- plificar, a seguinte expresso regular faz uso dos metacaracteres
plo de negao de listas, onde os caracteres r, g e f devero ser de posicionamento para delimitao de incio e trmino de sua
ignorados na validao da cadeia de caracteres de entrada. estrutura. Atente-se ao fato de que ambas as expresses so vlidas
O resultado da execuo do aplicativo Java apresentado na e desenvolvidas para o mesmo propsito.
Listagem 9 ser:
^[^rgf ]ato$
Matcher1 invalidada [^rgf ]ato
Matcher2 invalidada
Matcher3 invalidada Metacaractere .
Matcher4 validada: tato O metacaractere . (ponto) utilizado para validar um caractere
qualquer. Esse mecanismo ou propriedade da expresso regular til
Listagem 9. Exemplo9.java: Uso do metacaractere ^ para negao de listas de quando se torna necessrio permitir qualquer caractere numa certa
valores. posio. O ponto o metacaractere que significa qualquer caracte-
re, pois ele pode representar uma letra, um nmero, um smbolo,
package principal;
um TAB, etc. A Listagem 10 apresenta um exemplo de utilizao
import java.util.regex.Matcher; do caractere especial . para permitir a ocorrncia de um caractere
import java.util.regex.Pattern;
indefinido em determinado trecho da expresso regular.
import java.util.regex.PatternSyntaxException;

public class Exemplo9 {


public static void main(String[] args) { Listagem 10. Exemplo10.java: Uso do metacaractere . para permitir a ocorrncia
try { de qualquer caractere em determinado trecho da expresso.
Pattern pattern = Pattern.compile([^rgf ]ato);
Matcher matcher1 = pattern.matcher(rato); package principal;
Matcher matcher2 = pattern.matcher(gato);
Matcher matcher3 = pattern.matcher(fato); import java.util.regex.Matcher;
Matcher matcher4 = pattern.matcher(tato); import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
if (matcher1.matches()) {
System.out.println(Matcher1 validada: + matcher1.group()); public class Exemplo10 {
} else { public static void main(String[] args) {
System.out.println(Matcher1 invalidada); try {
} Pattern pattern = Pattern.compile(.ato);
Matcher matcher1 = pattern.matcher(rato);
if (matcher2.matches()) { Matcher matcher2 = pattern.matcher(1ato);
System.out.println(Matcher2 validada: + matcher2.group()); Matcher matcher3 = pattern.matcher(@ato);
} else { Matcher matcher4 = pattern.matcher(ato);
System.out.println(Matcher2 invalidada);
} if (matcher1.matches()) {
System.out.println(Matcher1 validada: + matcher1.group());
if (matcher3.matches()) { } else {
System.out.println(Matcher3 validada: + matcher3.group()); System.out.println(Matcher1 invalidada);
} else { }
System.out.println(Matcher3 invalidada);
} if (matcher2.matches()) {
System.out.println(Matcher2 validada: + matcher2.group());
if (matcher4.matches()) { } else {
System.out.println(Matcher4 validada: + matcher4.group()); System.out.println(Matcher2 invalidada);
} else { }
System.out.println(Matcher4 invalidada);
} if (matcher3.matches()) {
} catch (PatternSyntaxException ex) { System.out.println(Matcher3 validada: + matcher3.group());
ex.printStackTrace(); } else {
} System.out.println(Matcher3 invalidada);
} }
}
if (matcher4.matches()) {
System.out.println(Matcher4 validada: + matcher4.group());
} else {
Metacaractere $ System.out.println(Matcher4 invalidada);
O metacaractere $ utilizado para definir o trmino de uma li- }
} catch (PatternSyntaxException ex) {
nha. Esse metacaractere, assim como o ^, um caractere especial
ex.printStackTrace();
de posicionamento, responsvel pela marcao de incio de uma }
linha. A existncia dos caracteres especiais de posicionamento }
}
^, para incio, e $, para fim de uma linha, podem ser ocultos,

20 Easy Java Magazine Edio 08


Aps a execuo do aplicativo demonstrado na Listagem 10, a Listagem 11. Exemplo11.java: Uso do metacaractere |.
sada gerada no console ser:
package principal;

Matcher1 validada: rato import java.util.regex.Matcher;


Matcher2 validada: 1ato import java.util.regex.Pattern;
Matcher3 validada: @ato import java.util.regex.PatternSyntaxException;
Matcher4 invalidada
public class Exemplo11 {
public static void main(String[] args) {
Metacaractere | try {
O metacaractere | (pipe) utilizado para representar o operador Pattern pattern = Pattern.compile((r|g|f )ato);
Matcher matcher1 = pattern.matcher(rato);
ou lgico, onde se procura por uma coisa ou outra, devendo-se Matcher matcher2 = pattern.matcher(gato);
delimitar as opes com os parnteses. A Listagem 11 apresenta Matcher matcher3 = pattern.matcher(fato);
Matcher matcher4 = pattern.matcher(tato);
uma aplicao Java que faz uso do metacaractere | para validao if (matcher1.matches()) {
de trs padres de anlise em apenas uma expresso regular. System.out.println(Matcher1 validada: + matcher1.group());
O aplicativo apresentado utiliza a cadeia de caracteres (r|g|f) } else {
System.out.println(Matcher1 invalidada);
ato como padro de pesquisa. Por meio do metacaractere |, a }
expresso validar textos que podem ter parte de seus trechos
if (matcher2.matches()) {
variando entre caracteres definidos em conjunto com o operador System.out.println(Matcher2 validada: + matcher2.group());
lgico ou. No exemplo da Listagem 11, as palavras rato, gato } else {
System.out.println(Matcher2 invalidada);
e fato so vlidas, pois os caracteres r, g e f compem uma }
lista que faz parte da expresso regular completa. De acordo com
if (matcher3.matches()) {
o tamanho das expresses regulares, possvel substituir o meta-
System.out.println(Matcher3 validada: + matcher3.group());
caractere | pelos caracteres especiais [ e ], pois apresentam } else {
a mesma funcionalidade. System.out.println(Matcher3 invalidada);
}
Executando-se o aplicativo da Listagem 11, a sada gerada
ser: if (matcher4.matches()) {
System.out.println(Matcher4 validada: + matcher4.group());
} else {
Matcher1 validada: rato System.out.println(Matcher4 invalidada);
Matcher2 validada: gato }
Matcher3 validada: fato } catch (PatternSyntaxException ex) {
Matcher4 invalidada ex.printStackTrace();
}
}
Os metacaracteres nos fornecem funcionalidades especiais }
s expresses regulares, contribuindo muito para a construo
de padres mais complexos. Por meio desse tipo de caractere
torna-se possvel a existncia de diversas regras de ocorrncia, remove um caractere da cadeia de dados, repetindo o processo de
possibilitando a agregao de diversas premissas de validao a validao at que a ocorrncia do padro seja localizada ou at que
uma nica pesquisa. no haja mais caracteres restantes. Dependendo do quantificador
utilizado na expresso regular, a ltima ocorrncia vlida ser um
Tipos de Quantificadores ou nenhum caractere. A Tabela 4 apresenta os modos de criao
Aps a apresentao dos caracteres especiais { e }, respons- de expresses regulares fazendo uso de quantificadores do tipo
veis pela definio da quantidade de repetio de um elemento ganancioso.
ou conjunto de elementos, torna-se necessrio a apresentao de
trs divises para os metacaracteres denominados como quan- Quantificadores Relutantes ou Reluctant
tificadores. A organizao desses grupos est apresentada nos Os quantificadores do tipo relutantes, ou reluctant, diferente
subtpicos seguintes, sendo classificados como quantificadores dos quantificadores gananciosos, executam a operao ao contr-
gananciosos, relutantes e possessivos, a partir de suas rio. Os quantificadores do tipo relutantes realizam a pesquisa o
principais caractersticas. mnimo de vezes possvel, pelo menos uma vez, ou seja, a busca
por ocorrncias realizada poucas vezes, mas de maneira iterativa,
Quantificadores Gananciosos ou Greedy garantindo que vrios trechos e situaes sejam testados. Esses
Os quantificadores do tipo gananciosos, ou greedy, foram quantificadores devem ser utilizados de maneira consciente, pois
a instncia de Matcher a ler e interpretar a cadeia de caracteres por apresentam baixo desempenho pelo fato de ir e vir (backtracking)
inteiro antes de atender primeira combinao, tentando localizar a cada iterao durante a anlise de padres. A Tabela 5 apresen-
o maior nmero de ocorrncias possvel, aps uma nica analisada. ta os modos de criao de expresses regulares fazendo uso de
Caso a primeira combinao de padro falhar, a instncia de Matcher quantificadores do tipo relutante.

Edio 08 Easy Java Magazine 21


Uso de Expresses Regulares em Java

Quantificadores Possessivos ou Possessive Classes de caracteres


Os quantificadores do tipo possessivos, ou possessive, na- Alm das informaes apresentadas at aqui, existem outros
vegam, de maneira completa, pela cadeia de caracteres analisada, dados presentes nos documentos da especificao de expresses
executando a busca de padres apenas uma vez. Ao contrrio dos regulares em Java, onde possvel localizar uma documentao
quantificadores gananciosos, quantificadores possessivos nunca mais rica e com diversos exemplos sobre a construo dessas
recuam, mesmo que isso permita a localizao de ocorrncias. A expresses. A tecnologia de expresses regulares permite a
Tabela 6 apresenta os modos de criao de expresses regulares utilizao de uma sintaxe que possibilita a criao de classes
fazendo uso de quantificadores do tipo possessivo. de caracteres ou character classes.
No contexto de expresses regulares, uma classe de caracteres
Quantificador Descrio um conjunto de caracteres definidos entre os metacaracteres
X? X, zero ou uma vez [ e ], responsvel pela definio de um ou mais agrupamen-
tos de caracteres que compem a expresso final, similarmente
X* X, zero ou mais vezes
a uma lista de caracteres.
X+ X, uma ou mais vezes
Essas classes de caracteres nos fornecem mecanismos para
X{n} X, exatamente n vezes a criao de padres de anlise utilizando-se desde a defini-
X{n,} X, pelo menos n vezes o de classes simples at um conjunto maior de elementos,
X{n,m} X, pelo menos n vezes, mas no mais que m vezes fazendo uso da teoria dos conjuntos como unio, interseco
e subtrao.
Tabela 4. Descrio dos quantificadores do tipo ganancioso
A Tabela 7 define os mecanismos disponveis para a criao de
Quantificador Descrio classes de caracteres bem com suas respectivas descries.
X?? X, zero ou uma vez
Os tipos de classes de caracteres definem formatos de expres-
ses regulares que permitem a criao de padres de anlise
X*? X, zero ou mais vezes
mais especficos, possibilitando um maior refinamento quanto
X+? X, uma ou mais vezes
s informaes utilizadas em pesquisas complexas, tornando
X{n}? X, exatamente n vezes as consultas mais rpidas e eficientes, j que o conjunto final
X{n,}? X, pelo menos n vezes de ocorrncias apresenta caractersticas mais restritivas.
X{n,m}? X, pelo menos n vezes, mas no mais que m vezes Para exemplificar o tipo de classe de caractere simples, ou
seja, um conjunto limitado de caracteres, a Listagem 2 ilustra
Tabela 5. Descrio dos quantificadores do tipo relutante
a criao de uma expresso regular que define uma lista de
Quantificador Descrio elementos. Conjuntos de dados desse tipo nada mais so do
X?+ X, zero ou uma vez
que listas de caracteres disponveis para a criao de variantes
da expresso regular, aumentando o nmero do conjunto final
X*+ X, zero ou mais vezes
de palavras que formaro o padro utilizado nas pesquisas de
X++ X, uma ou mais vezes
ocorrncias.
X{n}+ X, exatamente n vezes O aplicativo Java demonstrado na Listagem 9, por sua vez, faz
X{n,}+ X, pelo menos n vezes uso de uma classe de caractere de negao, utilizada para de-
X{n,m}+ X, pelo menos n vezes, mas no mais que m vezes finir a omisso de determinados caracteres em uma expresso
regular. Graas a esse tipo de classe de caractere, possvel criar
Tabela 6. Descrio dos quantificadores do tipo possessivo conjuntos de caracteres ou palavras inteiras que no devero
a, b ou c
estar presente nas ocorrncias a serem pesquisadas.
[abc] Em determinadas situaes, torna-se necessria a definio
(classe simples)
Quaisquer caracteres exceto a, b ou c de um conjunto sequncial de caracteres, ao invs de defini-los
[^abc] um a um. Fazendo uso da classe de caracteres em srie, pode-se
(negao)
De a at z, ou de A at Z, inclusive criar um conjunto de caracteres apenas utilizando-se o smbolo
[a-zA-Z]
(definio de elementos sequenciais) - ou hfen, determinando os caracteres, nmeros ou smbolos
De a at d, ou de m at p: [a-dm-p] inicial e final. Por meio do exemplo da Listagem 12 possvel
[a-d[m-p]]
(unio entre conjuntos de elementos)
demonstrar o uso de uma classe de caractere em srie.
d, e ou f
[a-z&&[def]] O aplicativo apresentado responsvel pela elaborao de
(interseco entre conjuntos de elementos)
quatro expresses regulares que fazem uso de classes de ca-
De a at z, exceto b e c: [ad-z]
[a-z&&[^bc]] racteres em srie, sendo possvel visualizar que, utilizando-se
(subtrao entre conjuntos de elementos)
De a at z, e no de m at p: [a-lq-z] esse tipo de conjunto de elementos, evita-se a tarefa de definir,
[a-z&&[^m-p]] caractere a caractere, os elementos de uma lista extensa. O re-
(subtrao entre conjuntos de elementos)

Tabela 7. Descrio prtica das funcionalidades de classes de caracteres sultado aps a execuo do cdigo da Listagem 12 ser:

22 Easy Java Magazine Edio 08


Matcher1 e Patttern1 validados: c que um conjunto maior de informao seja transformado em um
Matcher1 e Patttern2 invalidados padro de anlise. A Listagem 13 apresenta um exemplo que faz
Matcher2 e Patttern1 validados: 3
uso de uma classe de caractere com unio.
Matcher2 e Patttern2 invalidados
O aplicativo apresentado na Listagem 13 exemplifica a criao de
Outra operao que se torna possvel ao se utilizar classes de classes de caracteres com unio, tornando possvel a concepo e
caracteres a unio. O comportamento de unio entre caracteres conexo entre listas de caracteres para a definio de listas maiores
ou conjuntos de caracteres alcanado quando uma ou mais listas e mais abrangentes. Apesar de possuir um formato simplificado,
so definidas internamente a outra j existente. A unio de listas sua utilizao possibilita a elaborao de expresses regulares
muito importante, principalmente quando se deseja criar inter- que necessitem trabalhar em conjunto com listas extensas de
valos de caracteres que, nem sempre, so sequnciais, permitindo caracteres, nmeros ou smbolos especiais.
Ao adotar este recurso, deve-se atentar ao fato que, quanto maio-
Listagem 12. Exemplo12.java: Desenvolvimento de expresses regulares com res as listas e agrupamentos ou unies de informaes, maiores
classes de caracteres em srie. sero os tempos de compilao e transformao da expresso
package principal; regular, assim como o desempenho final durante a busca por ocor-
rncias desse padro em uma cadeia de caracteres de entrada.
import java.util.regex.Matcher;
O resultado da execuo desta implementao ser:
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
Matcher1 validada: b
public class Exemplo12 { Matcher2 validada: 2
public static void main(String[] args) {
try { Outro conceito, tambm presente na teoria dos conjuntos, o
Pattern pattern1 = Pattern.compile([a-f ]); de interseco. A interseco um conjunto de elementos que,
Pattern pattern2 = Pattern.compile([^a-f ]);
Pattern pattern3 = Pattern.compile([1-8]);
simultaneamente, pertencem a dois ou mais conjuntos de dados.
Pattern pattern4 = Pattern.compile([^1-8]); Em expresses regulares, essa operao alcanada utilizando-se
o smbolo && ou o operador AND entre duas ou mais listas de
Matcher matcher1 = pattern1.matcher(c);
Matcher matcher2 = pattern3.matcher(3);
caracteres ou classes de caracteres. Esse tipo de classe utilizado
quando se deseja definir um conjunto constitudo de caracteres
if (matcher1.matches()) { em comum em diversas listas.
System.out.println(Matcher1 e Patttern1 validados:
+ matcher1.group());
} else { Listagem 13. Exemplo13.java: Desenvolvimento de expresses regulares com
System.out.println(Matcher1 e Patttern1 invalidados); classes de caracteres com unio.
}
package principal;
matcher1 = pattern2.matcher(c);
import java.util.regex.Matcher;
if (matcher1.matches()) { import java.util.regex.Pattern;
System.out.println(Matcher1 e Patttern2 validados: import java.util.regex.PatternSyntaxException;
+ matcher1.group());
} else { public class Exemplo13 {
System.out.println(Matcher1 e Patttern2 invalidados); public static void main(String[] args) {
} try {
Pattern pattern1 = Pattern.compile([abc[g-i]]); // igual a [abcghi]
if (matcher2.matches()) { Pattern pattern2 = Pattern.compile([123[7-9]]); // igual a [123789]
System.out.println(Matcher2 e Patttern1 validados:
+ matcher2.group()); Matcher matcher1 = pattern1.matcher(b);
} else { Matcher matcher2 = pattern2.matcher(2);
System.out.println(Matcher2 e Patttern1 invalidados);
} if (matcher1.matches()) {
System.out.println(Matcher1 validada: + matcher1.group());
matcher2 = pattern4.matcher(3); } else {
System.out.println(Matcher1 invalidada);
if (matcher2.matches()) { }
System.out.println(Matcher2 e Patttern2 validados: if (matcher2.matches()) {
+ matcher2.group()); System.out.println(Matcher2 validada: + matcher2.group());
} else { } else {
System.out.println(Matcher2 e Patttern2 invalidados); System.out.println(Matcher2 invalidada);
} }
} catch (PatternSyntaxException ex) { } catch (PatternSyntaxException ex) {
ex.printStackTrace(); ex.printStackTrace();
} }
} }
} }

Edio 08 Easy Java Magazine 23


Uso de Expresses Regulares em Java

Listagem 14. Exemplo14.java: Desenvolvimento de expresses regulares com O exemplo demonstrado na Listagem 14 faz uso de uma
classes de caracteres com interseco. classe de caracteres com interseco.
package principal;
O resultado da execuo da Listagem 14 ser:

import java.util.regex.Matcher; Matcher1 validada: e


import java.util.regex.Pattern; Matcher2 validada: 5
import java.util.regex.PatternSyntaxException;
Por fim, tambm possvel utilizar os conceitos de sub-
public class Exemplo14 { trao da teoria de conjuntos. A subtrao de conjuntos a
public static void main(String[] args) {
try { operao pela qual se nega uma ou mais classes de carac-
Pattern pattern1 = Pattern.compile([a-j&&[d-g]]); // igual a [defg] teres a partir da negao de uma lista de caracteres com o
Pattern pattern2 = Pattern.compile([1-9&&[4-7]]); // igual a [4567]
smbolo ^ juntamente com o operador &&. A subtrao

Matcher matcher1 = pattern1.matcher(e); de um conjunto A pelo conjunto B a formao de um novo
Matcher matcher2 = pattern2.matcher(5); conjunto composto por todos os elementos de A menos os
elementos comuns aos dois conjuntos.
if (matcher1.matches()) {
System.out.println(Matcher1 validada: + matcher1.group()); Para exemplificar, a Listagem 15 apresenta uma aplicao
} else { Java que faz uso de uma classe de caracteres com subtrao.
System.out.println(Matcher1 invalidada);
}
A sada gerada aps a execuo desta listagem ser:

if (matcher2.matches()) { Matcher1 validada: b


System.out.println(Matcher2 validada: + matcher2.group()); Matcher2 validada: 2
} else {
System.out.println(Matcher2 invalidada); Conforme apresentado nesta seo, as classes de caracteres
} nos fornecem recursos adicionais quando se deseja utilizar
} catch (PatternSyntaxException ex) {
ex.printStackTrace(); listas de caracteres. As listas tornam possvel a definio
} de conjuntos, sequnciais ou no, de informaes, podendo
}
ser representadas como caracteres, nmeros e/ou smbolos
}
especiais, e isto pode ser feito, perfeitamente, com expres-
Listagem 15. Exemplo15.java: Desenvolvimento de expresses regulares com ses regulares.
classes de caracteres com subtrao.
As classes de caracteres, assim como os metacaracteres, so
package principal; ferramentas valiosas para desenvolvedores que necessitam
trabalhar com padres complexos, admitindo a construo
import java.util.regex.Matcher;
de sintaxes flexveis porm extensas.
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
Classes de caracteres pr-definidas
public class Exemplo15 { Alm da possibilidade de criar classes de caracteres para
public static void main(String[] args) {
try {
compor trechos ou padres por completo, a tecnologia de
Pattern pattern1 = Pattern.compile([a-j&&[^d-g]]); // igual a [abchij] expresses regulares tambm nos fornece classes de carac-
Pattern pattern2 = Pattern.compile([1-9&&[^4-7]]); // igual a [12389] teres pr-definidas. As classes de caracteres pr-definidas

oferecem recursos simplificados de classes de caracteres,
Matcher matcher1 = pattern1.matcher(b);
Matcher matcher2 = pattern2.matcher(2); tornando mais fcil e rpida a elaborao e uso de padres
de anlise.
if (matcher1.matches()) { A Tabela 8 ilustra as classes de caracteres pr-definidas,
System.out.println(Matcher1 validada: + matcher1.group());
} else {
muitas vezes utilizadas por serem um meio simples porm
System.out.println(Matcher1 invalidada); eficaz da validao e criao de padres, reduzindo, de ma-
} neira considervel, o tempo gasto para a definio de uma
expresso regular que faz uso de validao de tipos.
if (matcher2.matches()) {
System.out.println(Matcher2 validada: + matcher2.group()); Como visto, as classes de caracteres pr-definidas facilitam
} else { muito o desenvolvimento de expresses regulares, sendo
System.out.println(Matcher2 invalidada); possvel diminuir o tamanho dos padres quando se torna
}
} catch (PatternSyntaxException ex) {
necessrio validar o tipo de um determinado caractere ou
ex.printStackTrace(); cadeia de caracteres. Em conjunto com os quantificadores,
} as classes de caracteres pr-definidas podem ser muito teis
}
quando trechos ou conjuntos de informaes devem estar
}
de acordo com um tipo de dado definido. A Listagem 16

24 Easy Java Magazine Edio 08


apresenta uma aplicao Java que faz uso de classes de carac- Listagem 16. Exemplo16.java: Desenvolvimento de expresses regulares com
classes de caracteres pr-definidas.
teres pr-definidas.
package principal;
import java.util.regex.Matcher;
- Como j informado, atente-se ao fato de que, em Java, o caractere \ possui import java.util.regex.Pattern;
funcionalidades especficas, portanto, deve-se utilizar \\ para evitar essas import java.util.regex.PatternSyntaxException;
public class Exemplo16 {
caractersticas especiais.
public static void main(String[] args) {
try {
. Quaisquer caracteres Pattern pattern1 = Pattern.compile(r.t.);
Pattern pattern2 = Pattern.compile(\\d{3});
\d Um dgito: [0-9] Pattern pattern3 = Pattern.compile(\\D{3});
\D Um no-dgito: [^0-9] Pattern pattern4 = Pattern.compile(\\s{3});
Pattern pattern5 = Pattern.compile(\\S{3});
\s Um caractere em branco ou de espaamento: [ \t\n\x0B\f\r] Pattern pattern6 = Pattern.compile(\\w{3});
Pattern pattern7 = Pattern.compile(\\W{3});
\S Um no-caractere em branco ou de espaamento: [^\s] Matcher matcher1 = pattern1.matcher(rato); // ou rota
\w Um caractere de palavra: [a-zA-Z_0-9] (inclusive underline) Matcher matcher2 = pattern2.matcher(123);
Matcher matcher3 = pattern3.matcher(abc);
\W Um no-caractere de palavra: [^\w] Matcher matcher4 = pattern4.matcher(\n\t\r);
Matcher matcher5 = pattern5.matcher(b@2);
Tabela 8. Descrio prtica das funcionalidades de classes de caracteres pr-definidas Matcher matcher6 = pattern6.matcher(a_1);
Matcher matcher7 = pattern7.matcher(!*@);
if (matcher1.matches()) {
O aplicativo desenvolvido na Listagem 16, apesar de simples, System.out.println(Matcher1 validada: + matcher1.group());
faz uso de classes de caracteres pr-definidas demonstrando, na } else {
System.out.println(Matcher1 invalidada);
prtica, a simplificao da definio, elaborao e construo de }
expresses regulares utilizadas para a validao de tipos de ca- if (matcher2.matches()) {
System.out.println(Matcher2 validada: + matcher2.group());
racteres ou cadeia de caracteres, reduzindo o tamanho do padro
} else {
de ocorrncia e, consequentemente, o desempenho final durante System.out.println(Matcher2 invalidada);
a pesquisa de trechos que casam com o formato elaborado. }
if (matcher3.matches()) {
O resultado da execuo deste cdigo ser: System.out.println(Matcher3 validada: + matcher3.group());
} else {
Matcher1 validada: rato System.out.println(Matcher3 invalidada);
Matcher2 validada: 123 }
Matcher3 validada: abc if (matcher4.matches()) {
System.out.println(Matcher4 validada: + matcher4.group());
Matcher4 validada:
} else {

System.out.println(Matcher4 invalidada);
}
Matcher5 validada: b@2 if (matcher5.matches()) {
Matcher6 validada: a_1 System.out.println(Matcher5 validada: + matcher5.group());
Matcher7 validada: !*@ } else {
System.out.println(Matcher5 invalidada);
}
Controle de grupos de informao em expresses regulares if (matcher6.matches()) {
System.out.println(Matcher6 validada: + matcher6.group());
Muitas vezes, a comunicao entre sistemas ou processos com- } else {
putacionais d-se por meio da troca de mensagens textuais que System.out.println(Matcher6 invalidada);
possuem um formato padronizado, sendo possvel extrair diversas }
if (matcher7.matches()) {
informaes a partir de uma nica cadeia de caracteres. No campo System.out.println(Matcher7 validada: + matcher7.group());
de desenvolvimento de software existem diversas situaes que } else {
System.out.println(Matcher7 invalidada);
se aplicam a essa necessidade de validar e recuperar dados. }
Imagine a comunicao de um sistema com uma balana de } catch (PatternSyntaxException ex) {
ex.printStackTrace();
pesagem: a informao final, apesar de ser apenas uma nica }
cadeia de caracteres, nos fornece demais dados como marca, }
}
modelo, nmero de srie, data e hora e a quantidade pesada. Com
essa definio, torna-se possvel a elaborao de uma expresso
regular capaz de ter seu formato validado. No entanto, deve ser Aps diversos exemplos de utilizao de expresses regulares,
capaz tambm de obter cada trecho da informao gerada pela principalmente para a validao de padres e tipos de dados em
balana, com a finalidade de controlar outras informaes alm cadeias de caracteres, esta seo pretende apresentar o controle
do peso calculado. Para resolver a situao de exemplo levantada, de grupos de dados. Utilizando-se os recursos de grupos em ex-
sero apresentados os mtodos da classe Matcher que fornecem os presses regulares, pode-se tratar mltiplos caracteres como uma
recursos necessrios para a extrao de informaes por meio de entidade unitria de informao. Para tornar possvel a criao
grupos de dados. de agrupamentos, deve-se separar os caracteres ou conjunto de

Edio 08 Easy Java Magazine 25


Uso de Expresses Regulares em Java

caracteres entre os smbolos ( e ). Delimitando-se caracteres, Executando-se o aplicativo, para cada grupo localizado, seu frag-
metacaracteres ou at classes de caracteres com parnteses, mento respectivo ser extrado e exibido no console. Assim, aps a
formam-se grupos de informao em padres de anlise. execuo da aplicao, a sada resultante, exibida no console, ser:
Para cada grupo localizado em uma expresso regular, h
Matcher1 validada: #12345ABC_
um ndice identificando-o, tornando possvel a recuperao Grupo 1: #12345ABC_
fragmentada de trechos de cadeias de caracteres validadas. O Grupo 2: 12345ABC
Grupo 3: 12345
aplicativo desenvolvido na Listagem 17 exemplifica a criao de
Grupo 4: ABC
uma expresso regular que faz uso de grupos de informao. Seu
objetivo extrair trechos de informaes por meio dos ndices dos Concluso
agrupamentos delimitados na expresso regular. Durante o desenvolvimento de sistemas e aplicaes, para fins
acadmicos ou comerciais, h diversas situaes onde se torna
Listagem 17. Exemplo17.java: Desenvolvimento de expresses regulares com til, e muitas vezes necessrio, a validao e extrao de infor-
grupos de informao.
maes, baseando-se em um formato determinado previamente.
package principal; A partir de uma cadeia de caracteres de entrada, torna-se preciso
import java.util.regex.Matcher; um mecanismo eficiente e seguro para fornecer diversos dados
import java.util.regex.Pattern; sobre a estrutura e valor da informao validada, possibilitando
import java.util.regex.PatternSyntaxException;
public class Exemplo17 { utilizar padres de pesquisa para a realizao de um confronta-
public static void main(String[] args) { mento de dados.
try { A tecnologia Java capaz de ser utilizada para criar aplicativos
Pattern pattern = Pattern.compile(#((\\d{5})(\\w{3}))_);
que fazem uso desses padres de pesquisa, denominados como
Matcher matcher1 = pattern.matcher(#12345ABC_);
if (matcher1.matches()) { expresses regulares ou regular expressions, para facilitar o desen-
System.out.println(Matcher1 validada: + matcher1.group()); volvimento de processos de pesquisas complexas e mais refinadas.
for (int i = 0; i <= matcher1.groupCount(); i++) { Por meio de expresses regulares possvel especificar padres
System.out.println(Grupo + (i + 1) + :
+ matcher1.group(i)); compostos de smbolos e metacaracteres que, em conjunto com
} demais informaes literais, criam sequncias ou expresses de
} else { dados.
System.out.println(Matcher1 invalidada);
Alm dos conceitos e do embasamento terico, o artigo apre-
}
} catch (PatternSyntaxException ex) { sentou, de forma didtica, alguns exemplos de aplicaes que
ex.printStackTrace(); fazem uso de classes relacionadas ao desenvolvimento com ex-
} presses regulares, demonstrando que no necessrio possuir
}
}
conhecimentos muito avanados de programao Java, visto que,
a partir do contedo apresentado, torna-se possvel a utilizao
de padres de anlise, para a resoluo de diversos problemas
O aplicativo da Listagem 17 recebe a cadeia de caracteres e situaes localizados durante o processo de desenvolvimento
#12345ABC_ como informao de entrada e, por meio da ex- de software.
presso regular #((\\d{5})(\\w{3}))_, os grupos so definidos, O que foi abordado neste artigo apenas uma breve amostra
separando os trechos de dados por parnteses. Com a cadeia de de como a tecnologia de expresses regulares pode auxiliar no
entrada validada, torna-se possvel obter fragmentos do trecho desenvolvimento de aplicaes Java, incorporando caractersticas
apenas informando-se o ndice do grupo desejado. A Tabela 9 de validao e extrao de dados no desenvolvendo de software.
exemplifica a diviso grfica dos grupos de informao, baseando- H muito ainda a ser explorado sobre essa tecnologia, criando a
se no formato da expresso regular. possibilidade de novos artigos e trabalhos relacionados.

# 1 2 3 4 5 A B C _ Guilherme de Cleva Farto


Grupo 1 ( - - - - - - - - ) guilherme.farto@gmail.com
graduado em Bacharelado em Cincia da Computao pela Fundao
Grupo 2 ( - - - - - - )
Educacional do Municpio de Assis (FEMA) e ps-graduando em
Grupo 3 ( - - - ) Engenharia de Componentes Java pela TNT Edu e Faculdades Integradas de
Grupo 4 ( - ) Ourinhos (FIO). Trabalha como desenvolvedor Java Web para PRX (Prxima)
Software e Servios / Grupo TOTVS
Tabela 9. Diviso grfica dos grupos de informao, baseando-se no formato da expresso regular

26 Easy Java Magazine Edio 08


O IDE NetBeans Parte 3
Criando uma aplicao GUI com a plataforma Java

Carlos Arajo

A Resumo DevMan
utilizao de um Ambiente Integrado de Desenvolvimen-
to (IDE) pressupe investimento de tempo no projeto vi-
sual do aplicativo e na edio do cdigo. O projeto visual De que se trata o artigo:
consiste em posicionar e redimensionar componentes tais como Trata da criao passo a passo de uma pequena aplicao GUI usando
botes, caixas de texto e painis em um form. Por outro lado, a recursos do IDE estudados anteriormente, alm de mostrar como customi-
edio de cdigo corresponde a programar respostas a eventos zar o cdigo gerado pelo NetBeans. O estudo de caso complementado
tais como clique de botes ou pressionamento de uma tecla. com uma breve apresentao dos gerenciadores de layout.
Essas so tarefas corriqueiras que podem ser realizadas usando
um IDE. Tais tarefas sero apresentadas na prtica nesta ltima Para que serve:
parte da matria, aps termos explorado com algum detalhamento Atende aos desenvolvedores que desejam adotar um layout de utilizao
vrios recursos oferecidos pelo NetBeans. mais fcil, com o objetivo de criar aplicaes com interface grfica que
O conhecimento dos recursos, tais como complementao de c- seja realmente multiplataforma. Alm disso, apresenta os recursos para
digo, gerncia de conexo a diversos bancos de dados e integrao customizao do cdigo gerado pelo IDE.
de vrias ferramentas em um nico IDE, que foram analisados nas
duas primeiras partes da matria, so fundamentais para desen- Em que situao o tema til:
volver aplicaes com mais eficincia e maior produtividade. A implementao de sistemas multiplataforma em Java necessita prin-
A criao de um pequeno aplicativo com interface grfica en- cipalmente do conhecimento e utilizao de gerenciadores de layout.
cerra esta srie de artigos, possibilitando ao leitor a aplicao do Usar esses gerenciadores nas aplicaes GUI no tarefa muito simples,
conhecimento exposto nas duas primeiras partes do minicurso. mas o Group Layout, distribudo com o Java 6 e chamado de Free Design
Nesta parte, principalmente, sero explorados o GUI Builder e o no NetBeans, nos leva a um trabalho mais fcil. Esse o tema principal
uso do Group Layout, alm do Editor de Cdigo e da customizao deste artigo, mas tambm proveitoso a quem deseja personalizar o
do cdigo gerado pelo NetBeans. Com esta prtica pretende-se dar cdigo do NetBeans.
o suporte necessrio para que o programador possa usar o IDE
com desenvoltura em seus futuros projetos. O IDE NetBeans Parte 3:
Neste artigo finalizamos o minicurso sobre NetBeans mostrando a criao
Layouts de uma aplicao Swing simples e funcional, onde so aplicados recursos
Em Java, layouts so abstraes que definem o comportamento e do GUI Builder. dado destaque utilizao do layout padro do NetBe-
a maneira como os componentes ficam dispostos em uma interface ans o Free Design que, como poder ser comprovado, torna o esforo
do usurio. Gerenciadores de layout organizam o redimensiona- despendido no desenho das interfaces grficas bem mais leve. Alm disso,
mento e o posicionamento dos widgets dentro de um continer, h uma breve introduo implementao dos manipuladores de eventos,
permitindo que as interfaces grficas se adaptem s diversas e so apresentadas as maneiras que a ferramenta disponibiliza para que o
resolues de vdeo, aparncia e comportamento desses compo- desenvolvedor possa personalizar o cdigo fonte gerado pelo ambiente.
nentes. Observe na Figura 1 uma GUI que no utiliza gerenciador Os recursos disponveis para essa personalizao derrubam o mito de que
de layout. So mostradas imagens de uma janela, antes e depois o cdigo gerado pelo NetBeans fechado e no pode ser modificado.
de um redimensionamento. Note que os botes no so reposi-
cionados aps o redimensionamento da janela. Os gerenciadores O NetBeans agiliza o desenvolvimento de aplicaes GUI,
de layout a tcnica criada pelos projetistas do Java para garantir permitindo que os layouts sejam visualizados e configurados
a portabilidade das aplicaes em diferentes plataformas. sem a necessidade de escrever cdigo. O IDE suporta vrios ge-
renciadores de layout de Java. Entretanto, no oferece suporte a
OverlayLayout e SpringLayout. A seguir sero descritos brevemente
os layouts suportados pelo ambiente:
Desenho livre (Free Design) Esta a denominao que o
NetBeans utiliza para se referir ao gerenciador de layout Group
Figura 1. Interface grfica antes e depois do redimensionamento Layout, lanado junto com o Java SE 6. Com sua utilizao pode-se

Edio 08 Easy Java Magazine 27


O IDE NetBeans Parte 3

posicionar e redimensionar os componentes livremente no form.


medida que os widgets so arrastados, arranjados, alinhados
e redimensionados, o GUI Builder apresenta dicas visuais que
ajudam no posicionamento dos componentes.
O desenho do form utilizando essas guias sugeridas pelo IDE
permite que o redimensionamento da janela, a especificao da
Figura 3. Exemplo de BorderLayout
aparncia ou a alterao de locais (Locale) no modifiquem o re-
lacionamento entre os componentes. Ou seja, a janela da aplicao Layout de caixa (BoxLayout) Com este gerenciador os com-
se ajusta aparncia e funcionalidade do sistema operacional. ponentes so arranjados horizontalmente ou verticalmente. Os
A classe Locale usada para representar uma regio geogrfica, widgets so posicionados da esquerda para direita ou de cima para
poltica ou cultural. Por exemplo, a formatao de um nmero, baixo medida que so adicionados ao form. Os componentes no
provida pela classe NumberFormat, depende de Locale. Tal como so deslocados para uma segunda linha ou coluna, mesmo que
no caso do nmero 123456, que representado como 123.456 no novos objetos sejam adicionados ou o form seja redimensionado.
Brasil e 123,456 nos Estados Unidos. Veja nas Figuras 4 e 5 exemplos de utilizao de BoxLayout.
Na Figura 2 podemos ver as guias de alinhamento e ancoragem.
Este o gerenciador de layout padro do NetBeans. Na aplicao
exemplo que ser criada mais adiante ser detalhada a utilizao
do Free Design.
Figura 4. BoxLayout com arranjo horizontal

Figura 2. Guias de alinhamento e ancoragem


Figura 5. BoxLayout com empilhamento vertical
Layout absoluto (AbsoluteLayout) Usar este gerenciador ou
Null Layout produz o mesmo resultado. AbsoluteLayout permite Layout de carto (CardLayout) Os componentes ficam arranja-
que os componentes sejam posicionados exatamente onde se de- dos em cartes (um tipo de painel) compartilhando a mesma rea
seja e redimensionados usando suas bordas. O NetBeans suporta de um continer. Apenas um carto visvel de cada vez. Para
esse layout por razes histricas, mas os desenvolvedores no definir qual dos componentes ser exibido, a classe CardLayout
devem us-lo em aplicaes de produo, pois a posio e/ou oferece mtodos para navegao, tais como first() para acessar
dimenso de um componente, quando a aplicao for executa- o primeiro carto e next() para acessar o prximo, aps o atual.
da, no ir se alterar mesmo que haja mudana de aparncia no Assemelha-se ao uso de abas, como no Firefox, por exemplo.
ambiente ou redimensionamento da interface. Este gerenciador Layout de conjunto de grades (GridBagLayout) Organiza os
de layout til para construir prottipos. Prottipo um sis- componentes colocando cada um em uma clula de uma grade.
tema normalmente sem funcionalidades. Isto , criado apenas Um componente pode ocupar mais de uma clula. As linhas da
com a interface grfica. Comumente, um prottipo utilizado grade podem ter alturas diferentes, assim como as larguras das
para aprovao do cliente ou para identificao dos requisitos colunas, ou seja, as clulas no precisam ter o mesmo tamanho.
(funcionalidades) do usurio, por exemplo. A ideia de usar Uma classe chamada GridBagConstraints define como o compo-
AbsoluteLayout que o prottipo deve ser criado rapidamente nente ir se comportar dentro da clula. Por exemplo, o atributo
e depois descartado. insets dessa classe define o espao ao redor do widget, que nulo
Layout de borda (BorderLayout) Divide o continer em cinco por padro. Na Figura 6 pode ser visto um exemplo de utilizao
regies, onde os componentes so arranjados: norte, sul, leste, oes- deste gerenciador de layout.
te e centro, como mostra a Figura 3. As posies so representadas Layout de fluxo (FlowLayout) Dispe os componentes um ao
por constantes definidas na classe BorderLayout, tais como CEN- lado do outro, formando uma linha. Se o continer no tiver espao
TER, que posiciona um componente na regio central do continer suficiente para acomodar todos os componentes em uma linha, o
e NORTH, que posiciona um objeto na regio superior. prprio gerenciador se encarrega de posicion-los em uma nova

28 Easy Java Magazine Edio 08


linha. Veja o exemplo na Figura 7 e observe que o FlowLayout A seguir, sero ento mostradas as etapas necessrias para o desen-
respeita o tamanho do componente, definindo uma largura para volvimento desta interface, comeando pela criao do projeto.
o boto, que seja necessria para acomodar o rtulo.
Layout de grade (GridLayout) Arranja os componentes em Primeira etapa: Criar o projeto
clulas de mesmo tamanho. O nmero de linhas e colunas pode Para criar o projeto siga os passos a seguir:
ser configurado. Note no exemplo da Figura 8 que o gerencia- 1. Com o NetBeans aberto, escolha Arquivo > Novo projeto, ou
dor ajustou o tamanho das clulas tomando como base o maior pressione CTRL + SHIFT + N;
componente. 2. Em Categorias, selecione Java, e em Projetos, escolha Aplicativo
Java. Feito isso clique no boto Prximo;
3. Na tela seguinte digite Calculadora em Nome do projeto,
desmarque a caixa Criar classe principal e deixe as demais opes
como esto;
4. Clique no boto Finalizar.

Figura 6. Exemplo de GridBagLayout Ao final, na janela Projetos haver um projeto denominado Calcu-
ladora, como pode ser visto na Figura 9. Note que o nome do mesmo
est em negrito, indicando que ele o principal. Projeto principal
o ponto de entrada (mdulo principal) de uma aplicao; ele que
contm a classe main. Muitas opes de menu atuam por padro
Figura 7. Exemplo de FlowLayout
sobre o projeto principal como, por exemplo, Executar > Construir
projeto principal ou Executar > Executar projeto principal. No entanto,
ter um projeto principal no obrigatrio. Por exemplo, vejamos
o que acontece se voc selecionar Executar > Definir como projeto
principal > Nenhum. A partir da, se houver um arquivo aberto no
Editor de Cdigo, as opes de menu Construir projeto principal e
Figura 8. Exemplo de GridLayout Executar projeto principal mudam para Construir projeto (nome do
projeto) e Executar projeto (nome do projeto). Se no houver arquivo
Null Layout Consiste no desenho da interface sem utilizar aberto no Editor estas opes estaro desabilitadas.
layout. Em cada widget devem ser definidas as suas coordenadas
e suas dimenses.
No NetBeans muito simples selecionar um layout. Para definir
um layout para um continer simplesmente clique com o boto
direito sobre ele. Em seguida escolha Definir layout e ento escolha
a opo desejada. Clicar com o boto direito sobre o continer no
Inspetor tambm permite definir um gerenciador de layout. Uma
aplicao no precisa estar atrelada a um nico gerenciador de
layout. Em cada continer tal como um JFrame ou JPanel no
software aplicativo possvel definir um gerenciador diferente.
Figura 9. Janela Projetos destacando o projeto recm-criado
Criando uma aplicao GUI
Com o objetivo de aplicar alguns dos conhecimentos sobre o Segunda etapa: Criar e editar a interface
NetBeans expostos at aqui, nesta seo ser criada uma pequena Para criar a interface grfica necessrio um continer, onde
interface grfica. Mais do que simplesmente construir a interface, sero colocados os componentes. Como vimos anteriormente, a
ser mostrado como codificar o comportamento de alguns com- Swing oferece vrias opes de continer. Dentre elas, optamos
ponentes, tais como botes, caixas de texto e botes de rdio. por usar o componente JFrame. Ele ser criado em um pacote dentro
A interface consiste de uma calculadora de quatro operaes, do n Pacotes de cdigo-fonte, seguindo estes passos:
onde duas caixas de texto (JTextField) sero usadas para entrada 1. Na janela Projetos, clique com o boto direito no n Pacotes de
dos valores a serem calculados, quatro botes de rdio (JRadio- cdigo-fonte e escolha Novo > Formulrio JFrame;
Button) permitem a escolha da operao desejada (adio, sub- 2. Digite CalculadoraUI em Nome da classe e ui em Pacote;
trao, multiplicao e diviso), um boto (JButton) faz o clculo 3. Clique em Finalizar.
e o resultado mostrado em uma terceira caixa de texto. Alm
destes, dois botes completam a interface: um que faz a limpeza Nesse momento o NetBeans cria um form e uma classe denomi-
das caixas de texto e outro que provoca a sada do programa. nada CalculadoraUI. No GUI Builder aberto o form recm-criado,

Edio 08 Easy Java Magazine 29


O IDE NetBeans Parte 3

pronto para ser desenhado a partir da Paleta. Antes de prosseguir


com o exemplo, importante destacar que, neste artigo, usaremos
o termo "desenhar/desenho" como traduo de "design", para no
confundir com o termo "projetar/projeto". Fazemos essa observa-
o, porque a palavra "projeto" usada para designar um plano
ou esquema para criar um produto. Por outro lado, "desenho" diz
respeito ao esboo ou rascunho de um objeto. Desta forma, para
desenhar a interface, proceda desta maneira:
1. Na janela Propriedades localize title e digite Calculadora, para
definir o ttulo do JFrame;
2. Selecione ento um JPanel da Paleta e arraste-o para o JFrame.
Posicione-o prximo ao canto superior esquerdo do continer at
que duas linhas guia apaream indicando a posio preferencial,
como podemos ver na Figura 10. Neste ponto solte o painel;

Figura 11. Linha guia margem direita

Figura 10. Linhas guia horizontal e vertical

3. Agora vamos redimensionar o JPanel para que ele possa aco- Figura 12. Posicionamento do JPanel em relao ao JButton
modar os outros componentes. Deste modo, clique na ala de
redimensionamento da margem direita do painel e o arraste at que identifique o grupo de componentes. Para definir o ttulo
que a linha guia da margem direita aparea na borda do JFrame, selecione o JPanel, v para a janela Propriedades e clique no boto
conforme mostra a Figura 11. Solte nesse ponto a ala de redi- elipse (...) da propriedade border;
mensionamento; 7. Na caixa de dilogo que aberta, selecione Borda de ttulo na
4. Selecione um JButton da Paleta e posicione-o prximo ao canto lista e digite Calculadora na propriedade Ttulo;
inferior direito do JFrame. Assegure-se de posicionar o boto 8. Clique em OK para salvar;
quando as linhas guias, semelhantes quelas da Figura 10, apa- 9. Neste exemplo, um JLabel ser utilizado para identificar caixas
recerem; de texto, principalmente. Ento, clique em um JLabel na Paleta e
5. Clique na ala de redimensionamento da margem inferior do posicione-o no canto superior esquerdo do JPanel, quando surgirem
JPanel e arraste-a para baixo at que apaream trs linhas guia as duas linhas guia, semelhante ao que exibido na Figura 13;
entre ele e o boto, como podemos ver na Figura 12. Voc tem 10. Neste ponto ser adicionada uma caixa de texto ao lado di-
essas trs opes de espaamento entre os componentes. Optamos reito do rtulo anterior. Selecione ento um JTextField na Paleta.
por deixar o espaamento em trs linhas, portanto solte a ala de Movimente o cursor direita do rtulo recm-adicionado at que
redimensionamento nesse ponto; aparea a linha que indica que os dois componentes esto alinha-
6. De uma maneira geral o JPanel rene componentes que per- dos pela base, e as duas linhas que definem a margem entre eles,
tencem a um mesmo grupo, tal como no exemplo que est sendo de acordo com o que pode ser visto na Figura 14. Clique nesse
criado. Nesta situao aconselhvel atribuir um ttulo ao painel, ponto para posicionar o componente;

30 Easy Java Magazine Edio 08


15. E adicione mais um JLabel repetindo o passo 12;
16. Neste momento vamos inserir quatro JRadioButtons abaixo
do rtulo recm-adicionado e indentado em relao a ele. Deste
modo, selecione um JRadioButton na Paleta e posicione-o abaixo
do ltimo rtulo, de forma que os dois fiquem alinhados pela
esquerda. Movimente-o levemente para direita at que a linha
guia de indentao aparea, como mostra a Figura 16, e clique
no painel ao mesmo tempo em que pressiona a tecla SHIFT. O
pressionamento desta tecla ao mesmo tempo em que solta o com-
ponente permite adicionar mais de um widget do mesmo tipo, sem
a necessidade de selecion-lo na Paleta a cada vez. Ao posicionar
o ltimo componente, no se deve mais pressionar SHIFT, para
evitar que um prximo clique de mouse insira uma cpia adicional
Figura 13. Posicionamento do JLabel no painel e desnecessria do objeto.

Figura 14. Alinhamento do JTextField em relao ao JLabel


Figura 16. Indentao de um JRadioButton em relao a um rtulo
11. Agora clique na ala de alinhamento da caixa de texto, arraste-a
at aparecer a linha guia da margem direita do painel e ento 17. Adicione ento mais trs JRadioButton no painel, um direita
solte-a. Dessa maneira, quando o form for redimensionado, a caixa do outro, respeitando sempre o espaamento sugerido;
de texto tambm ser; 18. Os botes que realizam os clculos e a limpeza dos campos
12. Selecione novo rtulo (JLabel) e posicione-o conforme a sero posicionados no canto inferior direito do painel. Adicione
Figura 15; ento um JButton no JPanel de acordo com a Figura 17;
13. Em seguida adicione um JTextField repetindo os passos 10 e 11;
14. Adicione um JLabel repetindo o passo 12 e mais um JTextField
repetindo os passos 10 e 11;

Figura 17. Posicionamento de JButton no canto inferior direito do painel

19. Adicione mais um JButton esquerda do boto anterior, res-


Figura 15. Posicionamento de um rtulo em relao a outro componente peitando o alinhamento conforme a Figura 18;

Edio 08 Easy Java Magazine 31


O IDE NetBeans Parte 3

Componente Editar texto Alterar nome da varivel


jPanel1 - pnCalculadora
jLabel1 Primeiro Nmero: lblPrimeiro
jLabel2 Segundo Nmero: lblSegundo
jLabel3 Resultado: lblResultado
jLabel4 Operao: lblOperacao
jTextField1 0 txtPrimeiro
jTextField2 0 txtSegundo
jTextField3 - txtResultado
jRadioButton1 Adio rbAdicao
jRadioButton2 Subtrao rbSubtracao
Figura 18. Posicionamento de um JButton em relao a outro jRadioButton3 Multiplicao rbMultiplicacao

20. A fim de oferecer uniformidade, aconselhvel definir que os jRadioButton4 Diviso rbDivisao
botes em um continer tenham o mesmo tamanho. Para obter jButton1 Sair btnSair
isso, selecione os dois botes adicionados no painel pressionando jButton2 Calcular btnCalcular
ao mesmo tempo a tecla CTRL. Ento clique com o boto direito jButton3 Limpar btnLimpar
em um deles, escolha a opo Mesmo tamanho e marque Mesma
largura. Dessa forma os dois botes tero o mesmo tamanho da- Tabela 1. Textos e nomes de variveis
quele que tiver o texto maior;
21. Para finalizar esta etapa, selecione o jRadioButton1 e marque provvel que, ao modificar o texto dos rtulos, as caixas de tex-
a caixa de verificao da propriedade selected. Isso define a to tenham ficado com tamanhos diferentes. Isto acontece devido
operao padro da Calculadora, pois esta a opo que estar aos rtulos terem diferentes tamanhos e os JTextField precisarem
selecionada sempre que o programa executar. se posicionar relativamente aos rtulos conforme ficou definido
durante o desenho da interface. A fim de resolver esse problema,
Ao adicionar um componente no form o NetBeans atribui a ele vamos alinhar os rtulos direita. Para fazer o alinhamento,
um nome de varivel e, quando o caso, um texto (text). Para um mantenha a tecla CTRL pressionada e selecione os trs rtulos.
JButton, por exemplo, text identifica visualmente o objeto. Em um Em seguida clique no boto Alinhar direita na coluna na barra de
JTextField, o texto representa o contedo digitado pelo usurio. ferramentas, como mostra a Figura 19.
Essas propriedades devem ser modificadas para representar in-
formaes mais significativas, tanto para o usurio quanto para o
desenvolvedor. Contudo, antes de editar o texto e alterar o nome da
varivel de cada componente necessrio agrupar os JRadioButtons
de forma que apenas um esteja marcado de cada vez. Para conse-
guir essa funcionalidade preciso adicionar os quatro botes a um
ButtonGroup. Isto obtido obedecendo os passos a seguir:
1. Selecione um ButtonGroup na Paleta e o coloque em qualquer
lugar no form. Ele no visvel na interface, apenas em Inspetor,
sob o n Outros componentes;
2. Selecione o primeiro JRadioButton na interface;
3. Na janela Propriedades localize buttonGroup, clique na caixa
combinada direita e selecione buttonGroup1;
4. Repita os passos 2 e 3 para os demais JRadioButtons.

Aps finalizar esse procedimento, ir aparecer uma linha Figura 19. Alinhamento de componentes direita
indicando que os botes de rdio esto interligados formando
um grupo. Clique no boto Visualizar desenho na barra de ferramentas do
Agora sero modificados o texto e o nome da varivel dos com- GUI Builder para ver uma prvia da interface (Figura 20).
ponentes. Para fazer essas alteraes, clique com o boto direito
do mouse sobre o componente na interface e selecione cada uma Terceira etapa: Adicionar funcionalidade
das opes: Editar texto ou Alterar nome da varivel. Guie-se pela Agora que a interface est pronta, vamos programar as funes
Tabela 1 para fazer as alteraes. de cada um dos botes: Sair, Limpar e Calcular.

32 Easy Java Magazine Edio 08


Listagem 1. Mtodo manipulador de evento para o boto Sair.

private void btnSairActionPerformed(java.awt.event.ActionEvent evt) {


System.exit(0);
}

Listagem 2. Mtodo manipulador de evento para o boto Limpar.

private void btnLimparActionPerformed(java.awt.event.ActionEvent evt) {


txtPrimeiro.setText(0);
txtSegundo.setText(0);
txtResultado.setText();
}

Listagem 3. Mtodo manipulador de evento para o boto Calcular.

private void btnCalcularActionPerformed(java.awt.event.ActionEvent evt) {


double primeiro, segundo, resultado = 0;
primeiro = Double.parseDouble(txtPrimeiro.getText());
segundo = Double.parseDouble(txtSegundo.getText());
if (rbAdicao.isSelected()) {
Figura 20. Prvia da interface resultado = primeiro + segundo;
} else if (rbSubtracao.isSelected()) {
resultado = primeiro - segundo;
Para adicionar funcionalidade a um boto necessrio atribuir } else if (rbMultiplicacao.isSelected()) {
um manipulador de eventos ao componente para responder aos resultado = primeiro * segundo;
} else {
eventos. No caso da calculadora, estamos interessados no evento
resultado = primeiro / segundo;
que ocorre quando o boto pressionado. Na prxima seo }
apresentaremos mais detalhes sobre eventos no Swing. txtResultado.setText(String.valueOf(resultado));
}
Vamos iniciar programando o boto Sair - que deve fechar o
aplicativo. Para isso, clique com o boto direito do mouse sobre ele. Listagem 4. Cdigo que adiciona um EventListener.
No menu pop-up escolha Eventos > Action > actionPerformed. Nesse
btnLimpar.addActionListener(new java.awt.event.ActionListener() {
momento o IDE adiciona um ActionListener ao componente e gera public void actionPerformed(java.awt.event.ActionEvent evt) {
um mtodo actionPerformed(), abrindo o Editor de Cdigo, para btnLimparActionPerformed(evt);
permitir que o mtodo seja modificado. Apague a linha TODO e }
});
acrescente o cdigo exibido na Listagem 1.
O boto Limpar ir efetuar a limpeza dos JTextFields. Siga o que
foi feito para o boto Sair e codifique o mtodo actionPerformed() mtodo initComponents(), bem como outras partes do cdigo tm
de acordo com a Listagem 2. um fundo azulado, o que indica que no podem ser modificados.
O boto Calcular far a operao definida pelo ButtonGroup. Para dessa forma que o NetBeans protege o cdigo gerado, mantendo-o
adicionar o ActionListener faa como nos botes anteriores. Escre- sincronizado com o form.
va o mtodo actionPerformed() como o exposto na Listagem 3. No entanto, ainda que o cdigo gerado pelo IDE seja protegido
Vamos analisar o cdigo do boto Calcular. Primeiramente, para modificaes usando o Editor de Cdigo, o NetBeans oferece
observe que as caixas de texto contm Strings - retornadas pelo suporte sua personalizao. As maneiras de fazer essa custo-
mtodo getText() portanto seus valores precisam ser convertidos mizao, e suas variadas opes, sero apresentadas na ltima
inicialmente para double, o que feito usando o mtodo parseDou- seo deste artigo.
ble(). Em seguida, o mtodo isSelected() verifica qual a operao
selecionada e ento faz o clculo correspondente. Finalmente o
resultado mostrado na caixa txtResultado. Entretanto, antes de
apresentar o resultado, necessrio converter o valor numrico
para String, usando o mtodo valueOf().
primeira vista o cdigo da classe CalculadoraUI parece no
implementar muita coisa que necessria para o funcionamento
da interface, tal como a adio do ActionListener aos botes
anteriores. Mas veremos que isso est oculto pelo IDE. Para tal,
clique na marca como mostra a Figura 21 para expandir o mtodo
initComponents(). Note agora que, entre outros, possvel ver um
trecho de cdigo semelhante ao da Listagem 4, que implementa a
incluso do ActionListener em um boto. Observe tambm que o Figura 21. Expandindo cdigo gerado pelo NetBeans

Edio 08 Easy Java Magazine 33


O IDE NetBeans Parte 3

Por fim, pressione F6 para executar o programa. Se aparecer um escolhendo a opo Personalizar cdigo. Feito isso uma janela como
dilogo alertando que no existe classe main definida para o pro- a da Figura 22 ser mostrada.
jeto, simplesmente escolha ui.CalculadoraUI na lista e confirme. A rea principal da janela mostra o cdigo gerado intercalado
com o cdigo personalizado pelo desenvolvedor. As linhas em
Tratamento de eventos cinza so geradas, mas podem ser modificadas escolhendo a op-
Uma interface grfica, por si s, no faz nada. Suas funcionali- o criao personalizada na caixa combinada (ComboBox) ao lado
dades vm da sua capacidade de lidar com eventos. E os eventos esquerdo de cada linha. O espao entre as linhas geradas podem
decorrem principalmente da interao do usurio com a aplicao, ser preenchidas com o cdigo do programador.
tais como o pressionamento de uma tecla, um movimento de
mouse ou clique de um boto. Quando esses eventos acontecem Listagem 5. Chamada ao mtodo que registra o listener.
eles devem ser tratados, de modo que o programa responda
btnSair.addActionListener(new java.awt.event.ActionListener() {
encaminhando o fluxo de execuo para mtodos denominados public void actionPerformed(java.awt.event.ActionEvent evt) {
tratadores de eventos. btnSairActionPerformed(evt);
Para permitir que um usurio interaja com uma aplicao GUI, }
});
atravs de um componente, necessrio o desenvolvedor executar
os seguintes passos: Listagem 6. Classe GUI implementando ActionListener.
1. Criar uma classe de tratamento de eventos, que chamada de
public class MinhaGUI extends JFrame implements ActionListener {
listener; JButton botao = new JButton(Sair);
2. Instanciar um objeto dessa classe;
//...
3. Registar esse objeto nos componentes que sero fontes de eventos.
MinhaGUI() {
//...
Uma classe de tratamento de eventos normalmente implementa botao.addActionListener(this);
}
uma interface ouvinte. Em Swing h vrias interfaces dessas, uma
para cada tipo de evento. Por exemplo: quando pressionamos um public void actionPerformed(ActionEvent e) {
boto gerado um ActionListener; se um JFrame for fechado um System.exit(0);
}
WindowListener gerado; e um MouseListener quem escuta o }
clique de um mouse.
Um ActionListener provavelmente o manipulador de evento que
ocorre mais comumente nas interfaces grfica, e tambm o mais Alm disso, observe que possvel alterar os modificadores de
fcil de implementar. Esse o listener que foi usado no exemplo da acesso da varivel correspondente ao objeto selecionado.
Calculadora e que ser usado nesta explanao. A segunda abordagem para customizar o cdigo gerado
O NetBeans adota a soluo de criar uma classe annima para atravs da janela Propriedades. Selecione o componente desejado
tratamento de eventos e a instanciar na chamada ao mtodo que e escolha a aba Cdigo na janela Propriedades. Com isso, uma lista
registra o listener no componente. Classe annima uma classe de propriedades como a da Figura 23 ser mostrada.
definida dentro de um mtodo - para a qual apenas um objeto ser Para modificar uma propriedade, clique no boto elipse () ao
instanciado - e cujo nome omitido na sua criao. lado de cada uma. Uma janela de edio ser aberta para inserir
Observe na Listagem 5 que o mtodo addActionListener() que o cdigo desejado, como mostra a Figura 24. Tanto nesta janela
registra o ouvinte em btnSair - recebe como parmetro um objeto quanto no Personalizador do cdigo existe suporte a complementao
ActionListener. Este objeto instanciado quando new java.awt. de cdigo da mesma forma que no Editor do IDE.
event.ActionListener() executado. A classe ActionListener uma As opes que o NetBeans prov para personalizar e controlar o
classe annima e implementa o mtodo actionPerformed(). Por sua cdigo gerado vo desde a alterao de modificadores at a inclu-
vez este mtodo invoca btnSairActionPerformed(evt), que imple- so de trechos de cdigo. Algumas dessas opes so:
mentado no corpo da classe GUI e mostrado na Listagem 1. N ome da varivel. Nome da varivel para um componente;
Existem outras maneiras de escrever um ActionListener. Uma Modificadores de variveis. Modificadores de acesso padro do
delas consiste em definir que a classe GUI implemente a interface Java (default, public, protected e private), bem como static, final,
ActionListener. Dessa maneira, a prpria GUI deve implementar volatile e transient. A varivel de um componente definida por
o mtodo actionPerformed(). Observe esta soluo no fragmento padro como private, mas nessa opo possvel alterar isso;
de cdigo mostrado na Listagem 6. U sar varivel local. Define que a referncia ao componente
Swing local a initComponents() e no criado como um membro
Personalizando o cdigo gerado pelo IDE da classe;
H duas maneiras para personalizar o cdigo gerado pelo Net- Criao de cdigo personalizado. A traduo correta desta opo
Beans. A primeira usando o Personalizador do cdigo. Este recurso deve ser "cdigo de criao personalizado". Nesta opo possvel
alcanado clicando com o boto direito sobre um componente e inserir um trecho de cdigo para instanciar o componente;

34 Easy Java Magazine Edio 08


C digo de pr-criao. Trecho de cdigo que ser executado
antes da criao do componente;
C digo de ps-criao. Cdigo que ser executado imediata-
mente aps a inicializao do componente;
Cdigo de pr-inicializao. Trecho de cdigo que executado
antes que as propriedades do componente sejam definidas;
C digo de ps-inicializao. Cdigo que executado depois
que as propriedades do widget so definidas;
C digo de ps-ouvintes. Cdigo que ser executado aps a
execuo dos ouvintes (listeners) de evento do componente;
P r-adicionando cdigo. Cdigo que ser executado antes que
o componente seja adicionado ao continer;
Ps-adicionando cdigo. Cdigo a ser executado imediatamente
aps o objeto ser adicionado ao continer;
C digo After-All-Set. Nesta opo pode ser informado o tre-
cho de cdigo a ser executado depois que o componente estiver
completamente configurado;
C digo de pr-declarao. Aqui definido o trecho de cdigo que
ser executado antes da declarao da varivel do componente;
C digo de ps-declarao. Define o trecho de cdigo que ser
executado aps a declarao da varivel do componente;
Figura 23. Propriedades da gerao de cdigo
Na Figura 25 apresentado um trecho do cdigo de initCom-
ponents(). Nele esto destacados como comentrios as posies
onde algumas das opes de personalizao de cdigo citadas
anteriormente so inseridas. Repare que personalizamos apenas
o cdigo gerado para o boto btnFechar.
Grande parte do cdigo customizado adicionado no mtodo
initComponents(). Considerando que a varivel do widget um
membro da classe, ento os cdigos de pr-declarao e ps-de-
clarao so inseridos na rea de declarao de variveis membro,
ou seja, fora de initComponents().

Figura 24. Editor de cdigo personalizado

Figura 22. Personalizador do cdigo Figura 25. Cdigo de initComponents() intercalado com trechos do desenvolvedor

Edio 08 Easy Java Magazine 35


O IDE NetBeans Parte 3

material apresentado deve servir apenas como ponto de partida


Nota do DevMan para os que desejam adotar o NetBeans como ferramenta de
desenvolvimento. Cabe a cada um buscar mais informaes,
Sistema de controle de verso: um sistema de controle de verso registra a evoluo de um principalmente em Ajuda > Contedo da Ajuda do prprio IDE, e
projeto, guardando as alteraes feitas em cada arquivo. Esses registros mantm a informao de a documentao e suporte disponveis no site oficial, cuja URL
quem fez uma alterao, quando e onde. Alm disso, possvel reconstruir uma verso especfica
de um arquivo se for necessrio. Este sistema possibilita a colaborao, permitindo que vrios mostrada na seo Links.
desenvolvedores trabalhem simultaneamente sobre os mesmos arquivos sem que um sobrescreva o
cdigo do outro. Permite ainda manter verses diferentes do mesmo projeto. Por exemplo, possvel
manter uma verso 1.0, enquanto a equipe trabalha na verso 2.0. CVS, Mercurial e Subversion so
exemplos de sistemas de controle de verso. netbeans.org
Site oficial do NetBeans.
netbeans.org/kb/index_pt_BR.html
Concluses Documento e suporte do NetBeans.
Na parte final deste minicurso foi desenvolvido passo a passo
um aplicativo exemplo, que demonstrou como utilizar o Free De- netbeans.org/kb/docs/java/quickstart-gui_pt_BR.html
sign e como implementar a manipulao de eventos no IDE. Alm Tutorial que ensina dimensionamento, alinhamento e ancoragem de
disso, mostramos que possvel modificar o cdigo gerado pelo componentes usando Free Design.
NetBeans, desde que sejam usados os prprios recursos do IDE.
NetBeans IDE Programmer Certified Expert Exam Guide (Exam 310-045)
Usar outro editor para modificar o arquivo pode comprometer o Preparao para o exame de certificao em NetBeans. Escrito por
sincronismo entre a classe e o arquivo do form, impedindo que o Robert Liguori e Ryan Cuprak.
GUI Builder abra a interface grfica posteriormente.
Apesar de termos estudado vrios recursos, no possvel
explorar tudo que oferecido em um IDE como o NetBeans em Carlos Arajo
trs artigos. Muito mais possibilidades existem a ser analisadas, stonefull.stm@gmail.com
tais como depurao, refatorao e suporte a times de desenvol- professor do curso de Sistemas de Informao no Centro Universitrio Luterano
vimento, com destaque para os sistemas de controle de verso. de Santarm Par. Leciona Estruturas de Dados e Linguagem de Programao
O que foi exposto aqui merece um estudo mais aprofundado, Orientada a Objetos usando Java, desenvolve sistemas h 20 anos e certificado SCJP.
Mantm o blog http://professorcarlos.blogspot.com.
pois no foi pretenso do autor esgotar os tpicos abordados. O

36 Easy Java Magazine Edio 08


Conhecendo as mtricas
de software
Como medir seu cdigo?
Eduardo Spnola

M Resumo DevMan
tricas de software tm sido apontadas como um
dos principais mecanismos para tornar o desenvol-
vimento e manuteno de softwares uma disciplina De que se trata o artigo:
mais previsvel e controlvel [Car 03]. Medir uma prtica Conhecer o cdigo um requisito essencial para que seja possvel de-
bsica em qualquer tipo de engenharia e na Engenharia de senvolver novas funcionalidades e mant-las com qualidade. Assim, neste
Software no diferente. Neste contexto, vrias mtricas tm artigo veremos como obter informaes do cdigo para que possamos
sido propostas para se medir atributos como tamanho, com- tomar as melhores decises sobre a evoluo do mesmo.
plexidade, coeso e acoplamento dos mais variados artefatos
de software. Para que serve:
As mtricas esto relacionadas tanto com o produto, como com Mtricas de software servem para termos parmetros de referncia sobre
processos de desenvolvimento e manuteno do software. A como est o cdigo de nossas aplicaes, saber como est o desempenho
partir delas, conseguem-se dados quantitativos que oferecem de cada membro da equipe do projeto, a complexidade de cada mtodo,
uma boa informao sobre o andamento do projeto. Com essas classe, entre outras informaes.
informaes, possvel fazer a estimativa de custos, prazos de
entrega e at mesmo ter noo sobre a qualidade do sistema Em que situao o tema til:
[Car 03]. Este tema til para desenvolvedores, analistas e gerentes de projetos
Nos dias de hoje, o desenvolvimento de grandes sistemas que se preocupam com a qualidade do mesmo e que precisam de dados
uma atividade que vem se tornando cada vez mais comum e que para poder tomar decises a respeito do software em desenvolvimento.
consome muito tempo e esforo. Sabendo-se que cada etapa do
desenvolvimento de um sistema requer planejamento e esforo, Conhecendo as mtricas de software:
preciso fornecer informaes para que os desenvolvedores Neste artigo abordamos o conceito de mtricas de software, destacando
possam tomar decises sobre o andamento das atividades. a sua importncia para que o desenvolvedor saiba como obter informaes
Desta forma, as mtricas de software tornam-se necessrias sobre seu cdigo. Alm disso, conhecemos trs mtricas: de tamanho, de
para identificar informaes sobre o processo e auxiliar nas complexidade e de coeso.
decises tomadas.

Tipos de Mtricas a anlise do desenvolvimento de software e, por consequncia,


As mtricas de software so divididas em mtricas do produ- erros nas decises de projeto.
to, do processo e do projeto. As mtricas do produto descrevem Auxiliado pelas mtricas de cdigo fonte, possvel conhecer
caractersticas do produto como tamanho, complexidade, de- a complexidade, o tamanho do sistema, a quantidade de mto-
sign, performance e nveis de qualidade. Mtricas de processo dos, o nvel de coeso e o grau de acoplamento entre classes,
podem ser usadas para melhorar as atividades de desenvol- alm de se poder medir a produtividade dos programadores,
vimento e manuteno do software. J as mtricas de projeto dentre outros.
descrevem as caractersticas do projeto em desenvolvimento,
como o nmero de desenvolvedores, utilizao de padres, Mtricas de cdigo fonte
custo, produtividade, entre outros. Uma das mtricas mais simples que pode ser extrada de um
Entre as muitas mtricas de produto, as mtricas de cdigo software a mtrica de nmero de linhas de cdigo. Entretanto,
fonte esto entre as mais importantes. Muitas destas esto muitos so os fatores que podem gerar uma diferena no resultado
diretamente relacionadas ao paradigma da linguagem de da contagem. Antigamente, quando a linguagem de programao
programao, como o caso das mtricas orientadas a objeto. utilizada era o Assembler, cada comando representava uma linha
Entretanto, existem tambm mtricas que independem do de cdigo. No entanto, atualmente, com as linguagens de alto
paradigma de desenvolvimento adotado. Neste ponto, vale nvel, a contagem pode obter diferentes valores, podendo ser
ressaltar a importncia da escolha das mesmas. Uma m escolha influenciada pela contagem ou no de comentrios, linhas em
das mtricas pode resultar em informaes inadequadas para branco, e a forma como as estruturas da linguagem so escritas.

Edio 08 Easy Java Magazine 37


Conhecendo as mtricas de software

Mtrica Aplicada em Atributo O que medem


Complexidade e alternativas possveis no controle
Cyclomatic complexity CC (McCabe, 1976) Classes e mtodos Complexidade
de fluxo
Lines of Code LOC (Lorenz e outros, 1994) Classes e mtodos Tamanho Obter o tamanho das classes e mtodos
Depth of Inheritance Tree DIT (Chidamber e outros, 1994) Classes e interfaces Herana Reuso, compreenso e teste
Number of Children NOC (Chidamber e outros, 1994) Classes e interfaces Herana Reuso
Response for Classe RFC (Chidamber e outros, 1994) Classes Comunicao Acoplamento, complexidade e pr-requisitos para teste
Coupling between object classes CBO (Chidamber e outros, 1994) Classes Comunicao Coeso e reuso
Coeso, complexidade, encapsulamento e uso de
Lack of Cohesion in Methods LCOM (Chidamber e outros, 1994) Classes Comunicao
variveis
Complexidade, tamanho, esforo para manuteno
Weighted Methods per Class WMC (Chidamber e Kemerer, 1994) Classes Complexidade
e reuso
Number of Methods NOM (Lorenz e outros, 1994) Mtodos Tamanho Corresponde a WMC onde o peso de cada mtodo 1
Number of Statements NOS (Lorenz e outros, 1994) Mtodos Tamanho Obter o nmero de sentenas em um mtodo
Number of Instance Variables NIV (Lorenz e outros, 1994) Classes Tamanho Obter o nmero de variveis de instncia
Number of Class Variables - NCV (Lorenz e outros, 1994) Classes Tamanho Obter o nmero de variveis de classe
Obter o nmero de mtodos herdados e definidos
Number of Inherited Methods NMI (Lorenz e outros, 1994) Mtodos Herana
em uma superclasse
Obter o nmero de mtodos definidos em uma
Number of Overriden Methods NMO (Lorenz e outros, 1994) Mtodos Herana
superclasse e redefinidos na subclasse

Tabela 1. Exemplo de mtricas de cdigo fonte [Car 03]

Listagem 1. Cdigo comentado. Um exemplo deste problema pode ser visto nas Listagens 1 e 2,
onde o mesmo cdigo apresentado, s que escrito de formas
import java.io.*;
diferentes.
public class Estrutura A partir das Listagens 1 e 2, pode-se notar uma pequena dife-
implements Serializable {
rena na quantidade de linhas, mas que, considerando que esse
private String nome, trecho de cdigo faz parte de um sistema com centenas de clas-
endereco; ses, essa diferena, se repercutida nos demais arquivos, pode se
//Construtor da classe Estrutura
tornar significativa. Nestas imagens, tambm possvel observar
public Estrutura() { diferenas no estilo de programao, como por exemplo, quanto
quebra de linha. Como voc pode notar, muitos so os fatores
}
//Mtodo main que podem influenciar no resultado de uma mtrica.
public static void main(String args[]) { A seguir, na Tabela 1, sero apresentadas algumas mtricas de
//Verifica a quantidade de argumentos passados cdigo fonte [Car 03].
if (args.length == 3)
System.out.println(Testando argumentos);
else Mtricas estudadas neste artigo
System.out.println(ERRO);
Para este artigo foram estudadas algumas mtricas de cdigo
}
} fonte (tamanho, complexidade e coeso), sendo apresentadas a
partir de agora.
Listagem 2. Cdigo no comentado.

import java.io.*; Mtrica de tamanho


Uma das mtricas de cdigo fonte bastante conhecida a mtrica
public class Estrutura implements Serializable {
private String nome, endereco; responsvel pela extrao do tamanho do cdigo. Apesar de ser
uma mtrica simples, ela pode ser extrada de diversas maneiras.
public Estrutura() { } Uma delas contar as linhas por statements. Dessa forma, cada
public static void main(String args[]) { statement representar uma linha de cdigo. Com isso, pode-se
if (args.length == 3) evitar a contagem a mais de linhas, devido a, por exemplo, dife-
System.out.println(Testando argumentos); rentes estilos de programao.
else
System.out.println(ERRO); A importncia de conhecer o tamanho do cdigo, que, quanto
} maior for o nmero de linhas de cdigo, maior ser a dificuldade
}
para entender o sistema. Quanto maior for o nmero de linhas de

38 Easy Java Magazine Edio 08


cdigo, mais difcil ser para encontrar as linhas que precisam Mtodo Tamanho
ser alteradas durante atividades de manuteno, e mais difcil TmColorScheme() 8
ser para entender a implementao das funcionalidades que se getSequentialColor() 14
deseja reutilizar. getSequentialColor() 9
Na Tabela 2 est o resultado da aplicao da mtrica de tamanho
getSequentialColor() 6
no cdigo fonte apresentado na Listagem 3.
getCategoricColor() 7

Mtrica de complexidade SetFinalColor() 3


A medio da complexidade de software foi proposta por Tho- GetFinalColor() 2
mas McCabe e baseia-se na representao do fluxo de controle RemoveChangeListener() 6
de um programa. Seguindo McCabe, a complexidade pode ser
Tabela 2. Tamanho dos mtodos
alta ou baixa, a depender do nmero de estruturas de deciso
dentro do cdigo. Mtodo Complexidade
Sobre os dados desta mtrica, possvel afirmar que quanto TmColorScheme() 1
maior a complexidade de um mdulo do sistema, mais difcil ser getSequentialColor() 3
sua manuteno. Na Tabela 3, apresentado o resultado da apli- getSequentialColor() 1
cao das mtricas de complexidade no cdigo da Listagem 3.
getSequentialColor() 2
getCategoricColor() 2
Mtrica de coeso
Esta mtrica mede o grau de coeso de uma estrutura do cdigo, SetFinalColor() 1

por exemplo, a falta de coeso de uma classe. Sua importncia GetFinalColor() 1


est no fato de que classes (componentes) com baixa coeso su- RemoveChangeListener() 2
gerem um projeto inadequado, significando o encapsulamento Tabela 3. Complexidade dos mtodos

Edio 08 Easy Java Magazine 39


Conhecendo as mtricas de software

Listagem 3. Cdigo da classe de exemplo.

package modelodedadostm;
import java.awt.Color; int red = (int)(c2.getRed() * ratio + c1.getRed() * (1 - ratio));
import java.awt.event.*; int green = (int)(c2.getGreen() * ratio + c1.getGreen() * (1 - ratio));
import java.util.*; int blue = (int)(c2.getBlue() * ratio + c1.getBlue() * (1 - ratio));
import javax.swing.event.*; return new Color(red, green, blue);
import java.io.*; }
public class TmColorScheme implements Serializable{ public Color getSequentialColor(float itemValue, float minValue, float maxValue,
//declaraes omitidas... float zeroValue){
if (itemValue < zeroValue) {
public TmColorScheme(VisualAttributes va) { return getSequentialColor(itemValue, minValue, zeroValue, initialColor, zeroColor);
this.va = va; } else {
addChangeListener(va); return getSequentialColor(itemValue, zeroValue, maxValue, zeroColor, finalColor);
initialColor = Color.white; }
zeroColor = Color.black; }
finalColor = Color.red; public Color getCategoricColor(int value){
if (value >=0 && value < TOTAL_COLORS) {
TOTAL_COLORS = Standard.length; return Standard[value];
} }
public Color getSequentialColor(float itemValue, float minValue, float maxValue){ else {
if (zero) { return Color.white;
float zeroValue; }
if (va.getZeroValue() == null) { }
zeroValue = (minValue + maxValue)/ 2; public void setFinalColor(java.awt.Color newFinalColor) {
finalColor = newFinalColor;
} else { fireStateChanged(new ChangeEvent(this));
zeroValue = va.getZeroValue().floatValue(); }
} public java.awt.Color getFinalColor() {
return getSequentialColor(itemValue, minValue, maxValue, zeroValue); return finalColor;
} else { }
return getSequentialColor(itemValue, minValue, maxValue, initialColor, finalColor); public synchronized void removeChangeListener(ChangeListener l) {
} if (changeListeners != null && changeListeners.contains(l)) {
} Vector v = (Vector) changeListeners.clone();
private Color getSequentialColor(float itemValue, float minValue, float maxValue, v.removeElement(l);
Color iColor, changeListeners = v;
Color fColor){ }
Color c1 = iColor; }
Color c2 = fColor; }
float ratio = (itemValue - minValue)/(maxValue - minValue);

de entidades de programa no relacionadas entre si e que no muitas opes de ferramentas e plugins para os IDEs mais utiliza-
deveriam estar juntas. Simplificando a definio, uma classe dos por ns desenvolvedores. Deste modo, no deixe de aprimorar
que implementa comportamentos (mtodos) que deveriam seu cdigo. Voc, e todas as pessoas envolvidas no projeto tm a
estar em outra classe possuem baixa coeso. Por sua vez, uma ganhar com isso.
classe bem projetada deve possui alto grau de coeso e baixo
grau de acoplamento. Esta uma das principais boas prticas Eduardo Oliveira Spnola
de programao! eduspinola@gmail.com
Colaborador das revistas Engenharia de Software Magazine, Java
Concluso Magazine e SQL Magazine. bacharel em Cincias da Computao
pela Universidade Salvador (UNIFACS) onde atualmente cursa o mes-
Para programar com qualidade preciso conhecer bem o nosso
trado em Sistemas e Computao na linha de Engenharia de Software,
cdigo. Mas como fazer isso se no sabemos tirar suas medidas?
sendo membro do GESA (Grupo de Engenharia de Software e Aplicaes).
Como medir algo que fisicamente no existe? Para isso existem as
mtricas de software, e este foi o assunto abordado neste artigo.
[Car 03] Carneiro, Glauco de Figueiredo. Usando Medio de
Aqui vale ressaltar que analisamos apenas algumas mtricas,
Cdigo Fonte para Refactoring.
mas muitas outras esto disponveis para simplificar ainda mais
Dissertao de Mestrado. Universidade Salvador. Salvador. Abril, 2003.
as nossas decises. Para facilitar este trabalho, tambm existem

40 Easy Java Magazine Edio 08


Edio 08 Easy Java Magazine 41

Vous aimerez peut-être aussi