Vous êtes sur la page 1sur 640

J100

Programao
com
orientada a
objetos
TM

SE
Helder da Rocha (helder@acm.org) argonavis.com.br1
Objetivos

Este curso tem como objetivo inici-lo em Java


... mas no apenas isto
Visa tambm a ajud-lo a desenvolver boas
prticas de desenvolvimento que tornaro sua
vida de programador mais fcil no futuro.
Uso eficiente da documentao,
Uso de diagramas de classe,
Estilo e convenes de codificao,
Tcnicas de depurao, testes e manuteno
Uso e conhecimento de padres de projeto

2
Pr-requisito fundamental

Saber programar em C
ou
Saber programar em uma
linguagem orientada a objetos

3
Assuntos abordados

Este curso explora os seguintes assuntos


Como escrever programas em Java, como compil-los e
como execut-los
Conceitos essenciais de programao orientada a objetos
A sintaxe da linguagem Java
Recursos fundamentais como estruturas de dados
utilitrias, manipulao de strings, leitura e gravao de
bytes e caracteres
Tpicos essenciais de programao concorrente
Como utilizar a documentao
Boas prticas, testes e noes de padres de projeto
Como montar um ambiente de desenvolvimento Java
baseado no Ant e outras ferramentas de cdigo aberto
4
Assuntos abordados superficialmente

Os seguintes assuntos so abordados de maneira


muito superficial e incompleta neste curso
Como criar aplicaes grficas usando JFC/Swing
(javax.swing) ou AWT e Applets
Como desenvolver aplicaes integradas a bancos de
dados usando JDBC (java.sql)
Como desenvolver aplicaes de rede (java.net)
Como desenvolver aplicaes de objetos distribudos
(java.rmi e org.omg.CORBA)
Multithreading
Expresses regulares, reflection, class loader
Padres de projeto (design patterns)

5
Assuntos no abordados

Os seguintes assuntos no so abordados neste curso


Programao elementar estruturada (estruturas de dados,
variveis, funes, laos de controle, compilao, pilhas,
algoritmos, etc.): como foi mencionado antes, saber
programar um pr-requisito essencial para este curso.
Como desenvolver aplicaes para a Web (servlets e JSP)
Como criar aplicaes e componentes para servidores de
aplicao transacionais (Enterprise JavaBeans)
Anlise, design ou tcnicas e prticas para desenvolver
aplicaes robustas, seguras e eficientes
UML (Unified Modelling Language)
Uso de ambientes integrados (IDEs) grficos, debuggers,
profilers, sistemas de controle de verso, etc.
6
Roteiro (1)

Parte I - Introduo prtica


1. Conceitos bsicos e plataforma Java
2. Programao orientada a objetos
3. Como configurar e usar o ambiente
4. Como usar a documentao da API
Parte II - Programao OO com Java
5. Tipos, literais, operadores e controle de fluxo
6. Como criar classes e objetos
7. Pacotes e encapsulamento
8. Gerenciamento de projetos com o Ant

A distribuio de tempo em cada mdulo iregular. Alguns so bem mais longos que outros 7
Roteiro (II)

Parte III - Mais programao OO com Java


9. Reuso com herana e composio
10. Interfaces e polimorfismo
11. Controle de erros, excees e asseres
12. Testes de unidade com o JUnit *
Parte IV - Threads, strings e I/O
13. Fundamentos de programao concorrente
14. Colees, propriedades, resources e strings
15. Entrada e sada, logs e serializao
16. Classes internas

* mdulo opcional
8
Roteiro (III)

Parte V - Swing e persistncia de dados


17. Fundamentos de Swing e aplicaes grficas
18. Fundamentos de JDBC (java.sql)
19. Fundamentos de Sockets (java.net)
20. Fundamentos de Objetos remotos (java.rmi) *

A abordagem dos assuntos nos mdulos da parte V superficial.

* mdulo opcional
9
Caractersticas importantes sobre este curso

Este curso dedica 70% do tempo aprendizagem


dos conceitos fundamentais da linguagem
Orientao a objetos
Metologias de desenvolvimento, padres
Boas prticas, testes, roteiros, organizao
Utilizao da documentao
Por outro lado, sobra menos tempo para tratar de
APIs (so abordadas superficialmente)
Swing, sockets, I/O, JDBC, RMI, Reflection
Muitas exigiriam bem mais tempo
Se seus conceitos so slidos, aprender novas APIs
ser muito mais fcil
10
Metas
Ao final deste curso voc deve deve ser capaz de
Desenvolver aplicaes simples em Java (inclusive
aplicaes grficas), compil-las e execut-las
Analisar programas maiores, identificar seus
componentes e compreender seu funcionamento
Consultar a documentao da API e descobrir como usar
novas classes, objetos e mtodos.
Descrever os principais recursos do pacote Java 2 SE
Construir e utilizar um ambiente de desenvolvimento Java
baseado em ferramentas gratuitas
Explorar assuntos mais complexos em OO e Java
Entender os assuntos requeridos para a certificao de
programador Java da Sun
11
Como tirar o melhor proveito deste curso

Faa perguntas
Faa os exerccios
Explore os exemplos
V alm dos exemplos e exerccios: invente
exemplos similares, teste trechos de cdigo
Explore e se familiarize com a documentao
Procure desenvolver um projeto que utilize Java, seja
no trabalho, seja no seu tempo livre
No fique sem programar nos prximos meses ou todo o
esforo ter sido em vo!
Leia revistas, artigos e livros sobre Java e mantenha-
se atualizado.
12
O todo e as partes
Este curso introduz uma nova linguagem e muitos novos
conceitos
Como qualquer novo conhecimento, vrios de seus conceitos
mais complexos dependem de outros mais simples
Nem sempre possvel compreender um conceito mais
abrangente na primeira vez
Ele as vezes depende do conhecimento de partes que s podero
ser abordadas mais adiante
Mas as partes, s vezes dependem dele!
Soluo: repetio. Assuntos complexos sero abordados
superficialmente e depois revisitados mais de uma vez
Se tiver dvidas, pergunte na hora
Cada dia haver mais dvidas novas e menos dvidas antigas

13
Exerccios, testes e projetos

Exerccios so propostos ao final de cada mdulo


Includos na carga-horria
Geralmente aplicaes triviais (para fixar conceitos)
Distribudos separadamente
Projetos e testes (opcionais)
No includos na carga-horria
Projetos usando Java e as principais APIs do J2SE so
propostos para quem desejar fixar os conceitos
aprendidos. Alguns so aplicaes que devem ser
completadas. Fazer pelo menos um dos projetos (leva +
ou - entre 2 e 8 horas) fortemente recomendado
Testes (similares aos de certificao) so propostos como
uma reviso dos principais conceitos abordados no curso
14
Fontes suplementares

Este material serve apenas de roteiro de aula


Use-o como um resumo
Para informaes mais detalhadas, exemplos extras,
testes e projetos utilize um dos livros abaixo
"Thinking in Java 2", Bruce Eckel www.bruceeckel.com
(PDF - download gratuito) - livro-texto principal
"The Java Tutorial", da Sun, por Mary Campione e Kathy
Walrath. java.sun.com/tutorial - livro-texto para
exemplos com Swing
"Java: como programar", Deitel & Deitel (em portugus)
"Aprenda OO em 21 dias", A. Sintes (em portugus)
"Core Java 2", Cay Hortsmann et al. (em portugus)
15
Apresentaes

Instrutor: Helder da Rocha (helder@acm.org)


Utiliza Java desde 1995
XML, J2EE, JSP, servlets, Web
http://www.argonavis.com.br
Alunos?
Nome?
O que faz? Onde trabalha?
Background (sabe C? Java? Web? Que linguagem?)
Expectativas?

16
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
Investindo em Java desde 1995
17
Java 2 Standard Edition

Introduo
tecnologia Java

Helder da Rocha
www.argonavis.com.br
1
Assuntos abordados neste mdulo

Conceitos
Tecnologia Java
Linguagem e API Java
Mquina virtual Java
Ambiente de execuo (JRE) e desenvolvimento (SDK)
Carregador de classes (ClassLoader) e CLASSPATH
Verificador de bytecodes
Coletor de lixo (garbage collector)
Introduo prtica
Como escrever uma aplicao Java
Como compilar uma aplicao Java
Como executar uma aplicao Java
Como depurar erros de compilao e execuo
2
Parte 1: Tecnologia Java

O nome "Java" usado para referir-se a


Uma linguagem de programao orientada a objetos
Uma coleo de APIs (classes, componentes, frameworks) para o
desenvolvimento de aplicaes multiplataforma
Um ambiente de execuo presente em browsers, mainframes,
SOs, celulares, palmtops, cartes inteligentes, eletrodomsticos
Java foi lanada pela Sun em 1995. Trs grandes revises
Java Development Kit (JDK) 1.0/1.0.2
Java Development Kit (JDK) 1.1/1.1.8
Java 2 Platform (Java 2 SDK e JRE 1.2, 1.3, 1.4)
A evoluo da linguagem controlada pelo Java Community
Process (www.jcp.org) formado pela Sun e usurios Java
Ambientes de execuo e desenvolvimento so fornecidos por
fabricantes de hardware e software (MacOS, Linux, etc.)
3
Linguagem Java

Linguagem de programao orientada a objetos


Familiar (sintaxe parecida com C)
Simples e robusta (minimiza bugs, aumenta produtividade)
Suporte nativo a threads (+ simples, maior portabilidade)
Dinmica (mdulos, acoplamento em tempo de execuo)
Com coleta de lixo (menos bugs, mais produtividade)
Independente de plataforma
Segura (vrios mecanismos para controlar segurana)
Cdigo intermedirio de mquina virtual interpretado
(compilao rpida - + produtividade no desenvolvimento)
Sintaxe uniforme, rigorosa quanto a tipos (cdigo mais
simples, menos diferenas em funcionalidades iguais)

4
Produtos e APIs
Java possui uma coleo de APIs (bibliotecas) padro
que podem ser usadas para construir aplicaes
Organizadas em pacotes (java.*, javax.* e extenses)
Usadas pelos ambientes de execuo (JRE) e de
desenvolvimento (SDK)
As principais APIs so distribudas juntamente com os
produtos para desenvolvimento de aplicaes
Java 2 Standard Edition (J2SE): ferramentas e APIs
essenciais para qualquer aplicao Java (inclusive GUI)
Java 2 Enterprise Edition (J2EE): ferramentas e APIs
para o desenvolvimento de aplicaes distribudas
Java 2 Micro Edition (J2ME): ferramentas e APIs para o
desenvolvimento de aplicaes para aparelhos portteis
5
Ambiente de execuo e desenvolvimento
Java 2 System Development Kit (J2SDK)
Coleo de ferramentas de linha de comando para, entre outras
tarefas, compilar, executar e depurar aplicaes Java
Para habilitar o ambiente via linha de comando preciso colocar o
caminho $JAVA_HOME/bin no PATH do sistema
Java Runtime Environment (JRE)
Tudo o que necessrio para executar aplicaes Java
Parte do J2SDK e das principais distribuies Linux, MacOS X, AIX,
Solaris, Windows 98/ME/2000 (exceto XP)
Varivel JAVA_HOME (opcional: usada por vrios frameworks)
Defina com o local de instalao do Java no seu sistema.
Exemplos:
Windows: set JAVA_HOME=c:\j2sdk1.4.0
Linux: JAVA_HOME=/usr/java/j2sdk1.4.0
export JAVA_HOME
6
Compilao para bytecode
Bytecode o cdigo de mquina que roda em qualquer
mquina atravs da Mquina Virtual Java (JVM)
Texto contendo cdigo escrito em linguagem Java traduzido
em bytecode atravs do processo de compilao e
armazenado em um arquivo *.class chamado de Classe Java
Cdigo public class HelloWorld {
Java public static void main(String[] args) {
System.out.println("Hello, world!");
(texto) }
}
HelloWorld.java
compilao (javac)
HelloWorld.class
F4 D9 00 03 0A B2 FE FF FF 09 02 01 01 2E 2F 30 62 84 3D 29 3A C1

Bytecode Java (cdigo de mquina virtual)


Uma "classe" Java 7
Mquina Virtual Java (JVM)
"Mquina imaginria implementada como uma aplicao de
software em uma mquina real" [JVMS]
A forma de execuo de uma aplicao depende ...
... da origem do cdigo a ser executado (remoto ou local)
... da forma como foi implementada a JVM pelo fabricante
(usando tecnologia JIT, HotSpot, etc.)
java
bytecode Class Classe sim Bytecode
Loader remota? Verifier
HelloWorld.class
no
Tempo de execuo
Tradutor JIT:
Just-In-Time Compiler. Tradutor JIT
Interpretador
Gera cdigo nativo a cdigo nativo
partir de bytecodes para
maior performance
HARDWARE
8
Class Loader e CLASSPATH
Primeira tarefa executada pela JVM: carregamento das classes
necessrias para rodar a aplicao. O Class Loader
1. Carrega primeiro as classes nativas do JRE (APIs)
2. Depois carrega extenses do JRE: JARs em $JAVA_HOME/jre/lib/ext
e classes em $JAVA_HOME/jre/lib/classes
3. Carrega classes do sistema local (a ordem dos caminhos no
CLASSPATH define a precedncia)
4. Por ltimo, carrega possveis classes remotas
CLASSPATH: varivel de ambiente local que contm todos os
caminhos locais onde o Class Loader pode localizar classes
A CLASSPATH lida depois, logo, suas classes nunca substituem as
classes do JRE (no possvel tirar classes JRE do CLASSPATH)
Classes remotas so mantidas em rea sujeita verificao
CLASSPATH pode ser redefinida atravs de parmetros durante a
execuo do comando java
9
Bytecode Verifier

Etapa que antecede a execuo do cdigo em


classes carregadas atravs da rede
Class Loader distingue classes locais (seguras) de classes
remotas (potencialmente inseguras)
Verificao garante
Aderncia ao formato de arquivo especificado [JVMS]
No-violao de polticas de acesso estabelecidas pela
aplicao
No-violao da integridade do sistema
Ausncia de estouros de pilha
Tipos de parmetros corretamente especificados e
ausncia de converses ilegais de tipos

10
Coleta de lixo
Memria alocada em Java no liberada pelo programador
Ou seja, objetos criados no so destrudos pelo programador
A criao de objetos em Java consiste de
1. Alocar memria no heap para armazenar os dados do objeto
2. Inicializar o objeto (via construtor)
3. Atribuir endereo de memria a uma varivel (referncia)
Mais de uma referncia pode apontar para o mesmo objeto
pilha heap
Mensagem m, n, p; objetos
m
m = new Mensagem("A"); "A"
n = m; n
GC
p = new Mensagem("B");
p
"B"

processo interno (thread)


do garbage collector
11
Coleta de lixo (2)
Quando um objeto no tem mais referncias apontando para
ele, seus dados no mais podem ser usados, e a memria
deve ser liberada.
O coletor de lixo ir liberar a memria na primeira
oportunidade
objeto sem referncias
pilha heap candidato remoo
n = null; pelo GC
m
p = new Mensagem("C"); "A"
n
GC
p "B"
"C"
12
O que Java no faz
Java no suporta herana mltipla de implementao
Herana mltipla caracterstica comum a vrias linguagens
OO, e permite reuso de cdigo de vrias classes em outra classe
Tem vantagens porm aumenta a complexidade
Java oferece uma soluo que preserva as principais vantagens
da herana mltipla e evita os problemas
Java no suporta aritmtica de ponteiros
Ponteiros, ou referncias, so usados em vrias linguagens,
inclusive Java, para manipular eficientemente grandes
quantidades de informao na memria
Com ponteiros, em vez de copiar uma informao de um lugar
para outro, copia-se apenas o seu endereo
Em linguagens como C, o programador pode manipular o
endereo (que dependente de plataforma) diretamente
Isto aumenta a complexidade e diminui a portabilidade 13
O J2SDK

O J2SDK (Java 2 System Development Kit) o


ambiente padro distribudo pela Sun para
desenvolvimento de aplicaes Java
O J2SDK consiste de
JRE (Java Runtime Environment) - tambm distribudo
separadamente: ambiente para execuo de aplicaes
Ferramentas para desenvolvimento: compilador, debugger,
gerador de documentao, empacotador JAR, etc.
Cdigo-fonte das classes da API
Demonstraes de uso das APIs, principalmente Applets,
interface grfica com Swing e recursos de multimdia
A documentao distribuda separadamente
14
Como compilar
Use o java compiler (linha de comando)
javac NomeDaClasse.java
javac -d ../destino Um.java Dois.java
javac -d ../destino *.java
javac -classpath c:\fontes -d ../destino *.java
Algumas opes (opcionais)
-d diretrio onde sero armazenadas as classes
(arquivos .class) geradas
-classpath diretrios (separados por ; ou :) onde esto as
classes requeridas pela aplicao
-sourcepath diretrios onde esto as fontes
Para conhecer outras opes do compilador, digite javac
sem argumentos
Compiladores de outros fabricantes (como o Jikes, da IBM)
tambm podem ser usados no lugar do javac
15
Como executar
Use o interpretador java (faz parte do JRE)*
java NomeDaClasse
java pacote.subpacote.NomeDaClasse
java -classpath c:\classes;c:\bin;. pacote.Classe
java -cp c:\classes;c:\bin;. pacote.Classe
java -cp %CLASSPATH%;c:\mais pacote.Classe
java -cp biblioteca.jar pacote.Classe
java -jar executavel.jar
Para rodar aplicaes grficas, use javaw
javaw -jar executavel.jar
javaw -cp aplicacao.jar;gui.jar principal.Inicio
Principais opes
-cp ou
-classpath classpath novo (sobrepe v. ambiente)
-jar executa aplicao executvel guardada em JAR
-Dpropriedade=valor define propriedade do sistema (JVM)
* sintaxe de PATH em Unix diferente 16
Algumas outras ferramentas do SDK
Debugger: jdb
Depurador simples de linha de comando
Profiler: java -prof
Opo do interpretador Java que gera estatsticas sobre uso de
mtodos em um arquivo de texto chamado java.prof
Java Documentation Generator: javadoc
Gera documentao em HTML (default) a partir de cdigo-fonte Java
Java Archiver: jar
Extenso do formato ZIP; ferramenta comprime, lista e expande
Applet Viewer: appletviewer
Permite a visualizao de applets sem browser
HTML Converter: htmlconverter.jar
Converte <applet> em <object> em pginas que usam applets
Disassembler: javap
Permite ler a interface pblica de classes
17
Java 2 Standard Edition

Parte 2: Introduo Prtica

18
Parte 2: Introduo prtica
Nesta seo sero apresentados alguns exemplos de
aplicaes simples em Java
1. Aplicao HelloWorld
2. Aplicao HelloWorld modificada para promover reuso e design
orientado a objetos (duas classes)
3. Aplicao Grfica Swing (trs classes)
4. Aplicao para cliente Web (applet)
Compile cdigo-fonte no CD
cap01/src/
Todos os assuntos apresentados nesta seo sero
explorados em detalhes em aulas posteriores
Conceitos como classe, objeto, pacote
Representao UML
Sintaxe, classes da API, etc.

19
1. Aplicao HelloWorld

Esta mini-aplicao em Java imprime um texto na


tela quando executada via linha de comando
/** Aplicao Hello World */
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
} HelloWorld.java

Exerccio: Use-a para testar seu ambiente e


familiarizar-se com o desenvolvimento Java
Digite-a no seu editor de textos
Tente compil-la
Corrija eventuais erros
Execute a aplicao
20
Anatomia
Comentrio de bloco
Nome da classe
Nome do mtodo Declarao de
/** Aplicao Hello World */
argumento
public class HelloWorld { varivel local: args
tipo: String[]
public static void main(String[] args) {

System.out.println("Hello, world!"); Ponto-e-vrgula


obrigatrio no
} final de toda
instruo
}

Atribuio de argumento
Definio de mtodo main()
para o mtodo println()
Definio de classe Chamada de mtodo println()
HelloWorld via objeto out accessvel
atravs da classe System
21
2. Uma classe define um tipo de dados
Esta classe representa objetos que guardam um texto (tipo
String) em um atributo (msg) publicamente acessvel.
Alm de guardar um String, retorna o texto em caixa-alta
atravs do mtodo lerNome(). Membros da classe. Outras
Definio da classe (tipo) Mensagem em Java classes podem acess-los, se
atributo declarados como "public",
public class Mensagem {
usando o operador ponto "."
mtodo
public String msg = "";
Representao
public String lerNome() { em UML
String nomeEmMaiusculas = Mensagem
msg.toUpperCase();
return nomeEmMaiusculas; +msg: String
}
} +lerNome(): String

Esta a interface pblica da classe. s isto que interessa a


quem vai us-la. Os detalhes (cdigo) esto encapsulados.
22
Classe executvel que usa um tipo
Esta outra classe usa a classe anterior para criar um objeto e
acessar seus membros visveis por sua interface pblica
Pode alterar ou ler o valor do atributo de dados msg
Pode chamar o mtodo lerNome() e usar o valor retornado
public class HelloJava { atributo nome do
private static Mensagem nome; tipo Mensagem
public static void main(String[] args) { Este mtodo chamado
nome = new Mensagem(); // cria objeto pelo interpretador
if (args.length > 0) { // h args de linha de comando?
nome.msg = args[0]; // se houver, copie para msg
} else {
nome.msg = "Usuario"; // copie palavra "Usuario"
}

String texto = nome.lerNome(); // chama lerNome()


System.out.println("Bem-vindo ao mundo Java, "+texto+"!");
}
} Operador de concatenao
Veja demonstrao 23
Detalhes
Declarao do mtodo main()
tipo de dados aceito
tipo de dados
modificadores como argumento
retornado
Dependncia entre
public static void main(String[] args) as duas classes
(HelloJava tem referncia
nome varivel local ao mtodo que para Mensagem)
contm valor passado na chamada
HelloJava
O mtodo main() chamado pelo
+main(args: String[])
interpretador Java, automaticamente
Deve ter sempre a assinatura acima usa
O argumento um vetor formado por textos Mensagem
passados na linha de comando: +msg: String
> java NomeDaClasse Um "Dois Tres" Quatro
+lerNome(): String

args[0] args[1] args[2]


24
3. Primeira aplicao grfica
A aplicao abaixo cria um objeto do tipo JFrame (da API
Swing) e reutiliza a classe Mensagem
import javax.swing.*; // importa JFrame e JLabel Quando objeto
import java.awt.Container; criado, construtor
MensagemGUI
public class MensagemGUI {
public MensagemGUI(String texto) { chamado.
JFrame janela = new JFrame("Janela");
Container areaUtil = janela.getContentPane(); Construtor cria
areaUtil.add( new JLabel(texto) ); janela contendo
janela.pack();
janela.setVisible(true); texto recebido
}
} public class HelloJavaGUI { reuso!
private static Mensagem nome;
public static void main(String[] args) {
No lugar de imprimir
(... igual a HelloJava ...)
o texto, passa-o como String texto = nome.lerNome();
parmetro na criao new MensagemGUI
de MensagemGUI ("Bem-vindo ao mundo Java, "+texto+"!");
}
} 25
Componentes da aplicao grfica
MensagemGUI HelloJavaGUI
javax.swing
+main(args: String[])
+MensagemGUI(texto:String)

Relacionamentos
Reuso de componentes das entre as trs Mensagem
APIs Java permite a criao classes do +msg: String
de aplicaes GUI com programa
+lerNome(): String
poucas linhas de cdigo!

Execuo da apliao
passando parmetro
via linha de comando

26
Entrada de dados via GUI
javax.swing.JOptionPane oferece uma interface grfica para
entrada de dados e exibio de informaes
Exemplo de exibio de caixa de dilogo
JOptionPane.showMessageDialog(null, "Hello, World!");
preciso importar
javax.swing.* ou
javax.swing.JOptionPane

Exemplo de dilogo para entrada de dados


String nome =
JOptionPane.showInputDialog("Digite seu nome");
if (nome != null) {
JOptionPane.showMessageDialog(null, nome);
} else {
System.exit(0);
}

27
4. Primeiro applet
Componentes grficos que podem ser executados no browser
Para criar e usar um applet preciso
criar uma classe que herde da classe Applet ou JApplet (API Java)
criar uma pgina HTML que carregue o applet
A classe abaixo implementa um JApplet
import javax.swing.*; // importa JFrame e JLabel
import java.awt.Container; Herana!

public class HelloJavaApplet extends JApplet {


private Mensagem nome;
Chamado automaticamente pelo browser
public void init() {
nome = new Mensagem();
nome.msg = this.getParameter("texto"); // parmetro HTML
String texto = nome.lerNome();
Container areaUtil = this.getContentPane();
JLabel label =
new JLabel("Bem-vindo ao mundo Java, " +texto+ "!");
areaUtil.add(label);
}
}
28
Pgina HTML
O elemento <applet> usado para incluir applets antigos
(Java 1.0 e 1.1) em pginas HTML ou servir de template para a
gerao de cdigo HTML 4.0
A seguinte pgina carrega o applet da pgina anterior
<html>
<head>
<title>Sem Ttulo</title>
</head>
<body>
<h1>Um Applet</h1>
<applet code="HelloJavaApplet.class" height="50" width="400">
<param name="texto" value="Helder">
</applet>
</body>
</html>

Converta o cdigo para HTML 4.0: ferramenta htmlconverter


Guarde uma cpia do original, e rode (use htmlconverter.bat)
> htmlconverter pagina.html
29
Detalhes
...
Para rodar o applet abra a pgina
com seu browser ou use o appletviewer
javax.swing.JApplet
> appletviewer pagina.html +init()
Mude o valor dos parmetros do +getParameter(String):String
...
HTML e veja os resultados
Herana
Browser oferece container Relacionamentos
para rodar o Applet HelloJavaApplet
+init()

Mensagem
+msg: String

Reutilizada! +lerNome(): String


30
Resumo

Foram apresentados quatro exemplos de pequenas


aplicaes Java, demonstrando
Sintaxe elementar, compilao e execuo
Classe como unidade de cdigo para execuo
Classe como definio de tipo de dados
Reuso de objetos atravs de associao (uso da classe
Mensagem em trs aplicaes diferentes) e herana
(infraestrutura de Applets reaproveitada)
Aplicaes grficas
Componentes de um framework (Applets) que executam
em um container padro (dentro do browser)

31
Java 2 Standard Edition

Apndice: como lidar com erros

32
Erros (1)
Durante o desenvolvimento, erros podem ocorrer em dois
domnios: tempo de compilao e tempo de execuo
Erros ocorridos durante a fase de compilao ocorrem quando se
executa o javac, e so fceis de corrigir. H dois tipos:
Erros de processamento do arquivo (parsing): ponto-e-vrgula faltando,
parnteses, aspas, chaves ou colchetes descasados. Identifica apenas o
arquivo e a linha onde o erro pode ter iniciado. Um erro causa vrios
outros e nem sempre a mensagem precisa.
Erros de compilao do cdigo, realizada depois do parsing: alm da
linha e do arquivo, identificam a classe e mtodo. Geralmente as
mensagens so bastante elucidativas.
essencial aprender a identificar a causa da mensagem de erro
LEIA a mensagem e localize a linha onde o erro foi detectado
Corrija os erros na ordem em que eles aparecerem
Sempre recompile depois de corrigir cada erro de parsing (ponto-e
vrgula, etc.) j que eles causam mensagens de erro falsas.
33
Alguns erros de compilao comuns

Cannot resolve symbol: compilador incapaz de localizar


uma definio do smbolo encontrado. Causas comuns:
Erro de sintaxe no nome de varivel ou mtodo
Varivel/mtodo no declarado
Classe usada no possui varivel, mtodo ou construtor
Nmero ou tipo de argumentos do mtodo ou construtor incorretos
Definio de classe no encontrada no CLASSPATH
Class Hello is public, should be declared in a file named
Hello.java: nome do arquivo tem que ser igual ao nome da
classe pblica*:
Nome tem que ser Hello.java, literalmente. O nome
hello.java causa este erro porque o "h" est minsculo.
Para consertar altere o nome da classe no cdigo ou no
nome do arquivo para que sejam iguais.
* Se classe no for pblica, essa restrio no vale 34
Exemplos de erros de compilao
Apenas o
Erro de parsing primeiro erro
Na verdade, s h um erro no cdigo, apesar verdadeiro.
do compilador acusar trs Ignore os outros.
1: public class HelloWorldErro { Eles foram
2: public static void main(String args { causados pelo
3: System.out.println("Hello, 4: world!"); primeiro.
5: }
6: }

Arquivo onde foi


detectado o erro

Trecho do cdigo e
indicao da
provvel
localizao da Nmero da linha onde
causa do erro o erro foi achado

35
Exemplos de erros de compilao (2)
Nome do arquivo
MensagemErro.java mas
classe foi criada com nome
mensagemerro.java

Compilador no sabe
quem string: O tipo
String sempre tem um
S maisculo (como
todas as classes da API)

5: public class mensagemerro {


6: /** Atributo de dados msg publicamente visvel */
7: public string nome = "";
Compilador no 8:
sabe quem msg: 9: /** Mtodo lerNome() devolve objeto do tipo String */
10: public string lerNome() {
no foi declarada 11: string nomeEmMaiusculas = msg.toUpperCase();
nenhuma varivel 12: return nomeEmMaiusculas;
com esse nome. 13: }
14:} 36
Exemplos de erros de compilao (3)
Erros em mltiplas classes
Quando uma classe que possui dependncias compilada, suas
dependncias so compiladas primeiro e o compilador mostra
mensagens de erros referentes a todas as classes envolvidas
Identifique sempre o arquivo e o nmero da linha
Compile as dependncias primeiro

Erro na linha 11
do arquivo
HelloJava.java

Erro na linha 12
do arquivo
Mensagem.java
localizado no
mesmo diretrio
que HelloJava.java
37
Erros (II)
Depois que o cdigo compila com sucesso, os bytecodes
(arquivos .class) so gerados e podem ser usados em um
processo de execuo
Erros ocorridos durante a fase de execuo (runtime) ocorrem
quando se executa o interpretador java, e so muito mais
difceis de localizar e consertar.
A mensagem impressa geralmente um "stack trace" e
mostra todo o "caminho" percorrido pelo erro
Relaciona mtodos e classes da sua aplicao e classes da API Java
que sua aplicao usa (direta ou indiretamente)
Nem sempre mostra a linha de cdigo onde o erro comeou
O incio do trace geralmente contm informaes mais teis
Erros de runtime nem sempre indicam falhas no software
Freqntemente se devem a causas externas: no existncia de
arquivos externos, falta de memria, falha em comunicao de rede
38
Erros de execuo comuns e possveis causas
Exception in thread "main": NoClassDefFoundError: Classe: a
classe "Classe" no foi encontrada no CLASSPATH.
O CLASSPATH no inclui todos os diretrios requeridos
O nome da classe foi digitado incorretamente ou requer pacote
Exception in thread "main": NoSuchMethodError: main: o
sistema tentou chamar main() mas no o encontrou.
A classe no tem mtodo main() (talvez no seja executvel)
Confira assinatura do main: public static void main(String[])
ArrayIndexOutOfBoundsException: programa tentou acessar
vetor alm dos limites definidos.
Erro de lgica com vetores
Aplicao pode requerer argumentos de linha de comando
NullPointerException: referncia para objeto nula
Varivel de tipo objeto foi declarada mas no inicializada
Vetor foi declarado mas no inicializado
39
Exemplos de erros de tempo de execuo

1. Na linha 13, est havendo uma referncia a um ndice de um vetor. Esse ndice tenta
acessar uma posio inexistente no vetor. Neste caso especfico, o erro pode ser evitado
passando-se um parmetro aps o nome da classe na linha de comando, porm a
aplicao pouco robusta pois no prev que o erro possa acontecer.

2. A classe no foi encontrada. Pode ser que ela no esteja no CLASSPATH. Neste caso
especfico o interpretador nos sugere que o nome pode est errado. Para consertar, basta
chamar a classe pelo nome correto: Hello. O Stack Trace mostra que esse erro teve origem
em outras classes, mas foi nossa classe que, na verdade, o provocou. 40
Exemplos de erros de tempo de execuo (2)

Erros de tempo de execuo freqentemente


ocorrem em dependncias
Causa pode estar na dependncia
Causa pode ter tido origem na dependncia mas ter sido
iniciada por erro na classe principal
Stack Trace pode ajudar a localizar a origem do erro
As informaes tambm podem desviar a ateno

Erro comeou na linha 7 (mtodo main) de HelloJavaErro mas teve


origem na linha 12 do mtodo lerNome de Mensagem
41
Como achar erros de tempo de execuo
H dois tipos de erros de tempo de execuo
Causados por situaes externas, que fogem do controle do
programador (ex: rede fora do ar)
Causados por erros de lgica de programao
Devemos criar aplicaes robustas que prevejam a
possibilidade de erros de tempo de execuo devido a fatores
externos e ajam da melhor forma possvel
Devemos achar erros de lgica e evitar que sobrevivam alm da
fase de desenvolvimento. Para evit-los:
Escreva cdigo claro, fcil de entender, organizado, pequeno
Use endentao, siga convenes, nomes significativos, documente
Escreva testes para todo cdigo e rode-os com freqncia
Para achar os erros difceis
Rode cdigo de testes se os tiver; Ative nvel de mensagens de log
Aprenda a usar um depurador para navegar no fluxo de execuo
42
Exerccios

1. Compile e execute os exemplos localizados no


subdiretrio cap01/
2. H vrios arquivos no diretrio
cap01/exercicios/erro. Todos apresentam erros de
compilao. Corrija os erros.
3. Execute os arquivos executveis do diretrio
errobin (quais so?). Alguns iro provocar erros de
tempo de execuo. Corrija-os ou descubra como
executar a aplicao sem que eles ocorram.

43
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
44
Java 2 Standard Edition

Programao
orientada a objetos
em Java
Helder da Rocha
www.argonavis.com.br
1
Assuntos abordados neste mdulo
Conceitos de programao orientada a objetos existentes na
sintaxe da linguagem Java
Artefatos: pacote, classe, objeto, membro, atributo, mtodo,
construtor e interface
Caractersticas OO em Java: abstrao, encapsulamento, herana e
polimorfismo
Sintaxe Java para construo de estruturas de dados
Tipos de dados primitivos
Componentes de uma classe
Construo de aplicaes simples em Java
Como construir uma classe Java (um tipo de dados) contendo
mtodos, atributos e construtores
Como construir e usar objetos
Este mdulo longo e aborda muitos assuntos que sero
tratados novamente em mdulos posteriores
2
Por que OO importante?

Java uma linguagem orientada a objetos


Para desenvolver aplicaes e componentes de
qualidade em Java preciso entender e saber aplicar
princpios de orientao a objetos ao programar
possvel escrever programas em Java sem saber
usar os recursos da OO, mas
Dificilmente voc ser capaz de ir alm de programas
simples com mais de uma classe
Ser muito difcil entender outros programas
Seu cdigo ser feio, difcil de depurar e de reutilizar
Voc estar perdendo ao usar uma linguagem como Java
(se quiser implementar apenas rotinas procedurais pode usar uma
linguagem melhor para a tarefa como Shell, Fortran, etc.)
3
O que Orientao a objetos

Paradigma do momento na engenharia de software


Afeta anlise, projeto (design) e programao
A anlise orientada a objetos
Determina o que o sistema deve fazer: Quais os atores
envolvidos? Quais as atividades a serem realizadas?
Decompe o sistema em objetos: Quais so? Que tarefas
cada objeto ter que fazer?
O design orientado a objetos
Define como o sistema ser implementado
Modela os relacionamentos entre os objetos e atores
(pode-se usar uma linguagem especfica como UML)
Utiliza e reutiliza abstraes como classes, objetos,
funes, frameworks, APIs, padres de projeto
4
Abstrao de casos de uso em
(1) anlise OO e (2) anlise procedural
Sistema de Biblioteca
Adicionar
Bibliotecrio livros
Pesquisar Usurio
Catlogo

(1) Trabalha no espao do (2) Trabalha no espao da soluo


problema (casos de uso (casos de uso decompostos em
simplificados em objetos) procedimentos algortmicos)
Abstraes mais simples e Abstraes mais prximas do
mais prximas do mundo real mundo do computador
Biblioteca Lgica procedural
encapsulada em Sistema de Biblioteca
Catlogo
objetos pequenos
Livro
Livro Adicionar Livros Pesquisar Catalogo
Autor
Autor
Livro Lgica exposta e
Autor
Autor espalhada por
todo o sistema
5
O que um objeto?

Objetos so conceitos que tm


identidade,
estado e
comportamento
Caractersticas de Smalltalk, resumidas por Allan Kay:
Tudo (em um programa OO) so objetos
Um programa um monte de objetos enviando
mensagens uns aos outros
O espao (na memria) ocupado por um objeto consiste
de outros objetos
Todo objeto possui um tipo (que descreve seus dados)
Objetos de um determinado tipo podem receber as
mesmas mensagens
6
Ou seja...

Em uma linguagem OO pura


Uma varivel um objeto
Um programa um objeto
Um procedimento um objeto
Um objeto composto de objetos, portanto
Um programa (objeto) pode ter variveis (objetos que
representam seu estado) e procedimentos (objetos que
representam seu comportamento)
Analogia: abstrao de um telefone celular
composto de outros objetos, entre eles bateria e botes
A bateria um objeto tambm, que possui pelo menos um
outro objeto: carga, que representa seu estado
Os botes implementam comportamentos
7
Objetos (2)

Em uma linguagem orientada a objetos pura


Um nmero, uma letra, uma palavra, uma valor booleano,
uma data, um registro, uma boto da GUI so objetos
Em Java, objetos so armazenados na memria de
heap e manipulados atravs de uma referncia
(varivel), guardada na pilha. Pilha
0010
Heap
5
Tm estado (seus atributos) ref 001A 001A

Tm comportamento (seus mtodos) 23


001F
Tm identidade (a referncia)
Valores unidimensionais no so objetos em Java
Nmeros, booleanos, caracteres so armazenados na pilha
Tm apenas identidade (nome da varivel) e estado (valor
literal armazenado na varivel); - dinmicos; + rpidos
8
Variveis, valores e referncias

Variveis so usadas em linguagens em geral para


armazenar valores
Em Java, variveis podem armazenar endereos de
memria do heap ou valores atmicos de tamanho fixo
Endereos de memria (referncias) so inaccessveis aos
programadores (Java no suporta aritmtica de ponteiros!)
Valores atmicos representam tipos de dados primitivos
Valores so passados para variveis atravs de
operaes de atribuio
Atribuio de valores feita atravs de literais
Atribuio de referncias (endereos para valores) feita
atravs de operaes de construo de objetos e, em dois
casos, pode ser feita atravs de literais
9
Literais e tipos

Tipos representam um valor, uma coleo de valores


ou coleo de outros tipos. Podem ser
Tipos bsicos, ou primitivos, quando representam unidades
indivisveis de informao de tamanho fixo
Tipos complexos, quando representam informaes que
podem ser decompostas em tipos menores. Os tipos
menores podem ser primitivos ou outros tipos complexos
Literais: so valores representveis literalmente.
Nmeros: 1, 3.14, 1.6e-23 Unidimensionais
Valores booleanos: true e false
Caracteres individuais: 'a', '\u0041', '\n') Compostos
Seqncias de caracteres: "aaa", "Java"
Vetores de nmeros, booleanos ou strings: {"a", "b"}
10
Tipos primitivos e complexos

Exemplos de tipos primitivos (atmicos)


Um inteiro ou um caractere,
Um literal booleano (true ou false)
Exemplos de tipos complexos
Uma data: pode ser decomposta em trs inteiros,
representando dia, ms e ano
Um vetor de inteiros: pode ser decomposto em suas partes
Uma seqncia de caracteres: pode ser decomposta nos
caracteres que a formam
Em Java, tipos complexos so armazenados como
objetos e tipos primitivos so guardados na pilha
Apesar de serem objetos, seqncias de caracteres
(strings) em Java podem ser representadas literalmente.
11
Tipos primitivos em Java
Tm tamanho fixo. Tm sempre valor default.
Armazenados na pilha (acesso rpido)
No so objetos. Classe 'wrapper ' faz transformao, se
necessrio (encapsula valor em um objeto).
Tipo Tamanho Mnimo Mximo Default 'Wrapper'
boolean false Boolean
char 16-bit Unicode 0 Unicode 216 - 1 \u0000 Character
byte 8-bit -128 +127 0 Byte
short 16-bit -215 +215 1 0 Short
int 32-bit -231 +231 1 0 Integer
long 64-bit -263 +263 1 0 Long
float 32-bit IEEE754 IEEE754 0.0 Float
double 64-bit IEEE754 IEEE754 0.0 Double
void Void

12
Exemplos de tipos primitivos e literais
Literais de caracter:
char c = 'a';
char z = '\u0041'; // em Unicode
Literais inteiros
int i = 10; short s = 15; byte b = 1;
long hexa = 0x9af0L; int octal = 0633;
Literais de ponto-flutuante
float f = 123.0f;
double d = 12.3;
double g = .1e-23;
Literais booleanos
boolean v = true;
boolean f = false;
Literais de string (no tipo primitivo - s uma referncia)
String s = "abcde";
Literais de vetor (no tipo primitivo - v uma referncia)
int[] v = {5, 6};
13
O que uma classe?
Classes so uma especificao para objetos
Uma classe representa um tipo de dados complexo
Classes descrevem
Tipos dos dados que compem o objeto (o que podem armazenar)
Procedimentos que o objeto pode executar (o que podem fazer)
Instncias da classe Casa (objetos)
Classe Casa c1 = new Casa();
c1.numero = 12;
Casa 12
c1.cor = Color.yellow;

Casa c2 = new Casa();


boolean abrePorta() {} c2.numero = 56;
56
int numero c2.cor = Color.red;
Color cor
static String arquiteto Casa c3 = new Casa();
c3.numero = 72;
72 c3.cor = Color.white;
c3.abrePorta();
14
Ou seja...

Classes no so os objetos que representam


A planta de uma casa um objeto, mas no uma casa
Classes definem lgica esttica
Relacionamentos entre classes so definidos na
programao e no mudam durante a execuo
Relacionamentos entre objetos so dinmicos e podem
mudar. O funcionamento da aplicao reflete a lgica de
relacionamento entre os objetos, e no entre as classes.
Classes no existem no contexto da execuo
Uma classe representa vrios objetos que ocupam espao
na memria, mas ela no existe nesse domnio
A classe tem papel na criao dos objetos, mas no existe
quando os objetos trocam mensagens entre si.
15
Resumo
Objetos so conceitos que tm estado (atributos),
comportamento (mtodos) e identidade (referncia)
Tipos representam valores
Primitivos: valores fixos e indivisveis. So armazenados na pilha
Complexos: valores multidimensionais que podem ser
decompostos em componentes menores. Descrevem objetos que
so armazenados no heap
Literais
Usados para definir tipos primitivos ou certos tipos complexos
formados por componentes iguais (strings e vetores)
Variveis podem armazenar valores de tipos primitivos ou
referncias para objetos
Classes so tipos complexos: descrevem objetos
No so importantes no contexto da execuo
16
Membros: atributos e mtodos
Uma classe define uma estrutura de dados no-ordenada
Pode conter componentes em qualquer ordem
Os componentes de uma classe so seus membros
Uma classe pode conter trs tipos de componentes
Membros estticos ou de classe: no fazem parte do "tipo"
Membros de instncia: definem o tipo de um objeto
Procedimentos de inicializao
Membros estticos ou de classe
Podem ser usados atravs da classe mesmo quando no h objetos
No se replicam quando novos objetos so criados
Membros de instncia
Cada objeto, quando criado, aloca espao para eles
S podem ser usados atravs de objetos
Procedimentos de inicializao
Usados para inicializar objetos ou classes
17
Exemplo
public class Casa { Atributos de instncia: cada
objeto poder armazenar valores
private Porta porta;
private int numero; diferentes nessas variveis.
public java.awt.Color cor; Procedimento de inicializao de
objetos (Construtor): cdigo
public Casa() {
executado aps a criao de cada
Tipo porta = new Porta();
numero = ++contagem * 10; novo objeto. Cada objeto ter um
} nmero diferente.
Mtodo de instncia: s possvel
public void abrePorta() {
porta.abre();
cham-lo se for atravs de um
} objeto.
Atributos estticos: no preciso
public static String arquiteto = "Z";
criar objetos para us-los. Todos
private static int contagem = 0;
os objetos os compartilham.
static { Procedimento de inicializao
if ( condio ) { esttico: cdigo executado uma
arquiteto = "Og";
}
nica vez, quando a classe
} carregada. O arquiteto ser um s
} para todas as casas: ou Z ou Og.18
Boas prticas ao escrever classes

Use, e abuse, dos espaos


Endente, com um tab ou 4 espaos, membros da classe,
Endente com 2 tabs, o contedo dos membros, ...
A ordem dos membros no importante, mas seguir
convenes melhora a legibilidade do cdigo
Mantenha os membros do mesmo tipo juntos (no
misture mtodos estticos com mtodos de instncia)
Declare as variveis antes ou depois dos mtodos (no
misture mtodos, construtores e variveis)
Mantenha os seus construtores juntos, de preferncia
bem no incio
Se for necessrio definir blocos static, defina apenas um,
e coloque-o no incio ou no final da classe.
19
Construtores

Construtores so procedimentos realizados na


construo de objetos
Parecem mtodos, mas no tm tipo de retorno e tm
nome idntico ao nome da classe
No fazem parte da definio do tipo do objeto (interface)
Nem sempre aparecem explcitos em uma classe: podem
ser omitidos (o sistema oferece uma implementao default)
Para cada objeto, o construtor chamado
exatamente uma vez: na sua criao
Chamada de
Exemplo:
construtor
> Objeto obj = new Objeto();
Alguns podem requerer parmetros
> Objeto obj = new Objeto(35, "Nome");
20
Objetos possuem uma interface ...

Atravs da interface* possvel utiliz-lo


No preciso saber dos detalhes da implementao
O tipo (Classe) de um objeto determina sua interface
O tipo determina quais mensagens podem ser enviadas

CDPlayer
Em Java
Tipo
(...) Classe Java (tipo)
liga()
desliga() CDPlayer cd1; Referncia
Interface
selecionaFaixa(int) cd1 = new CDPlayer();
Formato das avana()
mensagens retorna() cd1.liga(); Criao de objeto
que se pode executa() cd1.selecionaFaixa(3);
enviar para pausa() cd1.executa();
um objeto para() (...) Envio de mensagem

* interface aqui refere-se a um conceito e no a um tipo de classe Java 21


... e uma implementao (oculta)

Implementao no interessa quem usa objetos


Papel do usurio de classes
no precisa saber como a classe foi escrita, apenas quais
seus mtodos, quais os parmetros (quantidade, ordem e
tipo) e valores que so retornados
usa apenas a interface (pblica) da classe
Papel do desenvolvedor de classes
define novos tipos de dados
expe, atravs de mtodos, todas as funes necessrias
ao usurio de classes, e oculta o resto da implementao
tem a liberdade de mudar a implementao das classes
que cria sem que isto comprometa as aplicaes
desenvolvidas pelo usurio de classes
22
Resumo
Os componentes de uma classe, em Java, podem pertencer a
dois domnios, que determinam como so usados
Domnio da classe: existem independentemente de existirem
objetos ou no: mtodos static, blocos static, atributos static
e interface dos construtores de objetos
Domnio do objeto: mtodos e atributos no declarados como
static (definem o tipo ou interface que um objeto possui), e
contedo dos construtores
Construtores so usados apenas para construir objetos
No so mtodos (no declaram tipo de retorno)
"Ponte" entre dois domnios: so chamados uma vez antes do objeto
existir (domnio da classe) e executados no domnio do objeto criado
Separao de interface e implementao
Usurios de classes vem apenas a interface.
Implementao encapsulada dentro dos mtodos, e pode variar sem
afetar classes que usam os objetos 23
Reuso de implementao

Separao interface-implementao: maior reuso


Reuso depende de bom planejamento e design
Uma vez criada uma classe, ela deve representar uma
unidade de cdigo til para que seja reutilizvel
Formas de uso e reuso
Uso e reuso de objetos criados pela classe: mais flexvel
Composio: a parte essencial de b b a *
Agregao: a parte de b b a
Associao: a usado por b b a
Reuso da interface da classe: pouco flexvel
Herana: b a (substituio pura) b a
ou b um tipo de a (substituio til, extenso)

* Notao UML 24
Agregao, composio e associao
Composio: um trem formado por locomotiva e vages
1
Locomotiva
Trem
1..* Vago

Agregao: uma locomotiva tem um farol (mas no vai


deixar de ser uma locomotiva se no o tiver)
Locomotiva Farol

Associao: um trem usa uma estrada de ferro (no faz parte


do trem, mas ele depende dela)
Trem EstradaDeFerro
usa

25
Herana (reuso de interface)

Um carro um veculo
Veculo representao
UML

Carro

Fuscas e Porsches so carros (e tambm veculos)


representao
Veculo Veculo
UML simplificada
(no mostra os getVelocidade():float
mtodos) getPassageiros():int
Carro acelera()
freia()

representao UML
Fusca Porsche
detalhada de Veculo
26
Extenso e sobreposio

Extenso
Acrescenta novos Veculo
mtodos aos j herdados Veculo getVelocidade():float
(Um objeto do tipo getPassageiros():int
Carro tem mais mtodos acelera()
Carro
que um objeto do tipo freia()
abastece()
Veiculo) fechaPorta()
abrePorta()

Sobreposio
Carro

Redefine os mtodos
implementados
Fusca Porsche previamente (Um objeto do
abrePorta() freia() tipo Fusca tem o mesmo
getVelocidade() nmero de mtodos de um
objeto do tipo Carro
27
Polimorfismo

Uso de um objeto no lugar de outro


pode-se escrever cdigo que no dependa da existncia
prvia de tipos especficos
Ligao da interface
Desenhista usa Figura com o objeto real
pode ser feita durante
geraFigura() desenha() a execuo

Conhece apenas interface


do tipo genrico (Figura)
Crculo Quadrado Tringulo
Chama "desenha()" sem desenha() desenha() desenha()
saber qual objeto ser
desenhado. Objeto real
pode ser "plugado"
durante a execuo. Cada desenha() sobrepe funcionamento
original com algo diferente
28
Encapsulamento

Simplifica o objeto expondo apenas a sua interface


essencial
Cdigo dentro de mtodos naturalmente encapsulado
No possvel acessar interior de um mtodo fora do objeto
Mtodos que no devem ser usados externamente e
atributos podem ter seu nvel de acesso controlado em
Java, atravs de modificadores
private: apenas acesso dentro da classe
package-private (default): acesso dentro do pacote*
protected: acesso em subclasses
public: acesso global

* no existe um modificador com este nome. A ausncia de um


modificador de acesso deixa o membro com acesso package-private 29
Resumo de caractersticas OO
Abstrao de conceitos
Classes, definem um tipo separando interface de implementao
Objetos: instncias utilizveis de uma classe
Herana: " um"
Aproveitamento do cdigo na formao de hierarquias de classes
Fixada na compilao (inflexvel)
Associao "tem um"
Consiste na delegao de operaes a outros objetos
Pode ter comportamento e estrutura alterados durante execuo
Vrios nveis de acoplamento: associao, composio, agregao
Encapsulamento
Separao de interface e implementao que permite que usurios
de objetos possam utiliz-los sem conhecer detalhes de seu cdigo
Polimorfismo
Permite que objeto seja usado no lugar de outro
30
Exerccio

1. Crie, e compile as seguintes classes


Uma Pessoa tem um nome (String)
Uma Porta tem um estado aberto, que pode ser true ou
false, e pode ser aberta ou fechada
Uma Construcao tem uma finalidade
Uma Casa uma Construcao com finalidade residencial
que tem um proprietrio Pessoa, um nmero e um
conjunto (vetor) de Portas
2. Crie as seguintes classes
Um Ponto tem coordenadas x e y inteiras
Um Circulo tem um Ponto e um raio inteiro
Um Pixel um tipo de Ponto que possui uma cor

31
Menor classe utilizvel em Java

Uma classe contm a representao de um objeto


define seus mtodos (comportamento)
define os tipos de dados que o objeto pode armazenar
(estado)
determina como o objeto deve ser criado (construtor)
Uma classe Java tambm pode conter
procedimentos independentes (mtodos static)
variveis estticas
rotinas de inicializao (blocos static)
O programa abaixo a menor unidade compilvel
em Java class Menor {}

32
Smbolos essenciais
Separadores
{ ... } chaves: contm as partes de uma classe e delimitam blocos de
instrues (em mtodos, inicializadores, estruturas de controle, etc.)
; ponto-e-vrgula: obrigatria no final de toda instruo simples ou
declarao
Identificadores
Nomes usados para representar classes, mtodos, variveis (por
exemplo: desenha, Casa, abrePorta, Circulo, raio)
Podem conter letras (Unicode) e nmeros, mas no podem comear
com nmero
Palavras reservadas
So 52 (assert foi includa na verso 1.4.0) e consistem de 49
palavras-chave e literais true, false e null.
Exemplos de palavras-chave so public, int, class, for e void
A maior parte dos editores de cdigo Java destaca as palavras
reservadas
33
Para que serve uma classe

Uma classe pode ser usada para


conter a rotina de execuo principal de uma aplicao
iniciada pelo sistema operacional (mtodo main)
conter funes globais (mtodos estticos)
conter constantes e variveis globais (campos de dados
estticos)
especificar e criar objetos (contm construtores, mtodos
e atributos de dados)

34
Uma unidade de compilao
Casa.java

package cidade; // classe faz parte do pacote cidade

import cidade.ruas.*; // usa todas as classes de pacote


import pais.terrenos.LoteUrbano; // usa classe LoteUrbano
import Pessoa; // ilegal desde Java 1.4.0
import java.util.*; // usa classes de pacote Java

class Garagem {
... Por causa da declarao package
} o nome completo destas classes
cidade.Garagem
interface Fachada { cidade.Fachada e
... cidade.Casa
}

/** Classe principal */ Este arquivo, ao ser


public class Casa { compilado, ir gerar
... trs arquivos .class
}

35
O que pode conter uma classe

Um bloco class pode conter (entre as chaves {...}), em


qualquer ordem
(1) zero ou mais declaraes de atributos de dados
(2) zero ou mais definies de mtodos
(3) zero ou mais construtores
(4) zero ou mais blocos de inicializao static
(5) zero ou mais definies de classes ou interfaces
internas
Esses elementos s podem ocorrer dentro do bloco class
NomeDaClasse { ... }
tudo, em Java, pertence a alguma classe
apenas import e package podem ocorrer fora de uma
declarao class (ou interface)
36
Mtodos
Contm procedimentos - instrues simples ou compostas executadas
em seqncia - entre chaves
Podem conter argumentos
O tipo de cada argumento precisa ser declarado
Mtodo identificado pelo nome + nmero e tipo de argumentos
Possuem um tipo de retorno ou a palavra void
Podem ter modificadores (public, static, etc.) antes do tipo
... class T2 {
public void paint (Graphics g){ int x, y;
int x = 10; public int soma () {
g.drawString(x, x*2, "Booo!"); return x + y;
} }
... public static int soma(int a, int b){
return a + b;
}
class T1 {
private int a; private int b; public static int soma(int a,
public int soma () { int b, int c){
return a + b; return soma(soma(a, b), c);
} }
} }
37
Sintaxe de definio de mtodos

Sintaxe bsica
[mod]* tipo identificador ( [tipo arg]* ) [throws exceo*] { ... }
Chave
[mod]* zero ou mais modificadores separados por espaos
tipo tipo de dados retornado pelo mtodo
identificador nome do mtodo
[arg]* zero ou mais argumentos, com tipo declarado,
separados por vrgula
[throws exceo*] declarao de excees
Exemplos
public static void main ( String[] args ) { ... }
private final synchronized
native int metodo (int i, int j, int k) ;
String abreArquivo ()
throws IOException, Excecao2 { ... }

38
Atributos de dados

Contm dados
Devem ser declaradas com tipo
Podem ser pr-inicializadas (ou no)
Podem conter modificadores
public class Livro {
private String titulo;
public class Produto { private int codigo = 815;
public static int total = 0; ...
public int serie = 0; public int mostraCodigo() {
public Produto() { return codigo;
serie = serie + 1; }
total = serie; }
} class Casa {
} class Data { static Humano arquiteto;
int dia; int numero;
int mes; Humano proprietario;
int ano; Doberman[] guardas;
} }
39
Sintaxe de declarao de atributos

Sintaxe bsica
[modificador]* tipo identificador [= valor] ;
Chave
[modificador]* zero ou mais modificadores (de acesso, de
qualidade), separados por espaos: public, private, static, transient,
final, etc.
tipo tipo de dados que a varivel (ou constante) pode conter
identificador nome da varivel ou constante
[= valor] valor inicial da varivel ou constante
Exemplo
protected static final double PI = 3.14159 ;
int numero;

40
Construtores
Tm sempre o mesmo nome que a classe
Contm procedimentos entre chaves, como os mtodos
So chamados apenas uma vez: na criao do objeto
Pode haver vrios em uma mesma classe
So identificados pelo nmero e tipo de argumentos
Nunca declaram tipo de retorno
public class Produto {
public static int total = 0;
public int serie = 0;
public Produto() { public class Livro {
serie = total + 1; private String titulo;
total = serie; public Livro() {
} titulo = "Sem ttulo";
} }
public Livro(String umTitulo) {
titulo = umTitulo;
}
}
41
Sintaxe de construtores

Construtores so procedimentos especiais usados para


construir novos objetos a partir de uma classe
A definio de construtores opcional: Toda classe sem
construtor declarado explicitamente possui um construtor
fornecido pelo sistema (sem argumentos)
Parecem mtodos mas
no definem tipo de retorno
possuem, como identificador, o nome da classe: Uma classe pode
ter vrios construtores, com o mesmo nome, que se
distinguem pelo nmero e tipo de argumentos
Sintaxe
[mod]* nome_classe ( [tipo arg]* ) [throws exceo*] { ... }

42
Exemplo

Exemplo de classe com um atributo de dados


(varivel), um construtor e dois mtodos
public class UmaClasse {
variavel (referencia)
private String mensagem; do tipo String
public UmaClasse () { construtor
mensagem = "Mensagem inicial";
} inicializao de varivel
ocorre quando objeto
public void setMensagem (String m) {
mensagem = m;
construdo
} mtodo que recebe
public String getMensagem() { parmetro e altera
return mensagem; varivel
}
} mtodo que retorna varivel

43
Exemplo: um crculo

public class Circulo {


public int x;
public int y;
public int raio;
public static final double PI = 3.14159;

public Circulo (int x1, int y1, int r) {


x = x1;
y = y1;
raio = r;
}
Circulo

public double circunferencia() { +x: int


return 2 * PI * raio; +y: int
} +raio: int
} +PI: 3.14159

+Circulo(x:int, y:int, raio:int)


+circunferencia(): double

44
Usando crculos

Use dentro de um mtodo ou construtor (blocos de


procedimentos)
Circulo c1, c2, c3;
c1 = new Circulo(3, 3, 1);
c2 = new Circulo(2, 1, 4);
c3 = c1; // mesmo objeto!
System.out.println("c1: (" + c1.x + ", "
+ c1.y + ")");
int circ = (int) c1.circunferencia();
System.out.print("Raio de c1: " + c1.raio);
System.out.println("; Circunferncia de c1: "
+ circ);

45
Herana

Circulo

+x: int
+y: int
+raio: int
+PI: 3.14159

+Circulo(x:int, y:int, raio:int)


+circunferencia(): double
class Coisa extends Circulo {
Coisa() {
this(1, 1, 0);
}
Coisa(int x, int y, int z) {
super(x, y, z);
}
} Coisa

+Coisa(x:int, y:int, raio:int)


+Coisa()
A Coisa um Circulo!
46
Exerccio

1. Escreva uma classe Ponto


contm x e y que podem ser definidos em construtor
mtodos getX() e getY() que retornam x e y
mtodos setX(int) e setY(int) que mudam x e y
2. Escreva uma classe Circulo, que contenha
raio inteiro e origem Ponto
construtor que define origem e raio
mtodo que retorna a rea
mtodo que retorna a circunferncia
use java.lang.Math.PI (Math.PI)
3. Crie um segundo construtor para Circulo que aceite
um raio do tipo int e coordenadas x e y

47
Vetores
Vetores so colees de objetos ou tipos primitivos
Os tipos devem ser conversveis ao tipo em que foi declarado o vetor
int[] vetor = new int[10];
Cada elemento do vetor inicializado a um valor default,
dependendo do tipo de dados:
null, para objetos
0, para int, long, short, byte, float, double
Unicode 0, para char
false, para boolean
Elementos podem ser recuperados a partir da posio 0:
int elemento_1 = vetor[0];
int elemento_2 = vetor[1];

48
Vetores
De tipos primitivos
pilha heap pilha heap class Point {
public int x;
# 0 # 23 public int y;
}
0 0
v[0] = 23;
0 v[2] = 52; 52 Point
+x: int
int[] v = new int[3]; +y: int
inicializao dos
v objeto do tipo (int[]) cria um vetor
elementos
De objetos (Point uma classe, com membros x e y, inteiros)
pilha heap pilha heap heap
# null # # 0 p[0].x
0 p[0].y
null null
Point[] p = new Point[2]; p[0] = new Point();
cria um vetor cria um objeto Point
p objeto do tipo (Point[]) 49
Inicializao de vetores

Vetores podem ser inicializados no momento em que so criados.


Sintaxe:
String[] semana = {"Dom", "Seg", "Ter",
"Qua", "Qui", "Sex","Sab"};
String[][] usuarios = {
{"Joo", "Ningum"},
{"Maria", "D.", "Aparecida"},
{"Fulano", "de", "Tal"}
};
Essa inicializao no pode ser usada em outras situaes
(depois que o vetor j existe), exceto usando new, da forma:
semana =
new String[] {"Dom", "Seg", "Ter", "Qua",
"Qui", "Sex", "Sab"};

50
A propriedade length

length: todo vetor em Java possui esta propriedade que


informa o nmero de elementos que possui
length uma propriedade read-only
extremamente til em blocos de repetio
for (int x = 0; x < vetor.length; x++) {
vetor[x] = x*x;
}
Uma vez criados, vetores no podem ser redimensionados
Use System.arraycopy() para copiar um vetor para
dentro de outro (alto desempenho)
Use java.util.ArrayList (ou Vector) para manipular com
vetores de tamanho varivel (baixo desempenho)
ArrayLists e Vectors so facilmente conversveis em vetores
quando necessrio

51
Vetores multidimensionais

Vetores multidimensionais em Java so vetores de vetores


possvel criar toda a hierarquia (vetor de vetor de vetor...), para
fazer vetores retangulares ...
int [][][] prisma = new int [3][2][2];

... ou criar apenas o primeiro nvel (antes de usar, porm, preciso


criar os outros nveis)

int [][][] prisma2 = new int [3][][];


prisma2[0] = new int[2][];
prisma2[1] = new int[3][2];
prisma2[2] = new int[4][4];
prisma2[0][0] = new int[5];
prisma2[0][1] = new int[3];

52
Exerccios

1. Crie uma classe TestaCirculos que


a) crie um vetor de 5 objetos Circulo
b) imprima os valores x, y, raio de cada objeto
c) declare outra referncia do tipo Circulo[]
d) copie a referncia do primeiro vetor para o segundo
e) imprima ambos os vetores
f) crie um terceiro vetor
g) copie os objetos do primeiro vetor para o terceiro
h) altere os valores de raio para os objetos do primeiro
vetor
i) imprima os trs vetores

53
Escopo de variveis

Atributos de dados (declarados no bloco da classe): podem


ser usadas em qualquer lugar (qualquer bloco) da classe
Uso em outras classes depende de modificadores de acesso (public,
private, etc.)
Existem enquanto o objeto existir (ou enquanto a classe existir, se
declarados static)
Variveis locais (declaradas dentro de blocos de
procedimentos)
Existem enquanto procedimento (mtodo, bloco de controle de
execuo) estiver sendo executado
No podem ser usadas fora do bloco
No pode ter modificadores de acesso (private, public, etc.)

54
Exemplo
public class Circulo {

variveis visveis dentro private int raio;


da classe, apenas private int x, y;

public double area() {


return Math.PI * raio * raio;
novoRaio varivel local }
ao mtodo mudaRaio
maxRaio varivel local public void mudaRaio(int novoRaio) {
int maxRaio = 50;
ao mtodo mudaRaio
if (novoRaio > maxRaio) {
raio varivel de instncia raio = maxRaio;
}
if (novoRaio > 0) {
inutil varivel local int inutil = 0;
ao bloco if raio = novoRaio;
}
}
}

55
Membros de instncia vs.
componentes estticos (de classe)
Componentes estticos
Os componentes de uma classe, quando declarados
'static', existem independente da criao de objetos
S existe uma cpia de cada varivel ou mtodo
Membros de instncia
mtodos e variveis que no tenham modificador 'static'
so membros do objeto
Para cada objeto, h uma cpia dos mtodos e variveis
Escopo
Membros de instncia no podem ser usados dentro de
blocos estticos: preciso obter antes, uma referncia para
o objeto

56
Exemplos
:Circulo
main() no
Membros de instncia s existem faz parte do
+x: 0
+y: 0
se houver um objeto objeto! +raio: 0
area():double

Errado! Certo!
public class Circulo { membros de public class Circulo {
instncia tem que
public int raio; public int raio; criar pelo
public int x, y; Pode. Porque area() public int x, y; menos um
faz parte do objeto! objeto!
public double area() { public double area() {
return Math.PI * raio * raio; return Math.PI * raio * raio;
} }

public static void main(String[] a){ public static void main(String[] a){
raio = 3; qual raio? Circulo c = new Circulo();
double z = area(); existe? c.raio = 3;
raio de c
} double z = c.area();
} qual area? } area() de c
No pode. No existe existe? }
objeto em main()!

57
Variveis locais vs.
variveis de instncia
Variveis de instncia ...
sempre so automaticamente inicializadas
so sempre disponveis no interior dos mtodos de instncia e
construtores
Variveis locais ...
sempre tm que ser inicializadas antes do uso
podem ter o mesmo identificador que variveis de instncia
neste caso, preciso usar a palavra reservada this para fazer
a distino
class Circulo { varivel de instncia
private int raio;
public void mudaRaio(int raio) {
this.raio = raio; varivel local
}
}
58
Comentrios

H duas formas de incluir comentrios em um


arquivo Java
/* ... comentrio de bloco ... */
// comentrio de linha
Antes de mtodos, construtores, campos de dados e
classes, o comentrio de bloco iniciado com /**
pode ser usado para gerar HTML em documentao
H uma ferramenta (JavaDoc) que gera
automaticamente documentao a partir dos arquivos
.java
relaciona e descreve classes, mtodos, etc e cria
referncias cruzadas
Descries em HTML podem ser includas nos
comentrios especiais /** ... */
59
Gerao de documentao

Para gerar documentao de um arquivo ou de uma


coleo de arquivos .java use o javadoc:
javadoc arquivo1.java arquivo2.java
O programa criar uma coleo de arquivos HTML,
interligados, entre eles estaro
ndice de referncias cruzadas
uma pgina para cada classe, com links para cada
mtodo, construtor e campo pblico, contendo descries
(se houver) de comentrios /** .. */
Consulte a documentao para maiores informaes
sobre a ferramenta javadoc.

60
Convenes de cdigo
Toda a documentao Java usa uma conveno para nomes
de classes, mtodos e variveis
Utiliz-la facilitar a manuteno do seu cdigo!
Classes, construtores e interfaces
use caixa-mista com primeira letra maiscula, iniciando novas
palavras com caixa-alta. No use sublinhado.
ex: UmaClasse, Livro
Mtodos e variveis
use caixa mista, com primeira letra minscula
ex: umaVariavel, umMetodo()
Constantes
use todas as letras maisculas. Use sublinhado para separar as
palavras
ex: UMA_CONSTANTE

61
Exerccios

1. Classe Conta e TestaConta


a) Crie a classe Conta, de acordo com o diagrama UML abaixo
acrescenta valor ao saldo atual
Conta
-saldo: double subtrai valor do saldo atual
-numero: String
sobrepe Object.toString()
+depositar(valor: double) retorna String contendo saldo
+sacar (valor: double) atual
+toString(): String
+Conta(nome: String)

b) Crie uma classe TestaConta, contendo um mtodo main(), e


simule a criao de objetos Conta, o uso dos mtodos depositar() e
sacar() e imprima, aps cada operao, os valores disponveis
atravs do mtodo toString()
c) Gere a documentao javadoc das duas classes

62
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
63
Java 2 Standard Edition

Configurao do ambiente
JEdit + Ant

Helder da Rocha (helder@acm.org) argonavis.com.br1


Java "IDE" configurvel

Este mdulo mostra como montar um timo


ambiente de desenolvimento para aplicaes Java e
XML usando apenas ferramentas open-source
JEdit (editor de textos, cdigo e ambiente integrado)
Ant (ferramenta de gerenciamento de projetos)
JSDK 1.4.0 (kit de desenvolvimento da Sun)
Onde conseguir o software
JEdit: www.jedit.org
Ant: ant.apache.org
JSDK: java.sun.com
Use o artigo da Java Magazine
anexo como referncia
atualizada para este mdulo
2
Instalao
1. SDK
a) Instale o JSDK seguindo as instrues mostradas na tela de
instalao
b) Configure uma varivel de ambiente JAVA_HOME que aponte
para o endereo onde o JSDK foi instalado
c) Acrescente o caminho $JAVA_HOME/bin no seu PATH
2. Ant
a) Abra o ZIP da ltima verso binary do Ant em um diretrio (ex:
/usr/local/ant ou c:\ant)
b) Configure uma varivel de ambiente ANT_HOME que aponte
para o endereo onde o ANT foi instalado
c) Acrescente o caminho $ANT_HOME/bin no seu PATH
3. JEdit
Instale o JEdit clicando duas vezes no JAR de distribuio ou
executando java -jar jEdit4Install.jar
3
Teste da instalao

SDK e JRE
Digite java -version
O resultado deve ser o nmero da verso instalada
Digite javac
O resultado deve ser uma mensagem de erro com a lista de
opes vlidas para o javac.
Ant
Digite ant
O resultado deve ser a mensagem de erro Buildfile: build.xml
does no exist
JEdit
Windows: clique duas vezes no cone criado
Unix: rode o executvel no diretrio onde foi instalado
4
JEdit: plug-ins
O JEdit, sem plug-ins, um simples editor de textos
Com plug-ins pode ter mais recursos e melhor integrao que
muitos IDEs comerciais
Para instalar plug-ins (precisa estar conectado Internet)
a) Inicie o JEdit
b) Selecione o menu "Plugins" / "Plugin Manager" (ou cone )
c) Aperte o boto "Install Plugins". Aps a conexo ser mostrada
uma lista dos plug-ins disponveis. Clique em cada um para ver sua
descrio.
d) Selecione o radio-button "Install in system plug-in directory"
e) Marque os plug-ins desejados e aperte "Install"
Instale pelo menos...
AntFarm, Buffer Tabs, Console, Drag & Drop, Error List, Java Style,
JBrowse, Project Viewer, Templates, XML

5
Personalizao do JEdit (1)
Reinicie o JEdit aps a instalao dos plug-ins
Se algum plug-in instalado apresentar erro, uma mensagem
ir ser exibida na abertura do JEdit. Voc pode
corrigir o erro (a mensagem explica como ou a causa)
desinstalar o plug-in (no menu Plugins)
Docking
Coloca plug-ins frequentemente usados nas laterais da rea
de trabalho para fcil utilizao
Selecione o menu "Utilities" / "Global Options"
Na opo jEdit Options / Docking, selecione a segunda
configurao de tela:
Mude a posio default dos seguintes plug-ins:
AntFarm: left JBrowse: left
Console: bottom Project: left
ErrorList: bottom XMLTree: left
6
Personalizao do JEdit (2)

Tabs para seleo de janelas de texto


Menu Global Options / jEdit Options / General
Desmarque "Show buffer switcher" e "Show search bar"
Menu Global Options / Plugin Options / Buffer Tabs
Marque "Enable buffer tabs by default"
Selecione "Location of buffer tabs:" para "top"
AntFarm
Menu Global Options / Plugin Options / AntFarm
Selecione Build Options
Na seo "Build Execution Method", na segunda caixa de
texto, informe o caminho at o executvel do Ant na sua
mquina (ex: c:\ant\bin\ant.bat)
Na seo "General Build Options" marque as opes "Load
build files..." e "Save all buffers..."
7
Personalizao do JEdit (3)

ErrorList
Menu Global Options / Plugin Options / ErrorList
Marque "automatically display on error"
JBrowse
Menu Global Options / Plugin Options / JBrowse
Marque "Display Status Bar", "Automatic parse" e "Sort"
Numerao de linhas
Menu Global Options / jEdit Options / Gutter
Marque "Line Numbering"
Tabulao
Menu Global Options / jEdit Options / Editing
Em "Tab Width" e "Indent Width" coloque "4"

8
Resultado da personalizao

9
Como usar o Console / ErrorList

O Console do JEdit serve para


mostrar mensagens de erro
rodar o compilador
rodar outras aplicaes do sistema
Erros ocorridos durante a compilao, execuo ou
outro processo que produza erros so coletados no
ErrorList, que
permite acesso rpido fonte do erro atravs de
double-click
oferece detalhamento dos erros
Ajuste o Console e ErrorList na parte inferior do seu
JEdit
10
Criando um projeto

Para criar um novo projeto:


primeiro escolha um local no seu disco que ser a raiz de
seus projetos
depois crie um diretrio para seu projeto
finalmente, usando o JProject, clique na opo "Create
Project", informe um nome e o diretrio
Como adicionar arquivos ao projeto
Sempre que o JProject estiver aberto, ele perguntar se o
arquivo salvo deve ser includo no projeto
Arquivos tambm podem ser adicionados usando o cone
correspondente

11
Como criar um template

Templates so teis para se ganhar tempo com


textos ou estruturas repetitivas, por exemplo:
Estrutura default de uma pgina HTML
Estrutura default de uma classe Java
Para criar um novo template,
Edite-o no JEdit e, na hora de salvar, selecione o menu
PlugIns/Templates/Save Template
Selecione Refresh Templates para que aparea na lista
Crie um arquivo novo e selecione o template da lista para
que o seu contedo seja copiado
Crie templates bsicos
Classe Java
Buildfile do Ant
12
Outros plug-ins
SpeedJava ("code insight") - no ser instalado durante o curso
Acionado quando voc digita um ponto "."
Lista mtodos e variveis da classe do objeto selecionado
Limitao (verso 0.2): classe tem que ter sido importada com import
pacote.* (no funciona se classe foi importada nominalmente)
Reformat Buffer e JavaStyle / Reformat Buffer
Rearruma cdigo Java
Configure para refletir seu estilo de codificao
JavaStyle oferece mais opes de configurao
XML e XSLT
Oferecem suporte para XML, XSLT e XPath
Validam XML com DTD, oferecem ajuda de contexto (quando h um
DTD vinculado), montam rvore (plug-in XML Tree)

13
Problemas
Os plug-ins do JEdit so desenvolvidos por programadores
independentes e podem no ter a mesma qualidade ou
utilidade dos recursos nativos do JEdit
Alguns contm bugs (falham ocasionalmente)
Alguns poderiam ser melhores
A integrao entre os plug-ins inferior desejvel
Ainda no h plugins para desenho de GUI, construo de EJBs, etc.
Solues
1) Esperar verses mais novas dos plug-ins (a atualizao requer
apenas apertar um boto (Update Plugins) no Plugin Manager
2) Enviar sugestes aos autores dos plug-ins
3) Escrever macros, scripts do Ant (EJB, arquivos WAR, etc.)
4) Participar do projeto open-source: baixar o cdigo-fonte Java, fazer
as alteraes desejadas e enviar patches aos autores
5) Escrever novos plug-ins (integrando ou no com os existentes)
6) Usar outro IDE
14
Alguns IDEs alternativos
Open source
Projeto Eclipse
NetBeans
Jext (Java Text Editor - similar ao JEdit) - no edita GUI
Free
Borland JBuilder Personal Edition
Sun Fort for Java Community Edition (baseado no NetBeans)
Leves
JCreator Servem para aumentar a
produtividade: evite us-los para
Kawa
aprender Java (prefira um editor
IDEA de textos como oJEdit ou Jext)
Comerciais Teste cada um com as
IBM Visual Age / WebSphere Studio ferramentas e recursos que voc
Borland JBuilder costuma usar e veja o que melhor
Sun Fort for Java se adapta s suas necessidades.
15
Exerccios

1. Organize os exerccios que voc fez nos mdulos


anteriores em projetos no JEdit
a) Crie um diretrio para cada um (coloque as fontes no
subdiretrio src)
b) Crie um projeto no Project Manager
c) Faa toda a compilao atravs do Ant (defina o
build.xml disponvel no diretrio cap03/ como template,
salve-o na raiz do seu projeto e inclua-o clicando no "+"
do AntFarm). Remova quando fechar o projeto.
d) Mude sempre o nome do seu build file
e) Execute atravs do Console (use um target do Ant)
Dica: veja artigo da JavaMagazine (anexo) que mostra com
detalhes como montar o ambiente deste mdulo
16
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
17
Java 2 Standard Edition

Como usar a
documentao
da API Java 2
Helder da Rocha
www.argonavis.com.br
1
Documentao
Aprender a usar a documentao essencial para
quem deseja desenvolver aplicaes em Java
A documentao da linguagem, ferramentas e API um
download separado do SDK
Para instalar a documentao Java, abra o arquivo ZIP
na raiz da sua instalao Java
A documentao ser instalada abaixo do subdiretrio docs/
da instalao Java ($JAVA_HOME)
%JAVA_HOME%\docs\ (ex: c:\jdk1.4.0\docs/)
$JAVA_HOME/docs/ (ex: /usr/java/j2sdk1.4.0/docs/)
A documentao da API Java est em
$JAVA_HOME/docs/api/index.html
Manuais, tutoriais sobre recursos da linguagem em
$JAVA_HOME/docs/index.html
2
Documentao Descrio da classe
(escolhida na janela B)
- hierarquia
Se um mtodo no for encontrado na - documentao detalhada,
classe mostrada, procure nas superclasses mtodos, variveis, etc.
(use as referncias cruzadas)

Lista de pacotes A

B C

Lista de classes e
interfaces do
pacote escolhido
na janela (A)

3
Como usar a documentao (2)

Descrio de todos os Classes e mtodos


pacotes da API Java Hierarquia de cujo uso no mais
classes no recomendado
Descrio de todas as pacote atual
classes do pacote atual (java.awt)
(java.awt)
Lista de pacotes que ndice com referncias
usam o pacote atual cruzadas (use para procurar
(java.awt) mtodos e campos quando no
souber a classe)

Como usar
a documentao
Links para esta pgina Links para esta pgina
- lista de classes internas - documentao de campos de dados
- lista de campos de dados - documentao de construtores
- lista de construtores - documentao de mtodos
- lista de mtodos
4
Como usar a documentao (3)

Pacote ao qual pertence a classe


Nome

Hierarquia de classes (todas as superclasses


da classe atual)

Interfaces que so
implementadas
nesta classe

Subclasses que pertencem


API Java 2

5
Como usar a documentao (4)

Listas de classes internas, campos de dados,


mtodos e construtores
Lista contm breve
descrio

Clique no nome para


descrio detalhada

Tipos de retorno

Parmetros

6
Documentao de um construtor
Assinatura do construtor
(mostra tipos dos parmetros)

O que faz o construtor

Descrio de cada
parmetro

Excees que o construtor


pode provocar

Mtodos relacionados

Alguns exemplos de como usar o construtor acima


Frame f = new Frame("Ttulo da Janela", null);

class MinhaJanela extends Frame {


public MinhaJanela(String titulo) {
super(titulo, null);
...
7
Documentao de um mtodo
assinatura do mtodo

parmetros do mtodo
tipo de
retorno descrio do
mtodo

detalhes sobre os
parmetros

Para chamar o mtodo acima ( fillRect() da classe java.awt.Graphics)


g.fillRect(25, 50, 100, 200); // g: referncia Graphics
Desenha um retngulo preenchido com a cor atual do contexto grfico, com seu
canto superior esquerdo na posio x:25 e y:50, com 100 pixels de largura por 200
de altura
Para sobrepor, repita a assinatura do mtodo e fornea sua implementao
8
Exerccio 1: documentao
a) Crie duas classes
Uma classe deve estender javax.swing.JFrame (esta classe ir
fornecer a interface grfica)
Outra classe, executvel (contendo main) para iniciar a classe grfica.
b) Crie um construtor na classe derivada de JFrame
O construtor deve definir o ttulo da janela (use super() com os
argumentos correspondentes ou descubra um mtodo que faa isto)
Deve definir o tamanho (setSize): 300x300, e tornar a janela visvel
(setVisible) - procure em java.awt.omponent
c) Sobreponha o mtodo paint(Graphics g) herdado de
java.awt.Component
Veja a assinatura correta na documentao. paint() chamada pelo
sistema automaticamente para pintar o contexto grfico da aplicao
Mtodo paint deve usar contexto grfico da janela (objeto g) para
mudar a cor atual de g (para vermelho, por exemplo) (setColor) e
desenhar, em g, um crculo (fillOval), tendo a metade da largura
da janela (150), e posicionado no centro.
9
Ex 2: gerao de documentao
a) use comentrios de documentao para descrever a classe
que voc criou, o construtor e o mtodo paint()
Use comentrios /** ... */ ANTES dos mtodos, construtores e classes
Use @param nome descrio para descrever os parmetros
@param um comando do javadoc. Pode vir no incio da linha (o incio
da linha pode ter espaos ou asteriscos *). Exemplo:
/** @param mensagem Texto contendo descrio... */
b) Rode o javadoc passando a classe como argumento
> javadoc NomeDaClasse
Navegue e explore os documentos HTML gerados
c) Crie uma target no Ant para gerar documentao de todo o
projeto (veja no captulo 8 um resumo dos tags do Ant).

10
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
11
Java 2 Standard Edition

Tipos, literais,
operadores e
controle de fluxo
Helder da Rocha
www.argonavis.com.br
1
Operadores e controle de fluxo da execuo

Este mdulo explora as estruturas procedurais da


linguagem Java
Operadores
Aritmticos, lgicos, binrios, booleanos, de
deslocamento, de concatenao, de converso, ...
Converso de tipos
Promoo
Coero (cast)
Estruturas de controle de execuo
if-else,
for, while, do-while
break, continue, rtulos
switch (case)
2
Operadores

Um operador produz um novo valor a partir de um


ou mais argumentos
Os operadores em Java so praticamente os mesmos
encontrados em outras linguagens
+, -, /, *, =, ==, <, >, >=, &&, etc.
A maior parte dos operadores s trabalha com
valores de tipos primitivos.
Excees:
+ e += so usados na concatenao de strings
!=, = e == so usados tambm com objetos (embora
no funcionem da mesma forma quanto aos valores
armazenados nos objetos)
3
Lista de operadores do Java
OPERADOR FUNO OPERADOR FUNO
+ Adio ~ Complemento
- Subtrao << Deslocamento esquerda
* Multiplicao >> Deslocamento direita
/ Diviso >>> Desloc. a direita com zeros
% Resto = Atribuio
++ Incremento += Atribuio com adio
-- Decremento -= Atribuio com subtrao
> Maior que *= Atribuio com multiplicao
>= Maior ou igual /= Atribuio com diviso
< Menor que %= Atribuio com resto
<= Menor ou igual &= Atribuio com AND
== Igual |= Atribuio com OR
!= No igual ^= Atribuio com XOR
! NO lgico <<= Atribuio com desl. esquerdo
&& E lgico >>= Atribuio com desloc. direito
|| OU lgico >>>= Atrib. C/ desloc. a dir. c/ zeros
& AND ? : Operador ternrio
^ XOR (tipo) Converso de tipos (cast)
| OR instanceof Comparao de tipos

4
Precedncia

A precedncia determina em que ordem as operaes


em uma expresso sero realizadas.
Por exemplo, operaes de multiplicao so realizadas
antes de operaes de soma:
int x = 2 + 2 * 3 9 / 3; // 2+63 = 5
Parnteses podem ser usados para sobrepor a
precedncia
int x = (2 + 2) * (3 9) / 3; // 4*( 6)/3 = 8
A maior parte das expresses de mesma precedncia
calculada da esquerda para a direita
int y = 13 + 2 + 4 + 6; // (((13 + 2) + 4) + 6)
H excees. Por exemplo, atribuio.
5
Tabela de precedncia
ASSOC TIPO DE OPERADOR OPERADOR

DaE separadores [] . ; , ()
EaD operadores unrios new (cast) +expr -expr ~ !
EaD incr/decr pr-fixado ++expr -expr
EaD multiplicativo * / %
EaD aditivo + -
EaD deslocamento << >> >>>
EaD relacional < > >= <= instanceof
EaD igualdade == !=
EaD AND &
EaD XOR ^
EaD OR |
EaD E lgico &&
EaD OU lgico ||
DaE condicional ?:
DaE atribuio = += -= *= /= %= >>= <<= >>>= &= ^= !=
EaD incr/decr ps fixado expr++ expr--

6
Literais de caracteres em Java

SEQNCIA VALOR DO CARACTERE

\b Retrocesso (backspace)
\t Tabulao
\n Nova Linha (new line)
\f Alimentao de Formulrio (form feed)
\r Retorno de Carro (carriage return)
\" Aspas
\' Aspa
\\ Contra Barra
\nnn O caractere correspondente ao valor octal nnn, onde nnn um
valor entre 000 e 0377.
\unnnn O caractere Unicode nnnn, onde nnnn de um a quatro dgitos
hexadecimais. Seqncias Unicode so processadas antes das
demais seqncias.

7
Atribuio
A atribuio realizada com o operador =
= serve apenas para atribuio no pode ser usado em
comparaes (que usa ==)!
Copia o valor da varivel ou constante do lado direito para a varivel
do lado esquerdo.
x = 13; // copia a constante inteira 13 para x
y = x; // copia o valor contido em x para y
A atribuio copia valores
O valor armazenado em uma varivel de tipo primitivo o valor do
nmero, caractere ou literal booleana (true ou false)
O valor armazenado em uma varivel de tipo de classe (referncia
para objeto) o ponteiro para o objeto ou null.
Conseqentemente, copiar referncias por atribuio no copia
objetos mas apenas cria novas referncias para o mesmo objeto!

8
Passagem de valores via atribuio

Variveis de tipos primitivos


(...)
Pilha aps linha 2 Pilha aps linha 3
1: char letraPri = 'a';
letraPri 'a' letraPri 'b' 2: char letraPri2 = letraPri;
3: letraPri = 'b';
letraPri2 'a' letraPri2 'a' (...)

Referncias de objetos public class Letra {


public char c;
Aps linha 6 }
letraObj 0xffa9 Letra
letraObj2 0xffa9 c 'a' (...)
Aps linha 7 4: Letra letraObj = new Letra();
5: letraObj.c = 'a';
letraObj 0xffa9 Letra 6: Letra letraObj2 = letraObj;
7: letraObj2.c = 'b';
letraObj2 0xffa9 c 'b' (...)

9
Operadores matemticos

+ adio
- subtrao
* multiplicao
/ diviso
% mdulo (resto)

Operadores unrios
-n e +n (ex: -23) (em uma expresso: 13 + -12)
Melhor usar parnteses: 13 + (-12)
Atribuio com operao
+=, -=, *=, /=, %=
x = x + 1 equivale a x += 1
10
Incremento e decremento

Exemplo
int a = 10;
int b = 5;
Incrementa ou decrementa antes de usar a varivel
int x = ++a; // a contm 11, x contm 11
int y = --b; // b contm 4, y contm 4
A atribuio foi feita DEPOIS!
Incrementa ou decrementa depois de usar a varivel
int x = a++; // a contm 11, x contm 10
int y = b--; // b contm 4, y contm 5
A atribuio foi feita ANTES!

11
Operadores relacionais

== igual
!= diferente
< menor
<= menor ou igual
> maior
>= maior ou igual

Sempre produzem um resultado booleano


true ou false
Comparam os valores de duas variveis ou de uma
varivel e uma constante
Comparam as referncias de objetos (apenas == e !=)
12
Operadores lgicos

&& E (and)
|| Ou (or)
! Negao (not)

Produzem sempre um valor booleano


true ou false
Argumentos precisam ser valores booleanos ou expresses com
resultado booleano
Por exemplo: (3 > x) && !(y <= 10)
Expresso ser realizada at que o resultado possa ser
determinado de forma no ambgua
short-circuit
Exemplo: (false && <qualquer coisa>)
A expresso <qualquer coisa> no ser calculada
13
Operadores orientados a bit

& and
| or
^ xor (ou exclusivo)
~ not

Para operaes em baixo nvel (bit por bit)


Operam com inteiros e resultados so nmeros inteiros
Se argumentos forem booleanos, resultado ser igual ao
obtido com operadores booleanos, mas sem curto-
circuito
Suportam atribuio conjunta: &=, |= ou ^=

14
Operadores de deslocamento

<< deslocamento de bit esquerda


(multiplicao por dois)
>> deslocamento de bit direita
(diviso truncada por dois)
>>> deslocamento direita sem
considerar sinal (acrescenta zeros)
Para operaes em baixo nvel (bit a bit)
Operam sobre inteiros e inteiros longos
Tipos menores (short e byte) so convertidos a int antes
de realizar operao
Podem ser combinados com atribuio: <<=, >>= ou
>>>=
15
Operador ternrio (if-else)

Retorna um valor ou outro dependendo do resultado


de uma expresso booleana
variavel = expresso ? valor, se true
: valor, se false;
Exemplo:
int x = (y != 0) ? 50 : 500;
String tit = (sex == 'f') ? "Sra." : "Sr
num + " pagina" + (num != 1) ? "s" : ""
Use com cuidado
Pode levar a cdigo difcil de entender

16
Operador de concatenao

Em uma operao usando "+" com dois operandos,


se um deles for String, o outro ser convertido para
String e ambos sero concatenados
A operao de concatenao, assim como a de
adio, ocorre da direita para a esquerda
String s = 1 + 2 + 3 + "=" + 4 + 5 + 6;
Resultado: s contm a String "6=456"

17
instanceof

instanceof um operador usado para comparar uma


referncia com uma classe
A expresso ser true se a referncia for do tipo de uma
classe ou subclasse testada e false, caso contrrio
Sintaxe: referncia instanceof Classe
Exemplo:
if (obj instanceof Point) {
System.out.println("Descendente de Point");
}

Mais detalhes sobre este assunto em captulos posteriores! 18


Tipos de dados

boolean (8 bits)

byte (8 bits)

char (16 bits)


short (16 bits)

int (32 bits) long (64 bits)

float (32 bits) double (64 bits)

19
Converso de tipos primitivos
Java converter um tipo de dados em outro sempre que isto
for apropriado
As converses ocorrero automaticamente quando houver
garantia de no haver perda de informao
Tipos menores em tipos maiores
Tipos de menor preciso em tipos de maior preciso
Tnteiros em ponto-flutuante
Converses automticas double d = 12.3;
byte byte b = 10; double
char c = 'A';
char short s2 = b;
short

converses legais
float f = 12.3f; int i2 = c;
short s = 20; int i3 = s;
float
long m2 = i;
int float f2 = m;

Algumas
int i = 100;
long m = 200L; double d2 = f;

long
20
Converso de referncias

Pode-se atribuir uma referncia A a uma outra


referncia B de um tipo diferente, desde que
B seja uma superclasse (direta ou indireta) de A:
Qualquer referncia pode ser atribuda a uma referncia
da classe Object
B seja uma interface implementada por A: mais detalhes
sobre interfaces em aulas futuras
Algumas converses legais
class Carro extends Veiculo {...}
Carro c = new Carro();
class Veiculo implements Dirigivel {} Veiculo v = new Carro();
Object o = new Carro();
class Porsche extends Carro {...} Dirigivel d = new Carro();
Carro p = new Porsche();

Mais detalhes sobre este assunto em captulos posteriores! 21


Operadores de coero
Na coero (cast), o programador assume os riscos da
converso de dados
No tipo byte cabem inteiros at 127
No tipo short cabem inteiros at 32767
No h risco de perda de informao na atribuio a seguir
short s = 100; byte b = s;
(pois 100 cabe em byte) mas o compilador acusar erro
porque um short no pode ser atribudo a byte.
Soluo operador de coero (cast)
byte b = (byte) s;
O programador "assume o risco", declarando entre
parnteses, que o contedo de s cabe em byte.
O operador de coero tem maior precedncia que os outros
operadores!
22
Promoo

Qualquer operao com dois ou mais operandos de


tipos diferentes sofrer promoo, isto , converso
automtica ao tipo mais abrangente, que pode ser
O maior ou mais preciso tipo da expresso (at double)
O tipo int (para tipos menores que int)
O tipo String (no caso de concatenaes) - (na verdade
isto no uma promoo) a partir daqui s
o sinal '+' permitido!
Exemplos
String s = 13 - 9 * 16 + "4" + 9 + 2; // "-131492"
double d = 12 + 9L + 12.3; // tudo promovido p/ double
byte b = 9; byte c = 10; byte d = 12;
byte x = (byte) (b + c + d); cast essencial aqui!
Observe os parnteses!

promovidos para int!

23
Controle de execuo

O controle do fluxo da execuo em Java utiliza os


mesmos comandos existentes em outras linguagens
Repetio: for, while, do-while
Seleo: if-else, switch-case
Desvios (somente em estruturas de repetio): continue,
break, rtulos
No existe comando goto
goto, porm, palavra-reservada.

24
true e false

Todas as expresses condicionais usadas nas


estruturas for, if-else, while e do-while so
expresses booleanas
O resultado das expresses deve ser sempre true ou false
No h converses automticas envolvendo booleanos em
Java (evita erros de programao comuns em C/C++)
Cdigo correto.
Cdigo errado. x == 5 expresso
No compila com resultado true
em Java ou false
int x = 10; cdigo aceito em C/C++ int x = 10;
if (x = 5) { (mas provavelmente errado)
if (x == 5) {
... x, com valor 5, converte-se
...
} em 'true'.
}

25
if-else

Sintaxe
if (expresso booleana) if (expresso booleana) {
instruo_simples; instrues
} else if (expresso booleana) {
if (expresso booleana) { instrues
instrues } else {
} instrues
}
Exemplo
if ( ano < 0) {
System.out.println("No um ano!");
} else if ( (ano%4==0 && ano%100!=0) || (ano%400==0) ) {
System.out.println(" bissexto!");
} else {
System.out.println("No bissexto!");
}

26
return

A palavra-chave return tem duas finalidades


Especifica o que um mtodo ir retornar (se o mtodo no tiver sido
declarado com tipo de retorno void)
Causa o retorno imediato linha de controle imediatamente
posterior chamada do mtodo
Exemplos de sintaxe:
Este exemplo
funciona como um
boolean mtodo() { if com else:
void mtodo() {
if (condio) { if (condio) {
instruo; instruo;
return true; return;
} }
resto do mtodo mais coisas...
return false; }
}

27
while e do-while

Sintaxe
while (expreso booleana ) do
{ {
instrues; instrues;
} } while (expreso booleana );

Exemplos
int x = 0;
while (x < 10) {
System.out.println ("item " + x); while ( true ) {
x++; if (obj.z == 0) {
} break;
}
int x = 0; }
do {
System.out.println ("item " + x);
x++; loop
} while (x < 10); infinito!

28
for

Sintaxe
for ( inicializao; for ( inicializao;
expresses booleanas; expresses booleanas;
passo da repetio ) passo da repetio )
{
instrues; instruo_simples;
}

Exemplos
for ( int x = 0; x < 10; x++ ) { for ( ; ; ) {
System.out.println ("item " + x); if (obj.z == 0) {
} break;
}
for ( int x = 0, int y = 25; }
x < 10 && (y % 2 == 0);
x++, y = y - 1 ) {
System.out.println (x + y); loop
} infinito!

29
break e continue
break: interrompe a execuo do bloco de repetio.
Continua com a prxima instruo, logo aps o bloco.
continue: interrompe a execuo da iterao
Testa a condio e reinicia o bloco com a prxima iterao.

while (!terminado) {
passePagina();
if (alguemChamou == true) {
break; // caia fora deste loop
}
if (paginaDePropaganda == true) {
continue; // pule esta iterao
}
leia();
}
restoDoPrograma();

30
break e continue com rtulos
break e continue sempre atuam sobre o bloco de repetio onde
so chamados
Em blocos de repetio contidos em outros blocos, pode-se usar
rtulos para fazer break e continue atuarem em blocos externos
Os rtulos s podem ser usados antes de do, while e for
As chamadas s podem ocorrer dentro de blocos de repetio.
Exemplo:

revista: while (!terminado) {


for (int i = 10; i < 100; i += 10) { Sintaxe:
passePagina();
if (textoChato) { ident: do {...}
break revista; ou
} ident: while () {...}
} break sem rtulo ou
maisInstrucoes(); quebraria aqui!
ident: for () { ...}
}
restoDoPrograma();
31
switch (case)
Sintaxe qualquer expresso Exemplo
que resulte em
valor inteiro (incl. char) char letra;

switch(seletor_inteiro) { switch(letra) {
case valor_inteiro_1 : case 'A' :
instrues; System.out.println("A");
break; break;
case valor_inteiro_2 : case 'B' :
instrues; System.out.println("B");
break; break;
... uma constante ...
default: inteira (inclui default:
instrues; char) System.out.println("?");
} }

32
Exerccios
1. Escreva um programa Quadrados que leia um nmero da
linha de comando e imprima o quadrado de todos os
nmeros entre 1 e o nmero passado.
Para converter de String para int, use:
int numero = Integer.parseInt("10");
2. Use o JOptionPane (veja documentao) e repita o
exerccio anterior recebendo os dados atravs da janela de
entrada de dados (programa WinQuadrados)
Use JOptionPane.showInputDialog(string) de
javax.swing para ler entrada de dados
Use JOptionPane.showMessageDialog(null, msg) para
exibir a sada de dados
3. Se desejar, use o build.xml do Ant disponvel que executa
Quadrados e WinQuadrados
33
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
34
Java 2 Standard Edition

Como criar
classes e objetos

Helder da Rocha
www.argonavis.com.br
1
Assuntos abordados

Este mdulo explora detalhes da construo de


classes e objetos
Construtores
Implicaes da herana
Palavras super e this, usadas como referncias para o
objeto corrente e a super classe
Instrues super() e this() usadas para chamar
construtores durante a criao de objetos
Detalhes sobre a inicializao de objetos e possveis
problemas

2
Criao e destruio de objetos
Para a criao de novos objetos, Java garante que cada classe
tenha um construtor
O construtor default recebe zero argumentos
Faz apenas inicializao da superclasse
Programador pode criar um construtor explicitamente e
determinar suas operaes de inicializao
Inicializao pela superclasse continua garantida
Construtor default deixa de existir
Objetos so destrudos automaticamente pelo sistema,
porm, sistema no faz finalizao
Mtodo finalize(), herdado de Object, teoricamente permite ao
programador controlar a finalizao de qualquer objeto
finalize() no funciona 95% das vezes - no use! Se precisar de
finalizao, coloque seu cdigo em um bloco try {...} finally {...}

3
Construtores e sobrecarga
Construtores default (sem argumentos) s existem quando
no h construtores definidos explicitamente no cdigo
A criao de um construtor explcito substitui o construtor
fornecido implicitamente
Uma classe pode ter vrios construtores (isto se chama
sobrecarga de nomes)
Distino feita pelo nmero e tipo de argumentos (ou seja,
pela assinatura do construtor)
A assinatura a identidade do mtodo. pela assinatura que
ele se distingue dos outros mtodos. Consiste de
Tipo de retorno
Nome
Tipo de argumentos
Quantidade de argumentos
4
Sobrecarga de mtodos
Uma classe tambm pode ter vrios mtodos com o
mesmo nome (sobrecarga de nomes de mtodos)
Distino feita pela assinatura: tipo e nmero de
argumentos, assim como construtores
Apesar de fazer parte da assinatura, o tipo de retorno no
pode ser usado para distinguir mtodos sobrecarregados
Na chamada de um mtodo, seus parmetros so
passados da mesma forma que em uma atribuio
Valores so passados em tipos primitivos
Referncias so passadas em objetos
H promoo de tipos de acordo com as regras de
converso de primitivos e objetos
Em casos onde a converso direta no permitida,
preciso usar operadores de coero (cast)
5
Distino de mtodos na sobrecarga

Mtodos sobrecarregados devem ser diferentes o


suficiente para evitar ambigidade na chamada
Qual dos mtodos abaixo ...
int metodo (long x, int y) {...}
int metodo (int x, long y) {...}

... ser chamado pela instruo abaixo?


int z = metodo (5, 6);

O compilador detecta essas situaes

6
this()

Em classes com mltiplos construtores, que realizam


tarefas semelhantes, this() pode ser usado para
chamar outro construtor local, identificado pela sua
assinatura (nmero e tipo de argumentos)

public class Livro { public class Livro {


private String titulo; private String titulo;
public Livro() { public Livro() {
titulo = "Sem titulo"; this("Sem titulo");
} }
public Livro(String titulo) { public Livro(String titulo) {
this.titulo = titulo; this.titulo = titulo;
} }
} }

7
super()

Todo construtor chama algum construtor de sua


superclasse
Por default, chama-se o construtor sem argumentos,
atravs do comando super() (implcito)
Pode-se chamar outro construtor, identificando-o atravs
dos seus argumentos (nmero e tipo) na instruo super()
super(), se presente, deve sempre ser a primeira instruo
do construtor (substitui o super() implcito)
Se a classe tiver um construtor explcito, com
argumentos, subclasses precisam cham-lo
diretamente
No existe mais construtor default na classe
8
this e super
A palavra this usada para referenciar membros de um objeto
No pode ser usada dentro de blocos estticos (no existe
objeto atual 'this' em mtodos estticos)
obrigatria quando h ambiguidade entre variveis locais e
variveis de instncia
super usada para referenciar os valores originais de variveis
ou as implementaes originais de mtodos sobrepostos
class Numero { class OutroNumero extends Numero {
public int x = 10; public int x = 20;
} public int total() {
return this.x + super.x;
}
} 20 10

No confunda this e super com this() e super()


Os ltimos so usados apenas em construtores!
9
Inicializao de instncias

O que acontece quando um objeto criado usando


new NomeDaClasse() ?
1. Inicializao default de campos de dados (0, null, false)
2. Chamada recursiva ao construtor da superclasse (at
Object)
2.1 Inicializao default dos campos de dados da superclasse
(recursivo, subindo a hierarquia)
2.2 Inicializao explicita dos campos de dados
2.3 Execuo do contedo do construtor (a partir de Object,
descendo a hierarquia)
3. Inicializao explcita dos campos de dados
4. Execuo do contedo do construtor

10
Exemplo (1)
class Bateria {
Mquina
public Bateria() {
System.out.println("Bateria()"); ligar()
}
}

class Tela { Computador


public Tela() { Teclado
System.out.println("Tela()");
} Tela
}

class Teclado {
public Teclado() {
Notebook
System.out.println("Teclado()");
} Bateria
} codigo: 12345
ligar()
11
Exemplo (2)

class Maquina { Mquina


public Maquina() { ligar()
System.out.println("Maquina()");
this.ligar();
}
public void ligar() { Computador
System.out.println("Maquina.ligar()");
} Teclado
} Tela

class Computador extends Maquina {


public Tela tela = new Tela();
public Teclado teclado = new Teclado();
public Computador() { Notebook
System.out.println("Computador()");
Bateria
}
} codigo: 12345
ligar()
12
Exemplo (3)

class Notebook extends Computador { Mquina


int codigo = 12345; ligar()
public Bateria bateria = new Bateria();
public Notebook() {
System.out.print("Notebook(); " +
"codigo = "+codigo);
} Computador
public void ligar() {
System.out.println("Notebook.ligar();" + Teclado
" codigo = "+ codigo); Tela
}
}

public class Run {


public static void main (String[] args) {
Notebook
new Notebook();
} Bateria
} codigo: 12345
ligar()
13
Resultado de new Notebook()
1. Construtor de Maquina chamado
Maquina() 2. Mtodo ligar() de Notebook
(e no de Maquina) chamado!
Notebook.ligar(); codigo = 0
3. PROBLEMA!!!!!
Tela() Varivel codigo, de Notebook
ainda no foi inicializada
quando ligar() foi chamado!
Teclado() 4. Variveis tela e teclado,
membros de Computador
so inicializadas
Computador() 5. Construtor de Computador chamado
6. Varivel bateria, membro
Bateria() de Notebook inicializada
7. Construtor de Notebook
Notebook(); codigo = 12345 chamado. Varivel codigo
finalmente inicializada
14
N1.
N1. new
new Notebook()
Notebook() chamado
chamado

Detalhes
N2.
N2. varivel
varivel cdigo
cdigo iniciaizada:
iniciaizada: 00
N3.
N3. varivel
varivel bateria
bateria iniciaizada:
iniciaizada: null
null
N4. super() chamado (Computador)
N4. super() chamado (Computador)
C1.
C1. varivel
varivel teclado
teclado iniciaizada:
iniciaizada: null
null O1.
O1. Campos
Campos inicializados
inicializados
C2. varivel tela iniclaizada: null
C2. varivel tela iniclaizada: null O2.
O2. Corpo
Corpo de
de Object()
Object() executado
executado
C3.
C3. super()
super() chamado
chamado (Maquina)
(Maquina)
M2.
M2. super()
super() chamado
chamado (Object)
(Object) Efeito de Object
new Notebook()
M2.
M2. Corpo
Corpo de de Maquina()
Maquina() executado:
executado:
println()
println() ee this.ligar()
this.ligar()

C4:
C4: Construtor
Construtor de
de Teclado
Teclado chamado
chamado Mquina
ligar()
Tk1:
Tk1: super()
super() chamado
chamado (Object)
(Object)
C5.
C5. referncia
referncia teclado
teclado inicializada
inicializada
C6: Computador Teclado
C6: Construtor
Construtor dede Tela
Tela chamado
chamado
teclado
Te1:
Te1: super()
super() chamado
chamado (Object)
(Object) tela
C7: Tela
C7: referncia
referncia tela
tela inicializada
inicializada
C8: Corpo de Computador()
C8: Corpo de Computador()
executado:
executado: println()
println()
Notebook
N5.
N5. Construtor
Construtor de
de Bateria
Bateria chamado
chamado
bateria Bateria
B1:
B1: super()
super() chamado
chamado (Object)
(Object) codigo: int

N6: ligar()
N6: varivel
varivel cdigo
cdigo inicializada:
inicializada: 12345
12345
N7:
N7: referncia
referncia bateria
bateria inicializada
inicializada
N8.
N8. Corpo
Corpo dede Notebook()
Notebook() executado:
executado: println()
println() 15
N1. new Notebook() chamado
N2. varivel cdigo iniciaizada: 0
N3. varivel bateria iniciaizada: null
Problemas com
N4. super() chamado (Computador)
C1. varivel teclado iniciaizada: null
inicializao
C2. varivel tela iniclaizada: null
C3. super() chamado (Maquina)
M2. super() chamado (Object) mtodo ligar() chamado no
M2. Corpo de Maquina() executado: construtor de Maquina, mas ...
println() e this.ligar()
... a verso usada a
C4: Construtor de Teclado chamado
implementao em Notebook,
Tk1: super() chamado (Object)
que imprime o valor de cdigo
C5. referncia teclado inicializada
C6: Construtor de Tela chamado (e no a verso de Maquina
Te1: super() chamado (Object) como aparenta)
C7: referncia tela inicializada Como cdigo ainda no foi
C8: Corpo de Computador()
executado: println()
inicializado, valor impresso 0!
N5. Construtor de Bateria chamado

B1: super() chamado (Object)

N6: varivel cdigo inicializada: 12345


N7: referncia bateria inicializada
N8. Corpo de Notebook() executado: println() 16
Preste ateno nos pontos crticos!
Como evitar o problema?

Evite chamar mtodos locais dentro de construtores


Construtor (qualquer um da hierarquia) sempre usa
verso sobreposta do mtodo
Isto pode trazer resultados inesperados se algum
estender a sua classe com uma nova implementao
do mtodo que
Dependa de variveis da classe estendida
Chame mtodos em objetos que ainda sero criados
(provoca NullPointerException)
Dependa de outros mtodos sobrepostos
Use apenas mtodos finais em construtores
Mtodos declarados com modificador final no podem ser
sobrepostos em subclasses
17
Inicializao esttica

Para inicializar valores estticos, preciso atuar logo


aps a carga da classe
O bloco 'static' tem essa finalidade
Pode estar em qualquer lugar da classe, mas ser
chamado antes de qualquer outro mtodo ou varivel
class UmaClasse {
private static Point[] p = new Point[10];
static {
for (int i = 0; i < 10; i++) {
p[i] = new Point(i, i);
}
}
}
No possvel prever em que ordem os blocos static
sero executados, portanto: s tenha um!
18
Exerccio

1. Preparao
a) Crie um novo projeto para este mdulo
b) Copie os arquivos Ponto e Circulo dos exerccios feitos
no Captulo 2 (se voc no os fez, use os da soluo)
2. Crie mais um construtor em Crculo
a) Crie um construtor default, que represente um crculo
na origem (0,0) com raio unitrio
b) Use this() em dois dos trs construtores de Circulo
3. Crie uma classe Ponto3D que estenda Ponto.
Use, se necessrio, a chamada correta de super() para
permitir que a classe seja compilada
4. Altere TestaCirculo para testar as novas classes
19
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
20
Java 2 Standard Edition

Pacotes e
Encapsulamento
Helder da Rocha
www.argonavis.com.br
1
Assuntos abordados neste mdulo

Este mdulo explora pacotes em Java, iniciando


pelos pacotes da prpria API Java e terminando por
mostrar como construir pacotes e guard-los em um
arquivo JAR
Assuntos
API do Java 2 - viso geral dos principais pacotes
Classes do java.lang: viso geral das principais classes
Mtodos de java.lang.Object que devem ser
implementados
Pacotes em Java: como criar e como usar
Arquivos JAR para bibliotecas e executveis

2
API Java 2

A API do Java 2 consiste de classes distribudas e


organizadas em pacotes e subpacotes
Pacotes bsicos
java.lang: classes fundamentais - importado
automaticamente
java.util: classes utilitrias
java.io: classes para entrada e sada
java.net: classes para uso em rede (TCP/IP)
java.sql: classes para acesso via JDBC
java.awt: interface grfica universal nativa
java.text: internacionalizao, transformao e
formatao de texto
Veja a documentao!
3
java.lang

importante conhecer bem as classes deste pacote


Interfaces
Cloneable
Runnable
Classes
Boolean, Number (e subclasses), Character, Void
Class
Math
Object
Process, Thread, System e Runtime
String e StringBuffer
Throwable e Exception (e subclasses)

4
java.lang.Object

Raiz da hierarquia de classes da API Java


Toda classe estende Object, direta ou indiretamente
Classes que no declaram estender ningum, estendem
Object diretamente
class Ponto {}
o mesmo que
class Ponto extends Object {}
Classes que declaram estender outra classe, herdam de
Object pela outra classe cuja hierarquia comea em Object
Todos os mtodos de Object esto automaticamente
disponveis para qualquer objeto
Porm, as implementaes so default, e geralmente inteis
para objetos especficos
5
Exerccio

1. Consulte no JavaDoc a pgina sobre


java.lang.Object: veja os mtodos.
2. Utilize a classe TestaCirculo (exerccios
anteriores) e teste os mtodos equals() e toString()
de Object
a) Crie dois Pontos e dois Circulos iguais (com mesmos
raio e coordenadas)
b) Teste se os crculos e pontos so iguais usando "=="
c) Teste se so iguais usando equals():
if (p1.equals(p2)) {...}
d) Imprima o valor retornado pelo mtodo toString()
de cada um dos objetos
6
Classe java.lang.Object e interface Cloneable

Principais mtodos de Object (todos os objetos tm)


public boolean equals(Object obj)
public String toString() por ser protected
TEM que ser sobreposto
public int hashCode() para que possa ser usado
protected Object clone() em qualquer classe

throws CloneNotSupportedException
public void wait() throws InterruptedException
public void notify()
Cloneable
Usada para permitir que um objeto seja clonado. No
possui declarao de mtodos
Como fazer:
class SuaClasse implements Cloneable
class SuaClasse extends SupClasse implements Cloneable
7
Como estender Object
H vrios mtodos em Object que devem ser
sobrepostos pelas subclasses
A subclasse que voc est estendendo talvez j tenha
sobreposto esses mtodos mas, alguns deles, talvez
precisem ser redefinidos para que sua classe possa ser
usada de forma correta
Mtodos que devem ser sobrepostos
boolean equals(Object o): Defina o critrio de
igualdade para seu objeto
int hashCode(): Para que seu objeto possa ser
localizado em Hashtables
String toString(): Sobreponha com informaes
especficas do seu objeto
Object clone(): se voc desejar permitir cpias do seu
objeto
8
Como sobrepor equals()

Determine quais os critrios (que propriedades do


objeto) que podem ser usados para dizer que um
objeto igual a outro
O raio, em um objeto Crculo
O nmero de srie, em um objeto genrico
O nome, sobrenome e departamento, para um empregado
A chave primria, para um objeto de negcio
Implemente o equals(), testando essas condies e
retornando true apenas se forem verdadeiras (false,
caso contrrio)
Verifique que a assinatura seja igual definida em Object

9
instanceof e exemplo com equals()

instanceof um operador usado para comparar uma


referncia com uma classe
A expresso ser true se a referncia for do tipo de uma
classe ou subclasse testada e false, caso contrrio
Exemplo: sobreposio de equals()
class Point {
private int x, y;
public boolean equals(Object obj) {
if (obj instanceof Point) {
Point ponto = (Point) obj;
if (ponto.x == this.x && ponto.y == this.y) {
return true;
}
}
return false;
}
}
10
Como sobrepor toString()

toString() deve devolver um String que possa


representar o objeto quando este for chamado em
uma concatenao ou representado como texto
Decida o que o toString() deve retornar
Faa chamadas super.toString() se achar conveniente
Prefira retornar informaes que possam identificar o
objeto (e no apenas a classe)
toString() chamado automaticamente em concatenes
usando a referncia do objeto

11
Exerccio

1. Sobreponha toString() em Ponto e Circulo


Faa toString retornar informaes que representem o
objeto quando ele for impresso
Se desejar, faa toString retornar o contedo de
imprime() (se voc implementou este mtodo)
Teste sua implementao imprimindo os objetos
diretamente no System.out.println() sem chamar
toString() explicitamente
2. Sobreponha equals() em Circulo
Um circulo igual a outro se estiver no mesmo ponto na
origem e se tiver o mesmo raio.
Rode a classe de teste e veja se o resultado o esperado
Implemente, se necessrio, equals() em Ponto tambm!
12
Como sobrepor hashCode()

hashCode() deve devolver um nmero inteiro que


represente o objeto
Use uma combinao de variveis, uma chave primria ou
os critrios usados no equals()
Nmero no precisa ser nico para cada objeto mas dois
objetos iguais devem ter o mesmo nmero.
O mtodo hashCode() chamado automaticamente
quando referncias do objeto forem usadas em colees
do tipo hash (Hashtable, HashMap)
equals() usado como critrio de desempate, portanto,
se implementar hashCode(), implemente equals()
tambm.

13
Como sobrepor clone()

clone() chamado para fazer cpias de um objeto


Circulo c = new Circulo(4, 5, 6); cast necessrio
porque clone()
Circulo copia = (Circulo) c.clone(); retorna Object
Se o objeto apenas contiver tipos primitivos como
seus campos de dados, preciso
1. Declarar que a classe implementa Cloneable
preciso sobrepor
2. Sobrepor clone() da seguinte forma: clone() porque ele
definido como
public Object clone() { protected
try {
return super.clone();
} catch (CloneNotSupportedException e) {
return null;
}
}
14
Como sobrepor clone() (2)

Se o objeto contiver campos de dados que so


referncias a objetos, preciso fazer cpias desses
objetos tambm
public class Circulo {
private Point origem;
private double raio;
public Object clone() {
try {
Circulo c = (Circulo)super.clone();
c.origem = (Point)origem.clone(); // Point clonvel!
return c;
} catch (CloneNotSupportedException e) {return null;}
}
}

clone() implementao do padro de projeto Prototype


15
A classe java.lang.Math

A classe Math uma classe final (no pode ser


estendida) com construtor private (no permite a
criao de objetos)
Serve como repositrio de funes e constantes
matemticas
Para usar, chame a constante ou funo precedida
do nome da classe:
double distancia = Math.sin(0.566);
int sorte = (int) (Math.random() * 1000);
double area = 4 * Math.PI * raio;
Consulte a documentao sobre a classe Math e
explore as funes disponveis
16
Funes matemticas
Algumas funes teis de java.lang.Math (consulte a
documentao para mais detalhes)
double random(): retorna nmero aleatrio entre 0 e 1
int floor(double valor): trunca o valor pelo decimal
(despreza as casas decimais)
int ceil(double valor): retorna o prximo valor inteiro
(arredonda para cima)
int round(double valor): arredonda valor
double pow(double valor, double valor): expoente
double sqrt(double valor): raiz quadrada
double sin(double valor), double cos(double valor),
double tan(double valor): calculam seno, cosseno e
tangente respectivamente
Veja ainda: exp(), log(), ln(), E, PI, etc.
17
As classes empacotadoras (wrappers)
Classes que servem para embutir tipos primitivos para
que possam ser manipulados como objetos
Exemplo:
Um vetor de tipos Object pode conter qualquer objeto mas
no tipos primitivos
Object[] vetor = new Object[5];
vetor[0] = new Ponto(); // OK
vetor[1] = 15; // Errado!!
Soluo: colocar os tipos dentro de wrappers
vetor[1] = new Integer(15);
Construtores aceitam literais ou Strings
H mtodos para realizar converses entre tipos e de
tipos para Strings e vice-versa
Padro de projeto: Adapter pattern
18
Classes empacotadoras

Void Boolean Number Character

Byte Short Integer Long Float Double

Criao e converso
Integer n = new Integer(15); Mais
Integer m = Integer.valueOf(15); eficiente
int q = n.intValue();
Para converso de String em tipos primitivos
int i = Integer.parseInt("15");
double i = Double.parseDouble("15.9");
boolean b =
(new Boolean("true")).booleanValue();
19
Controle e acesso ao sistema

Classe System d acesso a objetos do sistema


operacional
System.out - sada padro (java.io.PrintStream)
System.err - sada padro de erro (java.io.PrintStream)
System.in - entrada padro (java.io.InputStream)
Runtime e Process permitem controlar processos
externos (processos do S.O.)
Runtime r = System.getRuntime();
Process p =
r.exec("c:\program~1\micros~1\msie.exe");
Thread e Runnable lidam com processos internos
(processos da aplicao - threads)

20
Excees

Classes descendentes de java.lang.Throwable


representam situaes de erro
Erros graves irrecuperveis (descendentes da classe
java.lang.Error)
Excees de tempo de execuo (descendentes da classe
java.lang.Exception)
So usadas em blocos try-catch
Sero tratadas em captulo a parte
So classes, portanto...
... podem ser estendidas
... podem ser usadas para criar objetos via construtor
... podem ter mtodos chamados

21
Identificao em tempo de execuo
A classe Class contm mtodos que permitem enxergar a
interface pblica de uma classe
Saber quais mtodos existem para serem chamados
Saber quais os parmetros e tipos dos parmetros dos mtodos
Saber quais os construtores e campos pblicos
Como obter um objeto class (ex: classe MinhaClasse):
Class cobj = instancia.getClass();// Quando no se sabe a classe
Class cobj = MinhaClasse.class; // Quando no se tem instncia
Com essas informaes, possvel carregar uma classe
compilada, em tempo de execuo, e us-la
H mtodos para carregar uma classe pelo nome, passado como String
( Class cobj = Class.forName(); )
H mtodos ( cobj.newInstance(); ) para criar objetos a partir
de objeto Class obtido a partir do nome da classe
Reflection API!
22
Outros pacotes

Outros pacotes mais importantes da API Java 2 sero


explorados em aulas futuras
Use a documentao e experimente utilizar classes
de algum pacote de seu interesse
Sugestes
java.text: descubra como formatar texto para impresso
(por exemplo, 2 decimais e 3 dgitos fracionrios)
java.util: descubra como usar datas com Calendar,
GregorianCalendar e Date. Use as classes de java.text
para formatar as datas corretamente
java.io: descubra como abrir um arquivo
java.sql: descubra como conectar-se a um banco
23
java.util.Date
Date representa uma data genrica representada pela
contagem de milissegundos desde 1/1/1970.
No representa uma data de calendrio (para isto existe
java.util.Calendar - pesquise da documentao!)
No representa data ou hora do calendrio ocidental (para
isto existe java.util.GregorianCalendar)
Use Date para obter o momento atual
Date agora = new Date();
Ou para criar momentos com base na contagem de
milissegundos
Date ontem =
new Date(agora.getTime() - 86400000);
Date intervalo =
agora.getTime() - inicio.getTime();
24
Exerccios

1. Implemente os seguintes mtodos para Circulo e


Point:
hashCode()
clone()
2. Crie um vetor de Object com 5 elementos e inclua
dentro dele um inteiro, um char, um double, um
Ponto e uma Data
Depois escreva cdigo recuperando cada valor original
3. Teste os objetos criando cpias com clone() e
imprimindo o hashCode()
hashCode() na verdade, ter maior utilidade quando
usado dentro de HashMaps (captulo sobre colees)
25
Pacotes: import

Um pacote uma coleo de classes e interfaces


Java, agrupadas
O pacote faz parte do nome da classe: Uma classe
NovaYork do pacote simulador.cidades pode ser usada por
outra classe (de pacote diferente) apenas se for usado o
nome completo simulador.cidades.NovaYork
Toda classe pertence a um pacote: Se a classe no tiver
declarao package, ela pertence ao pacote default, que,
durante a execuo, corresponde raiz do Classpath.
import, pode ser usado, para compartilhar os
espaos de nomes de pacotes diferentes (assim, no
ser preciso usar nomes completos)
26
Classpath
O Classpath uma propriedade do sistema que contm as
localidades onde o JRE ir procurar classes. Consiste de
1. JARs nativos do JRE (API Java 2)
2. Extenses do JRE (subdiretrios $JAVA_HOME/jre/lib/classes e
$JAVA_HOME/jre/lib/ext)
3. Lista de caminhos definidos na varivel de ambiente CLASSPATH
e/ou na opo de linha de comando -classpath (-cp) da aplicao java.
A ordem acima importante
Havendo mais de uma classe com mesmo pacote/Nome somente a
primeira classe encontrada usada. Outras so ignoradas
H risco de conflitos. API nova sendo carregada depois de antiga pode
resultar em classes novas chamando classes antigas!
A ordem dos caminhos na varivel CLASSPATH (ou opo -cp) tambm
significativa.

27
Varivel CLASSPATH e -cp
Em uma instalao tpica, CLASSPATH contm apenas "."
Pacotes iniciados no diretrio atual (onde o interpretador java
executado) so encontrados (podem ter suas classes importadas)
Classes localizadas no diretrio atual so encontradas.
Geralmente usada para definir caminhos para uma aplicao
Os caminhos podem ser diretrios, arquivos ZIP ou JARs
Pode acrescentar novos caminhos mas no pode remover caminhos do
Classpath do JRE (bsico e extenses)
A opo -cp (-classpath) substitui as definies em CLASSPATH
Exemplo de definio de CLASSPATH
no DOS/Windows
set CLASSPATH=extras.jar;.;c:\progs\java
java -cp %CLASSPATH%;c:\util\lib\jsw.zip gui.Programa
no Unix (sh, bash)
CLASSPATH=extras.jar:.:/home/mydir/java
export CLASSPATH
java -classpath importante.jar:$CLASSPATH Programa
28
Classpath do JRE
Colocar JARs no subdiretrio ext ou classes e pacotes no
diretrio classes automaticamente os inclui no Classpath para
todas as aplicaes da JVM
Carregados antes das variveis CLASSPATH e -cp
Evite usar: pode provocar conflitos. Coloque nesses diretrios apenas os
JARs e classes usados em todas suas aplicaes
Exemplo: suponha que o Classpath seja
Classpath JRE: %JAVA_HOME%\jre\lib\rt.jar;
Classpath Extenso JRE: %JAVA_HOME%\jre\lib\ext\z.jar
Varivel de ambiente CLASSPATH: .;c:\programas;
e que uma classe, localizada em c:\exercicio seja executada. Se
esta classe usar a classe arte.fr.Monet o sistema ir procur-la
em
1. %JAVA_HOME%\jre\lib\rt.jar\arte\fr\Monet.class
2. %JAVA_HOME%\jre\lib\ext\z.jar\arte\fr\Monet.class
3. c:\exerccio\arte\fr\Monet.class
4. c:\programas\arte\fr\Monet.class
29
Como criar e usar um pacote
Para criar um pacote preciso
1. Declarar o nome do pacote em cada unidade de
compilao
2. Guardar a classe compilada em uma localidade (caminho)
compatvel com o pacote declarado
O "caminho de pontos" de um pacote, por exemplo,
simulador.cidade.aeroporto corresponde a um caminho de
diretrios simulador/cidade/aeroporto
Para usar um pacote (usar suas classes) preciso
1. Colocar a raiz do pacote (pasta "simulador", por exemplo)
no Classpath
2. Importar as classes do pacote (ou usar suas classes pelo
nome completo): A instruo import opcional

30
Arquivos JAR
Geralmente, aplicaes Java so distribudas em
arquivos JAR
So extenses do formato ZIP
armazenam pacotes e preservam a hierarquia de diretrios
Para usar um JAR, preciso inclu-lo no Classpath
via CLASSPATH no contexto de execuo da aplicao, ou
via parmetro -classpath (-cp) do interpretador Java, ou
copiando-o para $JAVA_HOME/jre/lib/ext
Para criar um JAR
jar cvf classes.jar C1.class C2.class xyz.gif abc.html
jar cf mais.jar -C raiz_onde_estao_pacotes/ .
Para abrir um JAR
jar xvf classes.jar
Para listar o contedo de um JAR
jar tvf classes.jar

31
Criao de bibliotecas

Uma biblioteca ou toolkit um conjunto de


classes base (para criar objetos ou extenso) ou
classes utilitrias (contendo mtodos teis)
Para distribuir uma biblioteca
Projete, crie e compila as classes (use pacotes)
Guarde em arquivo JAR
Para usar a biblioteca
Importe as classes da sua biblioteca em seus programas
Rode o interpretador tendo o JAR da sua biblioteca no
Classpath

32
Uma biblioteca (simples)

List.java
package com.acme.util;
public class List {
public List() {
System.out.println("com.acme.util.List");
}
}

Vector.java
package com.acme.util;
public class Vector {
public Vector() {
System.out.println("com.acme.util.Vector");
}
}

33
Onde armazenar

c:\programas\java\classes\

com

acme
Esta pasta deve estar no
CLASSPATH util

Vector.class List.class
pacote
com.acme.util

34
Ou em um JAR

utils.jar

com
O caminho at a localizao
do JAR deve estar no acme
CLASSPATH (pode ser
especificado no momento util
da execuo:
java -classpath
%CLASSPATH%;utils.jar
NomeProgExecutavel Vector.class List.class

JAR tambm pode ser jogado


no diretrio ext do JRE

35
Como usar a biblioteca
Programa que usa biblioteca pode estar em qualquer lugar
preciso que caminho at a biblioteca (pasta onde comea pacote ou
caminho at JAR) esteja definido no Classpath
CLASSPATH=%CLASSPATH%;c:\programas\java\classes
CLASSPATH=%CLASSPATH%;c:\jars\utils.jar

// Programa que usa a biblioteca


import com.acme.util.*;
public class LibTest {
public static void main(String[] args) {
Vector v = new Vector();
List m = new List();
}
}

Pode tambm usar


java -cp %CLASSPATH%;c:\...\java\classes LibTest
java -cp %CLASSPATH%;c:\jars\utils.jar LibTest
36
Como criar um executvel
Todo JAR possui um arquivo chamado Manifest.mf no
subdiretrio /META-INF.
Lista de pares Nome: atributo
Serve para incluir informaes sobre os arquivos do JAR, CLASSPATH,
classe Main, etc.
Se no for indicado um arquivo especfico, o sistema gerar um
Manifest.mf default (vazio)
Para tornar um JAR executvel, o Manifest.mf deve conter a
linha:
Main-Class: nome.da.Classe
Crie um arquivo de texto qualquer com a linha acima e monte
o JAR usando a opo -manifest:
jar cvfm arq.jar arquivo.txt -C raiz .
Para executar o JAR em linha de comando:
java -jar arq.jar
37
Colises entre classes

Se houver, no mesmo espao de nomes (Classpath


+ pacotes), duas classes com o mesmo nome, no
ser possvel usar os nomes das classes de maneira
abreviada
Exemplo: classes com.acme.util.List e java.util.List

import com.acme.util.*; import com.acme.util.*;


import java.util.*;
class Xyz { class Xyz {
// List itens; // COMPILA! List itens; //com.acme.util.List
// java.util.List lista; java.util.List lista;
} }

38
Exerccio
1. Copie a aplicao contendo os Pontos e Circulos
para um novo projeto
a) Declare o Ponto e o Circulo como pertencentes a um
pacote chamado graficos
b) Importe esses pacotes de TestaCirculos
c) Execute a aplicao
d) Empacote tudo em um JAR
e) Torne o JAR executvel (para usar java -jar arquivo.jar)
2. Acrescente o alvo jar no seu build.xml para que
seja possvel gerar o JAR e Manifest
automaticamente:
Veja exemplo no captulo 8!

39
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
40
Java 2 Standard Edition

Gerenciamento de
projetos com o
Apache Ant
Helder da Rocha (helder@acm.org) argonavis.com.br1
Sobre este mdulo

Este mdulo apresenta o Jakarta Ant - ferramenta


importante para gerenciar projetos
Qualquer aplicao Java com mais que meia dzia de
classes ou organizada em pacotes deve ser organizada
como um projeto
uma boa prtica manter scripts para automatizar
procedimentos de desenvolvimento (compilar, testar, criar
documentao, gerar JARs, etc.)
O material disponvel muito extenso para
tratamento detalhado neste curso
Abordagem ser superficial, mas use-o como referncia
durante o curso
2
Ant: o que ?

Ferramenta para construo de aplicaes


Implementada em Java
Baseada em roteiros XML
Extensvel (via scripts ou classes)
'padro' do mercado
Open Source (Grupo Apache, Projeto Jakarta)
Semelhante a make, porm
Mais simples e estruturada (XML)
Mais adequada a tarefas comuns em projetos Java
Independente de plataforma

3
Para que serve?

Para montar praticamente qualquer aplicao Java


que consista de mais que meia dzia de classes;
Aplicaes
distribudas em pacotes
que requerem a definio de classpaths locais, e precisam
vincular cdigo a bibliotecas (JARs)
cuja criao/instalao depende de mais que uma simples
chamada ao javac. Ex: RMI, CORBA, EJB, servlets, JSP,...
Para automatizar processos frequentes
Javadoc, XSLT, implantao de servios Web e J2EE
(deployment), CVS, criao de JARs, testes, FTP, email
4
Como funciona?
Ant executa roteiros escritos em XML: 'buildfiles'
Cada projeto do Ant possui um buildfile
subprojetos podem ter, opcionalmente, buildfiles
adicionais chamados durante a execuo do primeiro
Cada projeto possui uma coleo de alvos
Cada alvo consiste de uma seqncia de tarefas
Exemplos de execuo
ant
procura build.xml no diretrio atual e roda alvo default
ant -buildfile outro.xml
executa alvo default de arquivo outro.xml
ant compilar
roda alvo 'compilar' e possveis dependncias em build.xml
5
Como funciona (2)

Ant
<xml>
<xml>
<xml> <cvs> CVS
<xml> *.java
build.xml
<javac> <javadoc>
subproj <ant>
<xml>
<xml>
*.class *.html
build.xml
*.java
<jar> <junit>
<javac>

<jar> Testes
*.class
docs.zip
app.jar
<ftp>
<copy> <mimemail>

6
Buildfile
O buildfile um arquivo XML: build.xml (default)
Principais elementos
<project default="alvo_default">
Elemento raiz (obrigatrio): define o projeto.
<target name="nome_do_alvo">
Coleo de tarefas a serem executadas em seqncia
Deve haver pelo menos um <target>
<property name="nome" value="valor">
pares nome/valor usados em atributos dos elementos do
build.xml da forma ${nome}
propriedades tambm podem ser definidas em linha de
comando (-Dnome=valor) ou lidas de arquivos externos
(atributo file)
tarefas (mais de 130) - dentro dos alvos.
<javac>, <jar>, <java>, <copy>, <mkdir>, ...
7
Buildfile (2)
<?xml version="1.0" encoding="iso-8859-1" ?>
<!-- Compila diversos arquivos .java --> Propriedades
<project default="compile" basedir=".">
<property name="src.dir" value="${basedir}/src" />
<property name="build.dir" value="build" />
<target name="init">
<echo> Criando diretrio </echo>
<mkdir dir="${build.dir}" />
</target>
Alvos
<target name="compile" depends="init"
description="Compila os arquivos-fonte">
<javac srcdir="${src.dir}" destdir="${build.dir}">
<classpath>
<pathelement location="${build.dir}" />
Tarefas </classpath>
</javac>
</target>
</project>
8
Exemplo

Executando buildfile da pgina anterior


C:\usr\palestra\antdemo> ant build.xml
Buildfile: build.xml src
argonavis

ANTES
init: util
[echo] Criando diretrio Tiracentos.java
[mkdir] Created dir: TiracentosTest.java
C:\usr\palestra\antdemo\build
build.xml
compile: src
[javac] Compiling 2 source files to argonavis
C:\usr\palestra\antdemo\build util
Tiracentos.java
BUILD SUCCESSFUL TiracentosTest.java
Total time: 4 seconds
build
C:\usr\palestra\antdemo>
argonavis

DEPOIS
util
Tiracentos.class
TiracentosTest.class

9
Propriedades
Podem ser definidas com <property>
<property name="app.nome" value="jmovie" />
Podem ser carregadas de um arquivo
<property file="c:/conf/arquivo.conf" />

app.ver=1.0
docs.dir=c:\docs\
codigo=15323 arquivo.conf

Podem ser passadas na linha de comando


c:\> ant -Dautor=Wilde
Para recuperar o valor, usa-se ${nome}
<jar destfile="${app.nome}-${app.ver}.jar"/>
<echo message="O autor ${autor}" />
<mkdir dir="build${codigo}" />
10
Propriedades especiais
<tstamp>: Grava um instante
A hora e data podem ser recuperados como propriedades
${TSTAMP} hhmm 1345
${DSTAMP} aaaammdd 20020525
${TODAY} dia mes ano 25 May 2002
Novas propriedades podem ser definidas, locale, etc.
Uso tpico: <tstamp/>
<property environment="env">: Propriedade de
onde se pode ler variveis de ambiente do sistema
Dependende de plataforma
<target name="init">
<property environment="env"/>
<property name="j2ee.home"
value="env.J2EE_HOME" />
</target>
11
O que se pode fazer com Ant?
Compilar. Expandir, copiar, instalar
<javac>, <csc> <copy>, <delete>, <mkdir>,
Gerar documentao <unjar>, <unwar>, <untar>,
<unzip>
<javadoc>, <junitreport>,
<style>, <stylebook> Acesso remoto
<ftp>, <telnet>, <cvs>,
Executar programas <mail>, <mimemail>
<java>, <apply>, <exec>
<ant>, <sql> Montar componentes
<ejbc>, <ejb-jar>, <rmic>
Testar unidades de cdigo
<junit> Criar novas tarefas
<taskdef>
Empacotar e comprimir
<jar>, <zip>, <tar>, Executar roteiros e sons
<war>, <ear>, <cab> <script>, <sound>

12
Compilao e JAR
<javac>: Chama o compilador Java
<javac srcdir="dirfontes" destdir="dirbuild" >
<classpath>
<pathelement path="arquivo.jar" />
<pathelement path="/arquivos" />
</classpath>
<classpath idref="extra" />
</javac>

<jar>: Monta um JAR


<jar destfile="bin/programa.jar">
<manifest>
<attribute name="Main-class"
value="exemplo.main.Exec"/>
</manifest>
<fileset dir="${build.dir}"/>
</jar> 13
Tarefas do sistema de arquivos

<mkdir>: cria diretrios


<mkdir dir="diretorio" />
<copy>: copia arquivos
<copy todir="dir" file="arquivo" />
<copy todir="dir">
<fileset dir="fonte"
includes="*.txt" />
</copy>
<delete>: apaga arquivos
<delete file="arquivo />
<delete dir="diretorio"/>
14
Gerao de documentao

<javadoc>: Gera documentao do cdigo-fonte.


Alvo abaixo gera documentao e exclui classes que
contm 'Test.java'
<target name="generate-docs">
<mkdir dir="docs/api"/>
<copy todir="tmp">
<fileset dir="${src.dir}">
<include name="**/*.java" />
<exclude name="**/**Test.java" />
</fileset>
</copy>
<javadoc destdir="docs/api"
packagenames="argonavis.*"
sourcepath="tmp" />
<delete dir="tmp" />
</target>
15
Tipos de dados: arquivos e diretrios

<fileset>: rvore de arquivos e diretrios


Contedo do conjunto pode ser reduzido utilizando
elementos <include> e <exclude>
Usando dentro de tarefas que manipulam com arquivos e
diretrios como <copy>, <zip>, etc.
<copy todir="${build.dir}/META-INF">
<fileset dir="${xml.dir}" includes="ejb-jar.xml"/>
<fileset dir="${xml.dir}/jboss">
<include name="*.xml" />
<exclude name="*-orig.xml" />
</fileset>
</copy>

<dirset>: rvore de diretrios


No inclui arquivos individuais
16
Tipos de dados: colees
<patternset>: representa coleo de padres
<patternset id="project.jars" >
<include name="**/*.jar"/>
<exclude name="**/*-test.jar"/>
</patternset>

<path>: representa uma coleo de caminhos


Associa um ID a grupo de arquivos ou caminhos
<path id="server.path">
<pathelement path="${j2ee.home}/lib/locale" />
<fileset dir="${j2ee.home}/lib">
<patternset refid="project.jars" />
</fileset>
</path>
<target name="compile" depends="init">
<javac destdir="${build.dir}" srcdir="${src.dir}">
<classpath refid="server.path" />
</javac>
</target>
17
Tipos de dados: File Mapper

<mapper>: altera nomes de arquivos durante


cpias ou transformaes
Seis tipos: identity, flatten, merge, regexp, glob, package
build.xml
build.xml
src
<mapper src
argonavis
type="flatten" /> Tiracentos.java
util
TiracentosTest.java
Tiracentos.java
TiracentosTest.java
<mapper
<mapper build.xml
type="glob"
type="package" src
from="*.java"
from="*.java" argonavis
to="*.java.bak"/>
to="*.txt"/> util
Tiracentos.java.bak
build.xml TiracentosTest.java.bak
src
argonavis.util.Tiracentos.txt
argonavis.util.TiracentosTest.txt
18
Tipos de dados: seletores
Permitem a seleo dos elementos de um fileset usando
critrios alm dos definidos por <include> e <exclude>
Sete seletores bsicos (pode-se criar novos)
<contains> - Seleciona arquivos que contm determinado texto
<date> - Arquivos modificados antes ou depois de certa data
<depend> - Seleciona arquivos cuja data de modificao seja
posterior a arquivos localizados em outro lugar
<depth> - Seleciona arquivos encontrados at certa profundidade
de uma rvore de diretrios
<filename> - Equivalente ao include e exclude
<present> - Seleciona arquivo com base na sua (in)existncia
<size> - Seleciona com base no tamanho em bytes
Exemplo: Seleciona arquivos do <fileset dir="fonte">
diretrio "fonte" que tambm <present targetdir="destino"/>
esto presentes em "destino" </fileset>
19
Tipos de dados: filtros
<filter> e <filterset>: Permite a substituio de
padres em arquivos durante a execuo de uma tarefa
Caractere default: @
Exemplo: a tarefa abaixo ir substituir todas as ocorrncias de
@javahome@ por c:\j2sdk1.4.0 nos arquivos copiados
<copy todir="${dest.dir}">
<fileset dir="${src.dir}"/>
<filterset>
<filter token="javahome" value="c:\j2sdk1.4.0"/>
</filterset>
</copy>

Pares token=valor podem ser carregados de arquivo:


<filterset>
<filtersfile file="build.properties" />
</filterset>
Substituio pode ser feita tambm sem tokens com <replace> 20
Execuo de aplicaes
<java>: roda o interpretador Java
<target name="runrmiclient">
<java classname="hello.rmi.HelloClient" fork="true">
<jvmarg value="-Djava.security.policy=rmi.policy"/>
<arg name="host" value="${remote.host}" />
<classpath refid="app.path" />
</java>
</target>
<exec>: executa um comando do sistema
<target name="orbd">
<exec executable="${java.home}\bin\orbd">
<arg line="-ORBInitialHost ${nameserver.host}"/>
</exec>
</target>

<apply>: semelhante a <exec> mas usado em


executveis que operam sobre outros arquivos 21
Tarefas de rede
<ftp>: Realiza a comunicao com um servidor
FTP remoto para upload ou download de arquivos
Tarefa opcional que requer NetComponents.jar
(http://www.savarese.org)
<target name="remote.jboss.deploy" depends="dist">
<ftp server="${ftp.host}" port="${ftp.port}"
remotedir="/jboss/server/default/deploy"
userid="admin" password="jboss"
depends="yes" binary="yes">
<fileset dir="${basedir}">
<include name="*.war"/>
<include name="*.ear"/>
<include name="*.jar"/>
</fileset>
</ftp>
</target> 22
Efeitos sonoros

<sound>: define um par de arquivos de som para


soar no sucesso ou falha de um projeto
Tarefa opcional que requer Java Media Framework
Exemplo:
No exemplo abaixo, o som frog.wav ser tocado quando
o build terminar sem erros fatais. Bark.wav tocar se
houver algum erro que interrompa o processo:
<target name="init">
<sound>
<success source="C:/Media/frog.wav"/>
<fail source="C:/Media/Bark.wav"/>
</sound>
</target>
23
Ant programvel

H duas formas de estender o Ant com novas funes


Implementar roteiros usando JavaScript
Criar novas tarefas reutilizveis
A tarefa <script> permite embutir JavaScript em um
buildfile. Pode-se
realizar operaes aritmticas e booleanas
utilizar estruturas como if/else, for, foreach e while
manipular com os elementos do buildfile usando DOM
A tarefa <taskdef> permite definir novas tarefas
tarefa deve ser implementada em Java e estender Task
mtodo execute() contm cdigo de ao da tarefa
cada atributo corresponde a um mtodo setXXX()
24
Integrao com outras aplicaes
Ant provoca vrios eventos que podem ser
capturados por outras aplicaes
til para implementar integrao, enviar notificaes por
email, gravar logs, etc.
Eventos
Build iniciou/terminou
Alvo iniciou/terminou
Tarefa iniciou/terminou
Mensagens logadas
Vrios listeners e loggers pr-definidos
Pode-se usar ou estender classe existente.
Para gravar processo (build) em XML:
ant -listener org.apache.tools.ant.XmlLogger
25
Integrao com editores e IDEs

Produtos que integram com Ant e oferecem interface


grfica e eventos para buildfiles:
Antidote: GUI para Ant (do projeto Jakarta)
http://cvs.apache.org/viewcvs/jakarta-ant-antidote/
JBuilder (AntRunner plug-in)
http://www.dieter-bogdoll.de/java/AntRunner/
NetBeans e Fort for Java
http://ant.netbeans.org/
Visual Age for Java (integrao direta)
JEdit (AntFarm plug-in)
http://www.jedit.org
Jext (AntWork plug-in)
ftp://jext.sourceforge.net/pub/jext/plugins/AntWork.zip

26
Como gerenciar projetos com o Ant

Crie um diretrio para armazenar seu projeto. Nele


guarde o seu build.xml
Use um arquivo build.properties para definir propriedades
exclusivas do seu projeto (assim voc consegue reutilizar o
mesmo build.xml em outros projetos)
Dentro desse diretrio, crie alguns subdiretrios
src/ Para armazenar o cdigo-fonte
lib/ Opcional. Para guardar os JARs de APIs usadas
doc/ Opcional. Para guardar a documentao gerada
O seu Ant script deve ainda criar
build/ Ou classes/. Onde estar o cdigo compilado
dist/ Ou jars/ ou release/. Onde estaro os JARs criados
27
Alvos bsicos do build.xml
Voc tambm deve padronizar os nomes dos alvos dos
seus build.xml. Alguns alvos tpicos so
init Para criar dietrios, inicializar o ambiente, etc.
clean Para fazer a faxina, remover diretrios gerados, etc.
compile Para compilar
build Para construir a aplicao, integrar, criar JARs
run Para executar um cliente da aplicao
test Para executar os testes da aplicao
Voc pode usar outros nomes, mas mantenha um padro
Tambm pode criar uma nomenclatura que destaque
alvos principais, usando maisculas. Ex:
CLEAN, que chama clean-this, clean-that, undeploy, etc.
BUILD, que chama build-depend, build-client, build-server
28
Exemplo de projeto
<project default="compile" name="MiniEd"> build.xml
<property file="build.properties"/>
<target name="init">
<mkdir dir="${build.dir}"/>
<mkdir dir="${dist.dir}"/> Estrutura dos
</target>
<target name="clean"> ... </target>
arquivos (antes
<target name="compile" de executar o Ant)
depends="init"> ... </target>
<target name="build"
depends="compile">...</target>
<target name="javadoc"
depends="build"> ... </target>
<target name="run"
depends="build"> ... </target>
</project>

# Nome da aplicao
app.name=minied
# Nomes dos diretrios
src.dir=src
docs.dir=docs
build.dir=classes
dist.dir=jars
# Nome da classe executvel
app.main.class=com.javamagazine.minied.MiniEditor
root.package=com build.properties 29
Concluses

O Ant uma ferramenta indispensvel em qualquer


projeto de desenvolvimento Java
Permite automatizar todo o processo de desenvolvimento
Facilita a montagem da aplicao por outras pessoas
Ajuda em diversas tarefas essenciais do desenvolvimento
como compilar, rodar, testar, gerar JavaDocs, etc.
Independe de um IDE comercial (mas pode ser
facilmente integrado a um)
Use o Ant em todos os seus projetos
Crie sempre um projeto e um buildfile, por mais simples
que seja a sua aplicao
Escreva buildfiles que possam ser reutilizados

30
Exerccios

1. Crie um buildfile para cada projeto que voc


montar nos prximos mdulos
Use o template bsico de build.xml mostrado neste
captulo
Configure-o e personalize-o para incluir os alvos e tarefas
especficas do seu projeto
Inclua alvos com tarefas de javadoc, jar e execuo
2.Pratique com os exemplos apresentados
Execute os buildfiles e use o cdigo como exemplo
Dica: consulte a documentao do Ant
Muito bem estruturada
Contm exemplos de todos os tags
31
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
32
Java 2 Standard Edition

Reuso com
Herana e
Composio
Helder da Rocha
www.argonavis.com.br
1
Como aumentar as chances de reuso

Separar as partes que podem mudar das partes que


no mudam. Exemplo: bibliotecas
Programador cliente deve poder usar o cdigo sem a
preocupao de ter que reescrever seu cdigo caso surjam
verses futuras
Programador de biblioteca deve ter a liberdade de fazer
melhoramentos sabendo que o cliente no ter que
modificar o seu cdigo
Em Java: esconder do cliente
Mtodos que no fazem parte da interface de uso
Mtodos que no fazem parte da interface de herana
Todos os atributos de dados

2
Reuso

Quando voc precisa de uma classe, voc


pode
Usar uma classe que faz exatamente o que voc
deseja fazer
Escrever uma classe do zero
Reutilizar uma classe existente com composio
Reutilizar uma classe existente ou estrutura de
classes com herana

3
Composio vs. Herana

Composio pura Herana pura


Forma
desenha()
Carro apaga()
Motor

Roda[] Circulo Quadrado Triangulo


desenha() desenha() desenha()
Porta[]
apaga() apaga() apaga()

Util
Ao reutilizar
um()
uma classe dois()
a composio Extenso
deve ser sua MaisUtil
escolha preferencial tres()
quatro()
4
Composio em Java

class NovaClasse {
NovaClasse Um um = new Um();
Dois dois = new Dois();
Instncia Tres tres = new Tres();
de Objeto 1 }

Instncia
de Objeto 2 Objetos podem ser
inicializados no construtor
Instncia
de Objeto 3 Flexibilidade
Pode trocar objetos durante a
execuo!
Relacionamento
"TEM UM"

5
Herana em Java

interface original
Herana pura Forma
automaticamente duplicada
(sem extenso) desenha() nas classes derivadas
apaga()

Campos de dados
Circulo Quadrado Triangulo
da classe base tambm
desenha() desenha() desenha() so duplicados
apaga() apaga()

Se membro derivado no for redefinido, implementao original usada


class Forma { class Circulo extends Forma {
public void desenha() { public void desenha() {
/*...*/ /* nova implementao */
} }
public void apaga() { }
/*...*/
} Assinatura do mtodo tem que ser igual
} ou sobreposio no ocorrer (poder
ocorrer sobrecarga no desejada)
6
Composio e Herana

Composio e herana no so mutuamente


exclusivas
As tcnicas podem ser usadas em conjunto para
obter os melhores resultados de cada uma
No desenvolvimento, composio a tcnica
predominante
Herana geralmente ocorre mais no design de
tipos

7
Quando usar?
Composio ou herana?
1. Identifique os componentes do objeto, suas partes
Essas partes devem ser agregadas ao objeto via
composio ( parte de)
2. Classifique seu objeto e tente encontrar uma
semelhana de identidade com classes existentes
Herana s deve ser usada se voc puder comparar seu
objeto A com outro B dizendo, que A " UM tipo de..." B.
Tipicamente, herana s deve ser usada quando voc
estiver construindo uma famlia de tipos (relacionados
entre si)

8
Modificadores relacionados

No projeto de uma classe, preciso definir duas interfaces


Interface para uso de classes via composio
Interface para uso de classes via herana
A palavra protected deve ser usada para declarar os
mtodos, construtores e variveis que destinam-se
interface de herana
Elementos usados em interface para composio devem ser
declarados public
A palavra final usada para limitar o uso das classes,
variveis e mtodos quando existe a possibilidade de haver
herana: impede que implementaes ou valores sejam
alterados

9
Constantes
Para declarar uma constante, defina-a com um modificador
final
final XIS = 0;
public static final IPSILON = 12;
Qualquer varivel declarada como final tem que ser
inicializada no momento da declarao
Exceo: argumentos constantes em mtodos - valores no mudam
dentro do mtodo (uso em classes internas)
Uma constante de tipo primitivo no pode receber outro valor
Uma constante de referncia no pode ser atribuda a um
novo objeto
O objeto, porm, no constante (apenas a referncia o ). Os
atributos do objeto podem ser alterados

10
Mtodos finais

Mtodo declarado como final no pode ser


sobreposto
Motivos para declarar um mtodo final
Design: a verso final (o mtodo est "pronto")
Eficincia: compilador pode embutir o cdigo do mtodo
no lugar da chamada e evitar realizar chamadas em
tempo de execuo: pode limitar o uso de sua classe
Procedimentos chamados de dentro de construtores:
quaisquer mtodos chamados de dentro de construtores
devem ser final.
Mtodos declarados como private so
implicitamente final
11
Classes finais

A classe tambm pode ser declarada final


public final class Definitiva { ... }
Se uma classe no-final tiver todos os seus mtodos
declarados como final, possvel herdar os mtodos,
acrescentar novos, mas no sobrepor
Se uma classe for declarada como final
No possvel estender a classe (a classe nunca poder
aparecer aps a clusula extends de outra classe)
Todos os mtodos da classe so finais
til em classes que contm funes utilitrias e
constantes apenas (ex: classe Math)
12
Modificadores de acesso

Em ordem crescente de acesso


private
"package-private"
modificador ausente
protected
public

13
public

Acessvel
na prpria classe
nas subclasses
Classe
nas classes do mesmo pacote +campoPublico: tipo
em todas as outras classes +metodoPublico: tipo

Use para
construtores e mtodos que fazem parte da interface do
objeto
mtodos estticos utilitrios
constantes (estticas) utilitrias
Evite usar em
construtores e mtodos de uso restrito
campos de dados de objetos
14
protected

Acessvel
na prpria classe
nas subclasses
Classe
nas classes do mesmo pacote #campoProt: tipo
Use para #metodoProt: tipo

construtores que s devem ser chamados pelas subclasses


(atravs de super())
mtodos que s devem ser usados se sobrepostos
Evite usar em
construtores em classes que no criam objetos
mtodos com restries sobreposio
campos de dados de objetos

15
package-private
Modificador ausente
se no houver outro modificador de acesso, o acesso
"package-private". Classe
Acessvel ~campoAmigo: tipo
~metodoAmigo: tipo
na prpria classe
nas classes e subclasses do mesmo pacote
Use para
construtores e mtodos que s devem ser chamados pelas
classes e subclasses do pacote
constantes estticas teis apenas dentro do pacote
Evite usar em
construtores em classes que no criam objetos
mtodos cujo uso externo seja limitado ou indesejvel
campos de dados de objetos
16
private

Acessvel
na prpria classe (nos mtodos, funes estticas, blocos
estticos e construtores)
Use para
construtores de classes que s devem criar um nmero
limitado de objetos
mtodos que no fazem parte da interface do objeto
funes estticas que s tm utilidade dentro da classe
variveis e constantes estticas que no tm utilidade ou
no podem ser modificadas fora da classe
campos de dados de objetos
Classe
-campoPrivate: tipo
-metodoPrivate: tipo

17
Observaes sobre acesso

Classes e interfaces (exceto classes internas)


S podem ser package-private ou public
Construtores
Se private, criao de objetos depende da classe
Se protected, apenas subclasses (alm da prpria classe e
classes do pacote) podem criar objetos
Vriveis e constantes
O acesso afeta sempre a leitura e alterao. Efeitos
"read-only" e "write-only" s podem ser obtidos por meio
de mtodos
Variveis locais
Usar modificadores de acesso dentro dos mtodos ilegal
e no faz sentido pois variveis locais s tm escopo local
18
Sobreposio

Mtodos sobrepostos nunca podem ter menos


acesso que os mtodos originais
Se mtodo original for public, novas verses tm que ser
public
Se mtodo original for protected, novas verses podem
ser protected ou public
Se mtodo original no tiver modificador de acesso (
"package-private"), novas verses podem ser declaradas
sem modificador de acesso, com modificador protected
ou public
Se mtodo original for private, ele no ser visvel da
subclasse e portanto, jamais poder ser estendido.

19
Exemplo

20
Mais sobre 'static' d1 #
x 05
d2 #
y 45
Variveis declaradas como 'static' x 10

existem antes de existir qualquer


objeto da classe class Duas {
S existe uma varivel static, int x;
static int y;
independente do nmero de objetos }
criado com a classe
Podem ser chamadas externamente pelo
(...)
nome da classe Duas d1 = new Duas();
Color.red, System.out, Duas d2 = new Duas();
BorderLayout.NORTH d1.x = 5;
Podem tambm ser chamadas d2.x = 10;
//Duas.x = 60; // ilegal!
atravs da referncia de um objeto d1.y = 15;
(evite usar este mtodo) d2.y = 30; mesma
Duas.y = 45; varivel!
Classe (...)
campoStatic: tipo
metodoStatic: tipo
Use esta notao
apenas 21
Mtodos static
Mtodos static nunca so sobrepostos O cdigo a seguir
Mtodo static de assinatura igual na Alfa pai = new Alfa ();
subclasse apenas "oculta" original pai.metodo();

No h polimorfismo: mtodo est Beta filho1 = new Beta ();


sempre associado ao tipo da classe filho1.metodo();

(e no instncia) Alfa filho2 = new Beta ();


Exemplo: considere as classes abaixo filho2.metodo();

class Alfa {
ir imprimir:
static void metodo() { Alfa! Alfa!
}
System.out.println("Alfa!");
Beta! e no... Beta!
} Alfa! Beta!

class Beta extends Alfa { como ocorreria se os mtodos


static void metodo() {
System.out.println("Beta!");
fossem de instncia
} No chame mtodos static
} via referncias! Use sempre:
Classe.metodo()
22
Classe que s permite
um objeto (Singleton pattern)
public class Highlander {
private Highlander() {} Esta classe
private static Highlander instancia; implementa o
public static Highlander criarInstancia() {
padro de projeto
if (instancia == null)
instancia = new Highlander(); Singleton
}
return instancia;
}
}
public class Fabrica {
public static void main(String[] args) {
Highlander h1, h2, h3;
//h1 = new Highlander(); // nao compila!
h2 = Highlander.criarInstancia();
h3 = Highlander.criarInstancia();
Esta classe if (h2 == h3) {
cria apenas System.out.println("h2 e h3 so mesmo objeto!");
um objeto }
Highlander }
}
23
Exerccios
1. Implemente a seguinte hierarquia de classes
biblioteca
fachada Agente Assunto
+codigo: int +codigo: String
Biblioteca +assunto: String
+addAutor(Autor)
Deixe +addEditor(Editor) Publicacao Autor
mtodos +findAutor(int) +codigo: int
vazios +nome: String
+findEditor(int) +titulo: String +sobrenome: String
+addPub(Publicacao) +editor: Editor
Esta +removePub(int) +data: Date
classe Editor
+removeAgente(int)
um +nome: String
+findPub(int)
Singleton +findPubs(String)

Artigo Livro Revista


autores: Autor[] assunto: Assunto artigos: Artigo[]
palavrasChave: String[] autores: Autor[]

a) Os dados representam propriedades (pares get/set) e no


campos de dados (que devem ser private)
b) Implemente equals(), toString() e hashCode() e construtores em
cada classe biblioteca.* 24
Exerccios (2)

2. Implemente a classe abaixo


biblioteca
io
RepositorioDados
-assuntos: HashMap
-agentes: HashMap Inicie
-pubs: HashMap ... previamente
+addPub(Publicacao) os assuntos
+addAutor(Autor) +removePub(String) (veja slide
+addEditor(Editor) +removeAgente(int) seguinte)
+findAutor(int) +findPub(int)
+findEditor(int) +findPubs(String)

-initAssuntos()

3. Implemente os mtodos de Biblioteca para que chamem os mtodos de


RepositorioDados.
4. Coloque tudo em um JAR.
5. Escreva uma classe que contenha um main(), importe os pacotes da
biblioteca, crie uma Biblioteca e acrescente autores, livros, artigos,
revistas, e imprima os resultados. 25
Apndice: RepositorioDados (trecho)
private java.util.HashMap assuntos =
new java.util.HashMap();

public void initAssuntos() {


assuntos = new java.util.HashMap(10);
assuntos.put("000", "Generalidades");
assuntos.put("100", "Filosofia");
assuntos.put("200", "Religio");
assuntos.put("300", "Cincias Sociais");
assuntos.put("400", "Lnguas");
assuntos.put("500", "Cincias Naturais");
assuntos.put("600", "Cincias Aplicadas");
assuntos.put("700", "Artes");
assuntos.put("800", "Literatura");
assuntos.put("900", "Histria");
}
26
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
27
Java 2 Standard Edition

Interfaces e
polimorfismo
Helder da Rocha (helder@acm.org) argonavis.com.br1
O que polimorfismo

Polimorfismo (poli=muitos, morfo=forma) uma


caracterstica essencial de linguagens orientadas a
objeto
Como funciona?
Um objeto que faz papel de interface serve de
intermedirio fixo entre o programa-cliente e os objetos
que iro executar as mensagens recebidas
O programa-cliente no precisa saber da existncia dos
outros objetos
Objetos podem ser substitudos sem que os programas
que usam a interface sejam afetados

2
Objetos substituveis

Polimorfismo significa que um objeto pode ser usado


no lugar de outro objeto
Uma interface
Usurio do objeto Mltiplas implementaes
enxerga somente esta interface

freia() Onibus
acelera() Veiculo
vira(1) freia() Jipe Subclasses
acelera() de Veiculo!
vira(direcao) Jegue (herdam
todos os
Aviao mtodos)
Por exemplo: objeto do tipo Manobrista
sabe usar comandos bsicos para controlar Usurio de Veiculo
Veiculo (no interessa a ele saber como ignora existncia desses
cada Veiculo diferente vai acelerar, frear objetos substituveis
ou mudar de direo). Se outro objeto tiver
a mesma interface, Manobrista saber us-lo
3
Programas extensveis
Novos objetos podem ser usados em programas que no
previam a sua existncia
Garantia que mtodos da interface existem nas classes novas
Objetos de novas classes podem ser criados e usados (programa pode
ser estendido durante a execuo)
...
Veiculo Jipe
freia() freia() LandRover
acelera() acelera()
vira(0) vira(direcao) AirBus LandRover

Concorde
Mesmo nome. Aviao
Implementaes Veiculo v1 = new Veiculo();
diferentes. Veiculo v2 = new Aviao();
Veiculo v3 = new Airbus();
v1.acelera(); // acelera Veiculo Concorde AirBus
v2.acelera(); // acelera Aviao
v3.acelera(); // acelera AirBus
4
Interface vs. implementao
Estabelece uma
Polimorfismo permite separar a interface comum
interface da implementao
A classe base define a interface Veiculo
freia() {}
comum acelera() {}
No precisa dizer como isto vai ser feito vira(dir) {}
No diz: eu sei como frear um Carro ou
um nibus
Diz apenas que os mtodos existem, que
eles retornam determinados tipos de
dados e que requerem certos parmetros Onibus Carro
Diz: Veiculo pode acelerar, frear e virar freia() {} freia() {}
para uma direo, mas a direo deve ser acelera() {} acelera() {}
vira(dir) {} vira(dir) {}
fornecida
Implementaes
da interface
(dizem como fazer)
5
Como funciona

Suporte a polimorfismo depende do suporte ligao


tardia (late binding) de chamadas de funo
A referncia (interface) conhecida em tempo de
compilao mas o objeto a que ela aponta
(implementao) no
O objeto pode ser da mesma classe ou de uma subclasse
da referncia (garante que a TODA a interface est
implementada no objeto)
Uma nica referncia, pode ser ligada, durante a
execuo, a vrios objetos diferentes (a referncia
polimorfa: pode assumir muitas formas)

6
Ligao de chamadas de funo

Em tempo de compilao (early binding) - C!


no pode
chamada 1 funo() 0xff52 haver
endereo 0xff52 Cdigo polimorfismo
..
. fixo! da pois cdigo
funo est sempre
funo() ligado
chamada 2 0xff52 .. chamada da
. funo

Em tempo de execuo (late binding) - Java!


v.freia() 0xff52 existe
chamada 1 ??? Carro polimorfismo
.. mecanismo freia() pois cada
. que faz a chamada
ligao poder causar
v.freia()
0cff99 Onibus execuo de
chamada 2 ???
freia() cdigo
ligao entre diferente
dependem do referncia e objeto
objeto ao qual a durante a execuo
referncia atual aponta
7
Exemplo (1)
Manobrista manda
Considere a mensagens para
Veiculo
hierarquia de
classes ao lado Veiculo Manobrista
usa
freia() {...} estaciona
acelera() {...} (Veiculo v) {...}
vira(direcao) {...}

herdam interface
Herdam interface
mas sobrepem
Jegue implementao
LandRover
(cada objeto
executa o mtodo
freia() {...} freia() {...}
de forma particular)
acelera() {...} acelera() {...}
vira(direcao) {...} vira(direcao) {...}

8
Exemplo (2)
Trecho de programa que usa Manobrista: Manobrista usa a classe
Em tempo de execuo passa implementao de Veiculo (e ignora a existncia
Jegue e LandRover no lugar da implementao de tipos especficos de Veiculo
original de Veiculo como Jegue e LandRover
(aproveita apenas a interface de Veiculo)

Veiculo Manobrista
(...)
(...)
Manobrista
Manobrista mano
mano freia() {...}
== new
new Manobrista (); acelera() {...}
Manobrista ();
vira(direcao) {...}

Veiculo
Veiculo v1
v1 == new
new Jegue();
Jegue();
Veiculo
Veiculo v2
v2 == new
new LandRover();
LandRover(); herdam interface

mano.estaciona(v1);
mano.estaciona(v1); public void
estaciona (Veiculo v) {
mano.estaciona(v2);
mano.estaciona(v2); Jegue freia() {...}
LandRover ...
acelera() {...} v.freia();
(...)
(...) ...
vira(direcao) {...}
freia() {...} freia() {...} }
acelera() {...} acelera() {...}
vira(direcao) {...} vira(direcao) {...}
9
Detalhes (1) Manobrista
public void
estaciona (Veiculo v) {
...
Pilha (referncias) Heap (objetos) v.freia();
...
03b7 }
Veiculo v1 0xffa903b7 Jegue

freia() {/* J */}


acelera() {/* J */}
Veiculo v2 0xffa96f55 vira() {/* J */}
Qual freia() ser
6f55 LandRover executado quando
o trecho abaixo
null freia() {/* R */} for executado?
Veiculo v
acelera() {/* R */} (...)
vira() {/* R */} Veiculo v1 =
(referncia local
do mtodo estaciona) a22c new Jegue();
Veiculo
mano.estaciona(v1);

Endereos (hipotticos) freia() {/* V */} (...)


recebidos durante a acelera() {/* V */}
execuo (inaccessveis ao vira() {/* V */} ( mano do tipo
programador) ...
Manobrista )

10
Como funciona (3) Manobrista
public void
estaciona (Veiculo v) {
...
v.freia();
...
03b7 }
Veiculo v1 0xffa903b7 Jegue

freia() {/* J */} Na chamada abaixo,


acelera() {/* J */} Veiculo foi "substitudo"
Veiculo v2 0xffa96f55 vira() {/* J */} com Jegue.
A implementao
6f55 LandRover usada foi Jegue.freia()

Veiculo v 0xffa903b7 freia() {/* R */} (...)


acelera() {/* R */} Veiculo v1 =
vira() {/* R */} new Jegue();
mano.estaciona(v1);
Referncia de v1 foi a22c
Veiculo (...)
copiada para referncia
local v do mtodo freia() {/* V */} Veiculo v = v1
Manobrista.estaciona() acelera() {/* V */}
vira() {/* V */}
Nos trechos de cdigo Argumento do
...
mostrados, este objeto mtodo estaciona()
nunca chegou a ser criado 11
Conceitos abstratos
Como deve ser implementado freia() na classe Veiculo?
Faz sentido dizer como um veculo genrico deve frear?
Como garantir que cada tipo especfico de veculo redefina a
implementao de freia()?
O mtodo freia() um procedimento abstrato em Veiculo
Deve ser usada apenas a implementao das subclasses
E se no houver subclasses?
Como freia um Veiculo genrico?
Com que se parece um Veiculo generico?
Concluso: no h como construir objetos do tipo Veiculo
um conceito genrico demais
Mas timo como interface! Eu posso saber dirigir um Veiculo sem
precisar saber dos detalhes de sua implementao

12
Mtodos e classes abstratos

Procedimentos genricos que tm a finalidade de


servir apenas de interface so mtodos abstratos
declarados com o modificador abstract
no tm corpo {}. Declarao termina em ";"
public abstract void freia();
public abstract float velocidade();
Mtodos abstratos no podem ser usados, apenas
declarados
So usados atravs de uma subclasse que os implemente!

13
Classes abstratas

Uma classe pode ter mtodos concretos e abstratos


Se tiver um ou mais mtodo abstrato, classe no pode ser
usada para criar objetos e precisa ter declarao
abstract
public abstract class Veiculo { ... }
Objetos do tipo Veiculo no podem ser criados
Subclasses de Veiculo podem ser criados desde que
implementem TODOS os mtodos abstratos herdados
Se a implementao for parcial, a subclasse tambm ter
que ser declarada abstract

14
Classes abstratas (2)

Classes abstratas so criadas para serem estendidas


Podem ter
mtodos concretos (usados atravs das subclasses)
campos de dados (memria alocada na criao de
objetos pelas suas subclasses)
construtores (chamados via super() pelas subclasses)
Classes abstratas "puras"
no tm procedimentos no construtor (construtor vazio)
no tm campos de dados (a no ser constantes
estticas)
todos os mtodos so abstratos
Classes abstratas "puras" podem ser definidas como
"interfaces" para maior flexibilidade de uso
15
Template Method design pattern
Classe
Algoritmos resultantes
void concreto() { Algoritmo
Classe x =
new ClasseConcretaUm()
um() x.concreto()
Template
Method trs()

dois()
}

abstract void um(); Mtodos


abstract int dois();
abstratos
Classe x =
abstract Object tres();
new ClasseConcretaDois()
x.concreto()

ClasseConcretaUm ClasseConcretaDois

16
Template method: implementao
public abstract class Template {
public abstract String link(String texto, String url);
public String transform(String texto) { return texto; }

public String templateMethod() {


String msg = "Endereo: " + link("Empresa", "http://www.empresa.com");
return transform(msg);
}

public class HTMLData extends Template {


public String link(String texto, String url) {
return "<a href='"+url+"'>"+texto+"</a>";
}
public String transform(String texto) {
return texto.toLowerCase();
}
}

public class XMLData extends Template {


public String link(String texto, String url) {
return "<endereco xlink:href='"+url+"'>"+texto+"</endereco>";
}
} 17
Exerccio

1. Crie um novo projeto


Copie um build.xml genrico
2. Implemente os exemplos da aula:
Manobrista, Veiculo, Jegue e LandRover
a) Implemente os mtodos com instrues de impresso,
por exemplo:
public void freia() {
System.out.println("Chamou Jegue.freia()");
}
b) Faa com que os mtodos de Veiculo sejam abstratos e
refaa o exerccio

18
Upcasting

Tipos genricos (acima, na hierarquia) sempre


podem receber objetos de suas subclasses:
upcasting
Veiculo v = new Carro();
H garantia que subclasses possuem pelo menos os
mesmos mtodos que a classe
v s tem acesso "parte Veiculo" de Carro. Qualquer
extenso (mtodos definidos em Carro) no faz parte da
extenso e no pode ser usada pela referncia v.

19
Downcasting

Tipos especficos (abaixo, na hierarquia) no podem


receber explicitamente seus objetos que foram
declarados como referncias de suas superclasses:
downcasting
Carro c = v; // no compila!
O cdigo acima no compila, apesar de v apontar para
um Carro! preciso converter a referncia:
Carro c = (Carro) v;
E se v for Onibus e no Carro?

20
Upcasting e downcasting
Upcasting Downcasting
sobe a hierarquia mtodos visveis desce a hierarquia
no requer cast na referncia v requer operador de cast
Veiculo v = new Jegue(); Jegue j = (Jegue) v;

Veiculo
freia()
j freia()
acelera()
Veiculo
freia()
acelera() vira() acelera()
vira(direcao) corre() vira(direcao)
v morde()

Jegue LandRover Jegue LandRover


acelera() diesel() acelera() diesel()
vira(direcao) tracao(tipo) mtodos visveis corre() tracao(tipo)
corre(); na referncia j morde()

21
ClassCastException
O downcasting explcito sempre aceito pelo compilador se
o tipo da direita for superclasse do tipo da esquerda
Veiculo v = new Onibus();
Carro c = (Carro) v; // passa na compilao
Object, portanto, pode ser atribuda a qualquer tipo de referncia
Em tempo de execuo, a referncia ter que ser ligada ao
objeto
Incompatibilidade provocar ClassCastException
Para evitar a exceo, use instanceof
if (v instanceof Carro)
c = (Carro) v;

22
Herana Pura vs. Extenso
Herana pura: referncia tm Extenso: referncia apenas tem
acesso a todo o objeto acesso parte definida na
interface da classe base
Veiculo
freia() Veiculo
acelera()
Referncia Veiculo freia()
vira(direcao)
acelera()
no enxerga estes vira(direcao)
mtodos

Jegue LandRover
freia() freia() Jegue LandRover
acelera() acelera()
freia() freia()
vira(direcao) vira(direcao)
acelera() acelera()
vira(direcao) vira(direcao)
Veiculo v = new Jegue(); corre() diesel()
v.freia() // freia o Jegue morde() tracao(tipo)
v.acelera(); // acelera o Jegue
Veiculo v = new Jegue();
v.corre() // ERRADO!
v.acelera(); //OK
23
Ampliao da referncia
Uma referncia pode apontar para uma classe estendida, mas
s pode usar mtodos e campos de sua interface Object
Para ter acesso total ao objeto que estende a interface equals()
original, preciso usar referncia que conhea toda sua
interface pblica ERRADO: raio no faz parte da
Circulo
Exemplo interface de Object
raio
equals()
class
class Circulo
Circulo extends
extends Object
Object {{
public
public int int raio;
raio; class
class Circulo
Circulo extends
extends Object
Object {{
public
public boolean
boolean equals(Object
equals(Object obj)
obj) {{ public
public int int raio;
raio;
ifif (this.raio
(this.raio ==
== obj.raio)
obj.raio) public
public booleanboolean equals(Object
equals(Object obj)obj) {{
return
return true;
true; ifif (obj
(obj instanceof
instanceof Circulo)
Circulo) {{
verifica se obj Circulo
return
return false;
false; Circulo kk = = (Circulo)
(Circulo) obj;
obj;
}} realmente ifif (this.raio
(this.raio ==
== k.raio)
k.raio)
}} //// CDIGO
CDIGO ERRADO! ERRADO! um Circulo return
return true;
true;
}}
cria nova referncia return
return false; false;
que tem acesso a toda Como k Circulo
}}
a interface de Circulo possui raio
}}
24
Interfaces Java

Interface uma estrutura que representa uma classe


abstrata "pura" em Java
No tm atributos de dados (s pode ter constantes
estticas)
No tem construtor
Todos os mtodos so abstratos
No declarada como class, mas como interface
Interfaces Java servem para fornecer polimorfismo sem
herana
Uma classe pode "herdar" a interface (assinaturas dos
mtodos) de vrias interfaces Java, mas apenas de uma
classe
Interfaces, portanto, oferecem um tipo de herana mltipla
25
Herana mltipla em C++

Em linguagens como C++, uma classe pode herdar


mtodos de duas ou mais classes
A classe resultante pode ser usada no lugar das suas duas
superclasses via upcasting
Vantagem de herana mltipla: mais flexibilidade
Problema
Se duas classes A e B estenderem uma mesma classe Z e
herdarem um mtodo x() e, uma classe C herdar de A e
de B, qual ser a implementao de x() que C deve usar?
A de A ou de B?
Desvantagem de herana mltipla: ambigidade. Requer
cdigo mais complexo para evitar problemas desse tipo

26
Herana mltipla em Java
Classe resultante combina todas as interfaces, mas s possui
uma implementao: a da classe base <<interface>>
Empregado
<<interface>> <<interface>>
Animal Cidadao Contribuinte trabalha()
come() vota() pagaIR()
respira() getRG() getCPF() <<interface>>
Professor
ensina()

come()
respira() Este objeto pode ser usado
Pessoa ensina() em qualquer lugar onde
vota() for aceito um Animal, um
ensina() getRG()
vota() Professor, um Cidadao, um
trabalha()
getRG() pagaIR() Empregado, um Contribuinte,
trabalha() getCPF() um java.lang.Object
pagaIR() equals()
getCPF() toString()
... 27
Exemplo

interface Empregado { Todos os mtodos so


void trabalha(); implicitamente
}
public
interface Cidadao { abstract
void vota();
int getRG(); Quaisquer campos de dados
} tm que ser inicializadas e
so implicitamente
interface Professor
extends Empregado { static
void ensina(); final (constantes)
}
Indicar public, static, abstract
interface Contribuinte { e final opcional
boolean pagaIR();
long getCPF(); Interface pode ser declarada
} public (default: package-private)
28
Exemplo (2)
public class Pessoa
extends Animal
implements Professor, Cidadao, Contribuinte {

public void ensina() { /* votar */ }


public void vota() { /* votar */ }
public int getRG(){ return 12345; }
public void trabalha() {}
public boolean pagaIR() { return false; }
public long getCPF() { return 1234567890; }
}

Palavra implements declara interfaces implementadas


Exige que cada um dos mtodos de cada interface sejam de fato
implementados (na classe atual ou em alguma superclasse)
Se alguma implementao estiver faltando, classe s compila se for
declarada abstract
29
Uso de interfaces
public class Cidade {
public void contrata(Professor p) {
p.ensina();
p.trabalha();
}
public void contrata(Empregado e) { e.trabalha();}
public void cobraDe(Contribuinte c) { c.pagaIR();}
public void registra(Cidadao c) { c.getRG();}
public void alimenta(Animal a) { a.come();}
public static void main (String[] args) {
Pessoa joao = new Pessoa();
Cidade sp = new Cidade();
sp.contrata(joao); // considera Professor
sp.contrata((Empregado)joao); // Empregado
sp.cobraDe(joao); // considera Contribuinte
sp.registra(joao); // considera Cidadao
sp.alimenta(joao); // considera Animal
}
}
30
Concluso

Use interfaces sempre que possvel


Seu cdigo ser mais reutilizvel!
Classes que j herdam de outra classe podem ser
facilmente redesenhadas para implementar uma interface
sem quebrar cdigo existente que a utilize
Planeje suas interfaces com muito cuidado
mais fcil evoluir classes concretas que interfaces
No possvel acrescentar mtodos a uma interface
depois que ela j estiver em uso (as classes que a
implementam no compilaro mais!)
Quando a evoluo for mais importante que a
flexibilidade oferecido pelas interfaces, deve-se usar
classes abstratas.
31
Exerccios

1. Implemente e execute o exemplo mostrado


Coloque texto em cada mtodo (um println() para mostrar
que o mtodo foi chamado e descrever o que aconteceu)
Faa experimentos deixando de implementar certos
mtodos para ver as mensagens de erro obtidas
2. Implemente o exerccio do captulo 9 com interfaces
Mude o nome de RepositorioDados para
RepositorioDadosMemoria
Crie uma interface RepositorioDados implementada por
RepositorioDadosMemoria
Altere a linha em que o RepositorioDados construido na
classe Biblioteca e teste a aplicao.

32
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
33
Java 2 Standard Edition

Erros, excees
e asseres
Helder da Rocha
www.argonavis.com.br
1
Controle de erros com Excees

Excees so
Erros de tempo de execuo
Objetos criados a partir de classes especiais que so
"lanados" quando ocorrem condies excepcionais
Mtodos podem capturar ou deixar passar excees
que ocorrerem em seu corpo
obrigatrio, para a maior parte das excees, que o
mtodo declare quaisquer excees que ele no capturar
Mecanismo try-catch usado para tentar capturar
excees enquanto elas passam por mtodos

2
Trs tipos de erros de tempo de execuo

1. Erros de lgica de programao


Ex: limites do vetor ultrapassados, diviso por zero
Devem ser corrigidos pelo programador
2. Erros devido a condies do ambiente de
execuo
Ex: arquivo no encontrado, rede fora do ar, etc.
Fogem do controle do programador mas podem ser
contornados em tempo de execuo
3. Erros graves onde no adianta tentar recuperao
Ex: falta de memria, erro interno do JVM
Fogem do controle do programador e no podem ser
contornados

3
Como causar uma exceo?

Uma exceo um tipo de objeto que sinaliza que


uma condio excepcional ocorreu
A identificao (nome da classe) sua parte mais
importante
Precisa ser criada com new e depois lanada com
throw
IllegalArgumentException e = new
IllegalArgumentException("Erro!");
throw e; // exceo foi lanada!
A referncia desnecessria. A sintaxe abaixo mais
usual:
throw new IllegalArgumentException("Erro!");

4
Excees e mtodos

Uma declarao throws (observe o "s") obrigatria


em mtodos e construtores que deixam de capturar
uma ou mais excees que ocorrem em seu interior
public void m() throws Excecao1, Excecao2 {...}
public Circulo() throws ExcecaoDeLimite {...}
throws declara que o mtodo pode provocar
excees do tipo declarado (ou de qualquer subtipo)
A declarao abaixo declara que o mtodo pode provocar
qualquer exceo (nunca faa isto)
public void m() throws Exception {...}
Mtodos sobrepostos no podem provocar mais
excees que os mtodos originais
5
O que acontece?

Uma exceo lanada interrompe o fluxo normal do


programa
O fluxo do programa segue a exceo
Se o mtodo onde ela ocorrer no a capturar, ela ser
propagada para o mtodo que chamar esse mtodo e
assim por diante
Se ningum capturar a exceo, ela ir causar o trmino
da aplicao
Se em algum lugar ela for capturada, o controle pode ser
recuperado

6
Captura e declarao de excees

public class RelatorioFinanceiro {


public void metodoMau() throws ExcecaoContabil {
if (!dadosCorretos) {
throw new ExcecaoContabil("Dados Incorretos");
}
} instrues que sempre
public void metodoBom() { sero executadas
try {
... instrues ... instrues sero executadas
metodoMau(); se exceo no ocorrer
... instrues ...
} catch (ExcecaoContabil ex) {
System.out.println("Erro: " + ex.getMessage());
}
... instrues ... instrues sero executadas
} se exceo no ocorrer ou
} se ocorrer e for capturada

7
try e catch
Exception
O bloco try "tenta" executar um bloco de
cdigo que pode causar exceo
Deve ser seguido por TipoExcecao1

Um ou mais blocos catch(TipoDeExcecao ref) TipoExcecao2


E/ou um bloco finally
TipoExcecao3
Blocos catch recebem tipo de
exceo como argumento try try {{
Se ocorrer uma exceo no ...
... instrues
instrues ...
...
try, ela ir descer pelos }} catch
catch (TipoExcecao1
(TipoExcecao1 ex)
ex) {{
catch at encontrar um ...
... faz
faz alguma
alguma coisa
coisa ...
...
que declare capturar }} catch
catch (TipoExcecao2
(TipoExcecao2 ex)
ex) {{
...
... faz
faz alguma
alguma coisa
coisa ...
...
excees de uma classe ou
}} catch
catch (Exception
(Exception ex)
ex) {{
superclasse da exceo ...
... faz
faz alguma
alguma coisa
coisa ...
...
Apenas um dos blocos }}
catch executado
...
... continuao
continuao ...
...
8
finally
O bloco try no pode aparecer sozinho
deve ser seguido por pelo menos um catch ou por um finally
O bloco finally contm instrues que devem se executadas
independentemente da ocorrncia ou no de excees
try
try {{
//
// instrues:
instrues: executa
executa at
at linha
linha onde
onde ocorrer
ocorrer exceo
exceo
}} catch
catch (TipoExcecao1
(TipoExcecao1 ex)
ex) {{
//
// executa
executa somente
somente se
se ocorrer
ocorrer TipoExcecao1
TipoExcecao1
}} catch
catch (TipoExcecao2
(TipoExcecao2 ex)
ex) {{
//
// executa
executa somente
somente se
se ocorrer
ocorrer TipoExcecao2
TipoExcecao2
}} finally
finally {{
//
// executa
executa sempre
sempre ...
...
}}
//
// executa
executa se
se exceo
exceo for
for capturada
capturada ou
ou se
se no
no ocorrer
ocorrer

9
Como criar uma exceo

A no ser que voc esteja construindo uma API de


baixo-nvel ou uma ferramenta de desenvolvimento,
voc so usar excees do tipo (2) (veja pgina 3)
Para criar uma classe que represente sua exceo,
basta estender java.lang.Exception:
class NovaExcecao extends Exception {}
No precisa de mais nada. O mais importante
herdar de Exception e fornecer uma identificao
diferente
Bloco catch usa nome da classe para identificar excees.

10
Como criar uma exceo (2)

Voc tambm pode acrescentar mtodos, campos de


dados e construtores como em qualquer classe.
comum criar a classe com dois construtores
class NovaExcecao extends Exception {
public NovaExcecao () {}
public NovaExcecao (String mensagem) {
super(mensagem);
}
}
Esta implementao permite passar mensagem que
ser lida atravs de toString() e getMessage()

11
Principais mtodos

Construtores de Exception
Exception ()
Exception (String message)
Exception (String message, Throwable cause) [Java 1.4]
Mtodos de Exception
String getMessage()
Retorna mensagem passada pelo construtor
Throwable getCause()
Retorna exceo que causou esta exceo [Java 1.4]
String toString()
Retorna nome da exceo e mensagem
void printStackTrace()
Imprime detalhes (stack trace) sobre exceo

12
Como pegar qualquer exceo

Se, entre os blocos catch, houver excees da mesma


hierarquia de classes, as classes mais especficas (que
esto mais abaixo na hierarquia) devem aparecer
primeiro
Se uma classe genrica (ex: Exception) aparecer antes de
uma mais especfica, uma exceo do tipo da especfica
jamais ser capturado
O compilador detecta a situao acima e no compila o
cdigo
Para pegar qualquer exceo (geralmente isto no
recomendado), faa um catch que pegue Exception
catch (Exception e) { ... }

13
Relanar uma exceo

s vezes, aps a captura de uma exceo,


desejvel relan-la para que outros mtodos lidem
com ela
Isto pode ser feito da seguinte forma
public void metodo() throws ExcecaoSimples {
try {
// instrues
} catch (ExcecaoSimples ex) {
// faz alguma coisa para lidar com a exceo
throw ex; // relana exceo
}
}

14
Classes base da API

RuntimeException e Error
Excees no verificadas em tempo de compilao
Subclasses de Error no devem ser capturadas (so
situaes graves em que a recuperao impossvel ou
indesejvel)
Subclasses de RuntimeException representam erros de
lgica de programao que devem ser corrigidos (podem,
mas no devem ser capturadas: erros devem ser corrigidos)
Exception
Excees verificadas em tempo de compilao (exceo
regra so as subclasses de RuntimeException)
Compilador exige que sejam ou capturadas ou declaradas
pelo mtodo que potencialmente as provoca
15
Hierarquia
Condies excepcionais Object
checadas pelo compilador Erros no checados
(eventos recuperveis) pelo compilador
Throwable (eventos irrecuperveis)
Excees no
checadas pelo
compilador
(erros de lgica) Exception Error

IOException
RuntimeException FileNotFoundException
OutOfMemoryError
MinhaExcecao
InternalError
ClassCastException SuaExcecao
VirtualMachineError
NullPointerException ...
UnknownError
NumberFormatException
...
ArrayIndexOutOfBoundsException
...

Boa prtica: Prefira sempre usar as classes de excees


existentes na API antes de criar suas prprias excees!
16
Como cavar a prpria cova
No tratar excees e simplesmente declar-las em todos os
mtodos evita trabalho, mas torna o cdigo menos robusto
Mas o pior que um programador pode fazer capturar excees
e fazer nada, permitindo que erros graves passem despercebidos
e causem problemas dificlimos de localizar no futuro.
NUNCA escreva o seguinte cdigo:
try {
// .. cdigo que pode causar excees
} catch (Exception e) {}

Ele pega at NullPointerException, e no diz nada. O mundo se


acaba, o programa trava ou funciona de modo estranho e
ningum saber a causa a no ser que mande imprimir o valor
de e, entre as chaves do catch.
Pior que isto s se no lugar de Exception houver Throwable. 17
Testes (Enunciado parte 1)

Considere o seguinte cdigo [Roberts]


1. try {
2. URL u = new URL(s); // s is a previously defined String
3. Object o = in.readObject(); // in is valid ObjectInputStream
4. System.out.println("Success");
5. }
6. catch (MalformedURLException e) {
7. System.out.println("Bad URL");
8. }
9. catch (IOException e) {
10. System.out.println("Bad file contents");
11. }
12. catch (Exception e) {
13. System.out.println("General exception");
14. }
15. finally {
16. System.out.println("doing finally part");
17. }
18. System.out.println("Carrying on");
18
Testes (Enunciado parte 2)

Considere a seguinte hierarquia


java.lang.Throwable

java.lang.Error java.lang.Exception

java.lang.OutOfMemoryError java.io.IOException

java.io.StreamCorruptedException java.net.MalformedURLException

19
Teste 1

1. Que linhas so impressas se os mtodos das


linhas 2 e 3 completarem com sucesso sem provocar
excees?
A. Success
B. Bad URL
C. Bad File Contents
D. General Exception
E. Doing finally part
F. Carrying on

20
Teste 2

2. Que linhas so impressas se o mtodo da linha 3


provocar um OutOfMemoryError?
A. Success
B. Bad URL
C. Bad File Contents
D. General Exception
E. Doing finally part
F. Carrying on

21
Teste 3

3. Que linhas so impressas se o mtodo da linha 2


provocar uma MalformedURLException?
A. Success
B. Bad URL
C. Bad File Contents
D. General Exception
E. Doing finally part
F. Carrying on

22
Teste 4

4. Que linhas so impressas se o mtodo da linha 3


provocar um StreamCorruptedException?
A. Success
B. Bad URL
C. Bad File Contents
D. General Exception
E. Doing finally part
F. Carrying on

23
Asseres
So expresses booleanas que o programador define para
afirmar uma condio que ele acredita ser verdade
Asseres so usadas para validar cdigo (ter a certeza que um vetor
tem determinado tamanho, ter a certeza que o programa no passou
por determinado lugar)
Melhoram a qualidade do cdigo: tipo de teste caixa-branca
Devem ser usadas durante o desenvolvimento e desligadas na
produo (afeta a performance)
No devem ser usadas como parte da lgica do cdigo
Asseres so um recurso novo do JSDK1.4.0
Nova palavra-chave: assert
preciso compilar usando a opo -source 1.4:
> javac -source 1.4 Classe.java
Para executar, preciso habilitar afirmaes (enable assertions):
> java -ea Classe

24
Asseres: sintaxe
Asseres testam uma condio. Se a condio for falsa, um
AssertionError lanado
Sintaxe:
assert expresso;
assert expressoUm : expressoDois;
Se primeira expresso for true, a segunda no avaliada
Sendo falsa, um AssertionError lanado e o valor da segunda
expresso passado no seu construtor.
Exemplo
Em vez de usar ... use uma assero!.
comentrio... if (i%3 == 0) {
if (i%3 == 0) { ...
... } else if (i%3 == 1) {
} else if (i%3 == 1) { ...
... } else {
} else { // (i%3 == 2) assert i%3 == 2;
... ...
} }
25
Asseres: exemplo

Trecho de cdigo que afirma que controle nunca


passar pelo default:
switch(estacao) {
case Estacao.PRIMAVERA:
...
break;
case Estacao.VERAO:
...
break;
case Estacao.OUTONO:
...
break;
case Estacao.INVERNO:
...
break;
default:
assert false: "Controle nunca chegar aqui!";
}
26
Exerccios

1. Crie a seguinte hierarquia de excees


ExcecaoDePublicacao
AgenteInexistente
AgenteDuplicado
PublicacaoInexistente extends ExcecaoDePublicacao
PublicacaoDuplicada extends ExcecaoDePublicacao
2. Quais mtodos das classes da aplicao Biblioteca
(cap. 9) devem definir essas excees?
Declare (throws) as excecoes nos mtodos escolhidos
Inclua o teste e lanamento de excees no seu cdigo
(RepositorioDadosMemoria)

27
Exerccios

3. Implemente um procedimento que tenha um


switch para quatro estaes (primavera: 1, vero: 2,
outono: 3, inverno: 4)
a) Em cada case, coloque um System.out.println() que
imprima a estao escolhida. Escreva um main que
selecione algumas estaes.
b) Coloque um assert false no default para afirmar que o
cdigo jamais deveria passar por l
c) Invente uma quinta estao e veja se o AssertError
acontece
No se esquea de compilar com -source 1.4 e
executar com -ea
(no Ant use o atributos source no <javac>)
28
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
29
Java 2 Standard Edition

Testes de Unidade
com JUnit

Helder da Rocha (helder@acm.org) argonavis.com.br1


Sobre este mdulo

Este mdulo mais sobre boas prticas de


desenvolvimento e menos sobre Java
Abordagem ser superficial (material extenso), mas visa
despertar seu interesse no hbito de escrever testes.
Objetivos
Apresentar e incentivar a prtica de testes de unidade
durante o desenvolvimento
Apresentar a ferramenta JUnit, que ajuda na criao e
execuo de testes de unidade em Java
Discutir as dificuldades relativas "arte" de testar e como
podem ser superadas ou reduzidas
Torn-lo(a) uma pessoa "viciada" em testes: Convenc-
lo(a) a nunca escrever uma linha sequer de cdigo sem
antes escrever um teste executvel que a justifique.
2
O que "Testar cdigo"?

a coisa mais importante do desenvolvimento


Se seu cdigo no funciona, ele no presta!
Todos testam
Voc testa um objeto quando escreve uma classe e cria
algumas instncias no mtodo main()
Seu cliente testa seu software quando ele o utiliza (ele
espera que voc o tenha testado antes)
O que so testes automticos?
So programas que avaliam se outro programa funciona
como esperado e retornam resposta tipo "sim" ou "no"
Ex: um main() que cria um objeto de uma classe testada,
chama seus mtodos e avalia os resultados
Validam os requisitos de um sistema
3
Por que testar?

Por que no?


Como saber se o recurso funciona sem testar?
Como saber se ainda funciona aps refatoramento?
Testes do maior segurana: coragem para mudar
Que adianta a OO isolar a interface da implementao se
programador tem medo de mudar a implementao?
Cdigo testado mais confivel
Cdigo testado pode ser alterado sem medo
Como saber quando o projeto est pronto
Testes == requisitos 'executveis'
Testes de unidade devem ser executados o tempo todo
Escreva os testes antes. Quando todos rodarem 100%, o
projeto est concludo!
4
O que JUnit?

Um framework que facilita o desenvolvimento e


execuo de testes de unidade em cdigo Java
Uma API para construir os testes
Aplicaes para executar testes
A API
Classes Test, TestCase, TestSuite, etc. oferecem a
infraestrutura necessria para criar os testes
Mtodos assertTrue(), assertEquals(), fail(), etc. so
usados para testar os resultados
Aplicao TestRunner
Roda testes individuais e suites de testes
Verses texto, Swing e AWT
Apresenta diagnstico sucesso/falha e detalhes
5
Para que serve?

'Padro' para testes de unidade em Java


Desenvolvido por Kent Beck (XP) e Erich Gamma (GoF)
Design muito simples
Testar uma boa prtica, mas chato; JUnit torna
as coisas mais agradveis, facilitando
A criao e execuo automtica de testes
A apresentao dos resultados
JUnit pode verificar se cada unidade de cdigo
funciona da forma esperada
Permite agrupar e rodar vrios testes ao mesmo tempo
Na falha, mostra a causa em cada teste
Serve de base para extenses
6
Arquitetura do JUnit

Diagrama de classes

Fonte: Manual do JUnit (Cooks Tour)


7
Como usar o JUnit?
H vrias formas de usar o JUnit. Depende da
metodologia de testes que est sendo usada
Cdigo existente: precisa-se escrever testes para classes
que j foram implementadas
Desenvolvimento guiado por testes (TDD): cdigo novo
s escrito se houver um teste sem funcionar
Onde obter?
www.junit.org
Como instalar?
Incluir o arquivo junit.jar no classpath para compilar e
rodar os programas de teste
Para este curso
Inclua o junit.jar no diretrio lib/ de seus projetos
8
JUnit para testar cdigo existente

Exemplo de um roteiro tpico


1. Crie uma classe que estenda junit.framework.TestCase
para cada classe a ser testada
import junit.framework.*;
class SuaClasseTest extends TestCase {...}
2. Para cada mtodo xxx(args) a ser testado defina um
mtodo public void testXxx() no test case
SuaClasse:
public boolean equals(Object o) { ... }
SuaClasseTest:
public void testEquals() {...}
Sobreponha o mtodo setUp(), se necessrio
Sobreponha o mtodo tearDown(), se necessrio
9
JUnit para guiar o desenvolvimento

Cenrio de Test-Driven Development (TDD)


1. Defina uma lista de tarefas a implementar
2. Escreva uma classe (test case) e implemente um
mtodo de teste para uma tarefa da lista.
3. Rode o JUnit e certifique-se que o teste falha
4. Implemente o cdigo mais simples que rode o teste
Crie classes, mtodos, etc. para que cdigo compile
Cdigo pode ser cdigo feio, bvio, mas deve rodar!
5. Refatore o cdigo para remover a duplicao de
dados
6. Escreva mais um teste ou refine o teste existente
7. Repita os passos 2 a 6 at implementar toda a lista
10
Como implementar?

Dentro de cada teste, utilize os mtodos herdados da


classe TestCase
assertEquals(objetoEsperado, objetoRecebido),
assertTrue(valorBooleano), assertNotNull(objeto)
assertSame(objetoUm, objetoDois), fail (), ...
Exemplo de test case com um setUp() e um teste:
public class CoisaTest extends TestCase {
// construtor padro omitido
private Coisa coisa;
public void setUp() { coisa = new Coisa("Bit"); }
public void testToString() {
assertEquals("<coisa>Bit</coisa>",
coisa.toString());
}
}
11
Como funciona?

O TestRunner recebe uma subclasse TestCase


de junit.framework.TestCase setUp()
Usa reflection (Cap 14) para achar mtodos tearDown()

Para cada mtodo testXXX(), executa:


1. o mtodo setUp() MeuTestCase
2. o prprio mtodo testXXX()
setUp()
3. o mtodo tearDown() testXXX()
O test case instanciado para executar testYYY()
tearDown()
um mtodo testXXX() de cada vez.
As alteraes que ele fizer ao estado do objeto no
afetaro os demais testes
Mtodo pode terminar, falhar ou provocar exceo
12
Exemplo: um test case
package junitdemo; Construtor precisa ser
publico, receber String
import junit.framework.*; name e chamar
import java.io.IOException; super(String name)
(JUnit 3.7 ou anterior)
public class TextUtilsTest extends TestCase {

public TextUtilsTest(String name) {


super(name); Mtodo comea com "test"
} e sempre public void

public void testRemoveWhiteSpaces() throws IOException {


String testString = "one, ( two | three+) , "+
"(((four+ |\t five)?\n \n, six?";
String expectedString = "one,(two|three+)"+
",(((four+|five)?,six?";
String results = TextUtils.removeWhiteSpaces(testString);
assertEquals(expectedString, results);
}
}
13
Exemplo: uma classe que faz o teste passar
package junitdemo;
import java.io.*;

public class TextUtils {

public static String removeWhiteSpaces(String text)


throws IOException {
return "one,(two|three+),(((four+|five)?,six?";
}
}

O teste passa... e da? A soluo est pronta? No!


Tem dados duplicados! Remova-os!
Escreva um novo teste que faa com que esta soluo
falhe, por exemplo:
String test2 = " a b\nc ";
assertEquals("abc", TextUtils.removeWhiteSpaces(test2));
14
Outra classe que faz o teste passar

package junitdemo;
import java.io.*;

public class TextUtils {

public static String removeWhiteSpaces(String text)


throws IOException {
StringReader reader = new StringReader(text);
StringBuffer buffer = new StringBuffer(text.length());
int c;
while( (c = reader.read()) != -1) {
if (c ==' '||c =='\n'||c =='\r'|| c =='\f'||c =='\t') {
; /* do nothing */
} else {
buffer.append((char)c);
}
}
return buffer.toString();
}
}
15
Exemplo: como executar
Use a interface de texto
java -cp junit.jar junit.textui.TestRunner
junitdemo.TextUtilsTest
Ou use a interface grfica
java -cp junit.jar junit.swingui.TestRunner
junitdemo.TextUtilsTest
Use Ant <junit>
tarefa do Apache Ant
Ou fornea um main():
public static void main (String[] args) {
TestSuite suite =
new TestSuite(TextUtilsTest.class);
junit.textui.TestRunner.run(suite);
}

16
TestSuite
Permite executar uma coleo de testes
Mtodo addTest(TestSuite) adiciona um teste na lista
Padro de codificao (usando reflection):
retornar um TestSuite em cada test-case:
public static TestSuite suite() {
return new TestSuite(SuaClasseTest.class);
}
criar uma classe AllTests que combina as suites:
public class AllTests {
public static Test suite() {
Pode incluir TestSuite testSuite =
outras suites new TestSuite("Roda tudo");
testSuite.addTest(pacote.AllTests.suite());
testSuite.addTest(MinhaClasseTest.suite());
testSuite.addTest(SuaClasseTest.suite());
return testSuite;
}
} 17
Fixtures
So os dados reutilizados por vrios testes
public class AttributeEnumerationTest extends TestCase {
String testString;
String[] testArray;
AttributeEnumeration testEnum; Fixture
public void setUp() {
testString = "(alpha|beta|gamma)";
testArray = new String[]{"alpha", "beta", "gamma"};
testEnum = new AttributeEnumeration(testArray);
}
public void testGetNames() {
assertEquals(testEnum.getNames(), testArray);
}
public void testToString() {
assertEquals(testEnum.toString(), testString);
}
(...)

Se os mesmos dados so usados em vrios testes, inicialize-os no


setUp() e faa a faxina no tearDown() (se necessrio)
No perca tempo pensando nisto antes. Escreva seus testes.
Depois, se achar que h duplicao, monte o fixture. 18
Teste situaes de falha

to importante testar o cenrio de falha do seu


codigo quanto o sucesso
Mtodo fail() provoca uma falha
Use para verificar se excees ocorrem quando se espera
que elas ocorram
Exemplo
public void testEntityNotFoundException() {
resetEntityTable(); // no entities to resolve!
try {
// Following method call must cause exception!
ParameterEntityTag tag = parser.resolveEntity("bogus");
fail("Should have caused EntityNotFoundException!");
} catch (EntityNotFoundException e) {
// success: exception occurred as expected
}
}
19
JUnit vs. asseres
Afirmaes do J2SDK 1.4 so usadas dentro do cdigo
Podem incluir testes dentro da lgica procedural de um programa
if (i%3 == 0) {
doThis();
} else if (i%3 == 1) {
doThat();
} else {
assert i%3 == 2: "Erro interno!";
}
Provocam um AssertionError quando falham (que pode ser
encapsulado pelas excees do JUnit)
Afirmaes do JUnit so usadas em classe separada (TestCase)
No tm acesso ao interior dos mtodos (verificam se a interface
dos mtodos funciona como esperado)
Afirmaes do J2SDK1.4 e JUnit so complementares
JUnit testa a interface dos mtodos
assert testa trechos de lgica dentro dos mtodos
20
Limitaes do JUnit

Acesso aos dados de mtodos sob teste


Mtodos private e variveis locais no podem ser
testadas com JUnit.
Dados devem ser pelo menos package-private (friendly)
Solues com refatoramento
Isolar em mtodos private apenas cdigo inquebrvel
Transformar mtodos private em package-private
Desvantagem: quebra ou reduo do encapsulamento
Classes de teste devem estar no mesmo pacote que as classes
testadas para ter acesso
Soluo usando extenso do JUnit (open-source)
JUnitX: usa reflection para ter acesso a dados private
http://www.extreme-java.de/junitx/index.html
21
Resumo: JUnit
Para o JUnit,
Um teste um mtodo
Um caso de teste uma classe contendo uma coleo de testes
(mtodos que possuem assertions)
Cada teste testa o comportamento de uma unidade de cdigo do
objeto testado (pode ser um mtodo, mas pode haver vrios testes
para o mesmo mtodo ou um teste para todo o objeto)
Fixtures so os dados usados em testes
TestSuite uma composio de casos de teste
Pode-se agrupar vrios casos de teste em uma suite
JUnit testa apenas a interface das classes
Mantenha os casos de teste no mesmo diretrio que as classes
testadas para ter acesso a mtodos package-private
Use padres de nomenclatura: ClasseTest, AllTests
Use o Ant para separar as classes em um release
22
Apndice: boas prticas
e dificuldades com testes

23
Como escrever bons testes

JUnit facilita bastante a criao e execuo de


testes, mas elaborar bons testes exige mais
O que testar? Como saber se testes esto completos?
"Teste tudo o que pode falhar" [2]
Mtodos triviais (get/set) no precisam ser testados.
E se houver uma rotina de validao no mtodo set?
melhor ter testes a mais que testes a menos
Escreva testes curtos (quebre testes maiores)
Use assertNotNull() (reduz drasticamente erros de
NullPointerException difceis de encontrar)
Reescreva seu cdigo para que fique mais fcil de testar

24
Como descobrir testes?

Escreva listas de tarefas (to-do list)


Comece pelas mais simples e deixe os testes "realistas"
para o final
Requerimentos, use-cases, diagramas UML: rescreva os
requerimentos em termos de testes
Dados
Use apenas dados suficientes (no teste 10 condies se
trs forem suficientes)
Bugs revelam testes
Achou um bug? No conserte sem antes escrever um
teste que o pegue (se voc no o fizer, ele volta)!
Teste sempre! No escreva uma linha de cdigo sem
antes escrever um teste!
25
Test-Driven Development (TDD)

Desenvolvimento guiado pelos testes


S escreva cdigo novo se um teste falhar
Refatore at que o teste funcione
Alternncia: "red/green/refactor" - nunca passe mais de
10 minutos sem que a barra do JUnit fique verde.
Tcnicas
"Fake It Til You Make It": faa um teste rodar
simplesmente fazendo mtodo retornar constante
Triangulao: abstraia o cdigo apenas quando houver
dois ou mais testes que esperam respostas diferentes
Implementao bvia: se operaes so simples,
implemente-as e faa que os testes rodem

26
Como lidar com testes difceis
Testes devem ser simples e suficientes
XP: design mais simples que resolva o problema;
sempre pode-se escrever novos testes, quando necessrio
No complique
No teste o que responsabilidade de outra classe/mtodo
Assuma que outras classes e mtodos funcionam
Testes difceis (ou que parecem difceis)
Aplicaes grficas: eventos, layouts, threads
Objetos inaccessveis, mtodos privativos, Singletons
Objetos que dependem de outros objetos
Objetos cujo estado varia devido a fatores imprevisveis
Solues
Alterar o design da aplicao para facilitar os testes
Simular dependncias usando proxies e stubs
27
Dependncia de cdigo-fonte
Problema
Como testar componente que depende do cdigo de
outros componentes?
Classe-alvo no oferece o que testar: Tanque
+nivel()
CarroTest Carro
+testAcelera() +acelera()
Ignio
+ligada()
Mtodo acelera() s vai funcionar
se nvel() do tanque for > 0 public void testAcelera() {
e ignio estiver ligada() Carro carro =
Como saber se condies so new Carro();
carro.acelera();
verdadeiras se no temos assert???(???);
acesso s dependncias? }

Fonte: www.objectmentor.com, 2002 28


Stubs: objetos "impostores"

possvel remover dependncias de cdigo-fonte


refatorando o cdigo para usar interfaces
antes depois
interface A no conhece mais
A B A InterB B
o tipo concreto de B

Agora B pode ser substituda por um stub


BStub est sob controle total de ATest (1)
Em alguns casos, ATest pode implementar InterB (2)
interface interface
ATest A ATest A InterB
InterB
(2)
(1)

cria BStub B self-shunt pattern B

Fonte: www.objectmentor.com, 2002 29


Dependncia: soluo usando stubs
"Mock implementation" das interface
dependncias simula os efeitos que Tanque
tero sobre Carro +nivel():float TanqueImpl
+nivel():float
CarroTest Carro
+testTanqueVazioSemIgn() +acelera()
+testTanqueCheioSemIgn()
+testTanqueVazioComIgn() interface
+testTanqueCheioComIgn() Ignicao IgnicaoImpl
+ligada(): bool +ligada():bool

Quando criar o objeto, passe a implementao falsa


carro.setTanque(new CarroTest());
carro.setIgnicao(new CarroTest());
Depois preencha-a com dados suficientes para que objeto
possa ser testado
Fonte: www.objectmentor.com, 2002 30
Dependncias de servidores

Usar stubs para simular servios e dados


preciso implementar classes que devolvam as respostas
esperadas para diversas situaes
Complexidade muito grande da dependncia pode no
compensar investimento (no deixe de fazer testes por
causa disto!)
Vrios tipos de stubs: mock objects, self-shunts.
Usar proxies (mediadores) para servios reais
Oferecem interface para simular comunicao e testa a
integrao real do componente com seu ambiente
No teste unitrio: teste pode falhar quando cdigo est
correto (se os fatores externos falharem)
Exemplo em J2EE: Jakarta Cactus
31
Mock Objects
Mock objects (MO) uma estratgia de uso de stubs
que no implementa nenhuma lgica
Um mock object no exatamente um stub, pois no
simula o funcionamento do objeto em qualquer situao
Comportamento controlado pela classe de teste que
Define comportamento esperado (valores retornados, etc.)
Passa MO configurado para objeto a ser testado
Chama mtodos do objeto (que usam o MO)
Implementaes open-source que facilitam uso de MOs
EasyMock (tammofreese.de/easymock/) e MockMaker
(www.xpdeveloper.com) geram MOs a partir de interfaces
Projeto MO (mockobjects.sourceforge.net) coleo de mock
objects e utilitrios para us-los
32
Ant + JUnit

Com Ant, pode-se executar todos os testes aps a


integrao com um nico comando:
ant roda-testes
Com as tarefas <junit> e <junitreport> possvel
executar todos os testes
gerar um relatrio simples ou detalhado, em diversos
formatos (XML, HTML, etc.)
executar testes de integrao
So tarefas opcionais. preciso ter em $ANT_HOME/lib
optional.jar (distribudo com Ant)
junit.jar (distribudo com JUnit)

33
Exemplo: <junit>
<target name="test" depends="build">
<junit printsummary="true" dir="${build.dir}"
fork="true">
<formatter type="plain" usefile="false" />
<classpath path="${build.dir}" /
<test name="argonavis.dtd.AllTests" />
</junit>
Formata os dados na tela (plain)
</target>
Roda apenas arquivo AllTests
<target name="batchtest" depends="build" >
<junit dir="${build.dir}" fork="true">
<formatter type="xml" usefile="true" />
<classpath path="${build.dir}" />
<batchtest todir="${test.report.dir}">
<fileset dir="${src.dir}">
<include name="**/*Test.java" />
<exclude name="**/AllTests.java" />
</fileset>
</batchtest> Gera arquivo XML
</junit> Inclui todos os arquivos que
</target> terminam em TEST.java
34
<junitreport>

Gera um relatrio detalhado (estilo JavaDoc) de todos


os testes, sucessos, falhas, excees, tempo, ...
<target name="test-report" depends="batchtest" >
<junitreport todir="${test.report.dir}">
<fileset dir="${test.report.dir}"> Usa arquivos XML
<include name="TEST-*.xml" /> gerados por
</fileset> <formatter>
<report todir="${test.report.dir}/html"
format="frames" />
</junitreport>
</target>

35
Resumo
Testar tarefa essencial do desenvolvimento de software.
Testar unidades de cdigo durante o desenvolvimento uma
prtica que traz inmeros benefcios
Menos tempo de depurao (muito, muito menos!)
Melhor qualidade do software
Segurana para alterar o cdigo
Usando TDD, melhores estimativas de prazo
JUnit uma ferramenta open-source que ajuda a
implementar testes em projetos Java
TDD ou Test-Driven Development uma tcnica onde os
testes so usados para guiar o desenvolvimento
Ajuda a focar o desenvolvimento em seus objetivos
Mock objects ou stubs podem ser usados para representar
dependncia e diminuir as responsabilidades de testes
36
Exerccio
1. A classe Exercicio.java possui quatro mtodos vazios:
int soma(int a, int b)
long fatorial(long n);
double fahrToCelsius(double fahrenheit);
String inverte(String texto);
Escreva, na classe ExercicioTest.java, test-cases para cada
mtodo, que preencham os requisitos:
Soma: 1+1 = 2, 2+4 = 4
Fatorial: 0! = 1, 1! = 1, 2! = 2, 3! = 6, 4! = 24, 5! = 120
A frmula n! = n(n-1)(n-2)(n-3)...3*2*1
Celsius: -40C = -40F, 0C=32F, 100C=212F
A frmula F = 9/5 * C + 32
Inverte recebe "Uma frase" e retorna "esarf amU"
Implemente um teste e execute-o (o esqueleto de um deles
j est pronto). Ele deve falhar.
Implemente os mtodos, um de cada vez, e rode os testes
at que no falhem mais (tarja verde), antes de prosseguir.
37
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
38
Java 2 Standard Edition

Fundamentos de
Programao
Concorrente
Helder da Rocha
www.argonavis.com.br 1
Programao concorrente

O objetivo deste mdulo oferecer uma introduo


a Threads que permita o seu uso em aplicaes
grficas e de rede
Tpicos abordados
A classe Thread e a interface Runnable
Como criar threads
Como controlar threads
Tpicos sobre deadlock
Exemplos de monitores: wait() e notify()
Para mais detalhes, consulte as referncias no final
do captulo

2
Mltiplas linhas de execuo

Mltiplos threads oferecem uma nova forma de dividir


e conquistar um problema de computao
Em vez de dividir o problema apenas em objetos
independentes ...
... divide o problema em tarefas independentes
Threads vs. Processos
Processos: tarefas em espaos de endereos diferentes se
comunicam usando pipes oferecidos pelo SO
Threads: tarefas dentro do espao de endereos da
aplicao se comunicam usando pipes fornecidos pela JVM
O suporte a multithreading de Java nativo
Mais fcil de usar que em outras linguagens onde no um
recurso nativo
3
O que um thread

Um thread parece e age como um programa


individual. Threads, em Java, so objetos.
Individualmente, cada thread faz de conta que tem
total poder sobre a CPU
Sistema garante que, de alguma forma, cada thread
tenha acesso CPU de acordo com
Cotas de tempo (time-slicing)
Prioridades (preemption)
Programador pode controlar parcialmente forma de
agendamento dos threads
H dependncia de plataforma no agendamento

4
Por que usar mltiplos threads?

Todo programa tem pelo menos um thread, chamado


de Main Thread.
O mtodo main() roda no Main Thread
Em alguns tipos de aplicaes, threads adicionais so
essenciais. Em outras, podem melhorar o bastante a
performance.
Interfaces grficas
Essencial para ter uma interface do usurio que responda
enquanto outra tarefa est sendo executada
Rede
Essencial para que servidor possa continuar a esperar por
outros clientes enquanto lida com as requisies de cliente
conectado. 5
Como criar threads

H duas estratgias
Herdar da classe java.lang.Thread
Implementar a interface java.lang.Runnable
Herdar da classe Thread
O objeto um Thread, e sobrepe o comportamento
padro associado classe Thread
Implementar a interface Runnable
O objeto, que define o comportamento da execuo,
passado para um Thread que o executa
Nos dois casos
Sobreponha o mtodo run() que o "main()" do Thread
O run() deve conter um loop que ir rodar pelo tempo de
vida do thread. Quando o run(), terminar, o thread morre.
6
Exemplo: herdar da classe Thread

public class Trabalhador extends Thread {


String produto; int tempo;
public Trabalhador(String produto,
int tempo) {
this.produto = produto;
this.tempo = tempo;
}
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println(i + " " + produto);
try {
sleep((long)(Math.random() * tempo));
} catch (InterruptedException e) {}
}
System.out.println("Terminei " + produto);
}
}

7
Exemplo: implementar Runnable
public class Operario implements Runnable {
String produto; int tempo;
public Operario (String produto,
int tempo) {
this.produto = produto;
this.tempo = tempo;
}
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println(i + " " + produto);
try {
Thread.sleep((long)
(Math.random() * tempo));
} catch (InterruptedException e) {}
}
System.out.println("Terminei " + produto);
}
}

8
Como usar o Thread

Para o Trabalhador que Thread


Trabalhador severino =
new Trabalhador("sapato", 100);
Trabalhador raimundo =
new Trabalhador("bota", 500);
severino.start();
raimundo.start();
Para o Trabalhador que Runnable
Operario biu = new Operario ("chinelo", 100);
Operario rai = new Operario ("sandalia", 500);
Thread t1 = new Thread(biu);
Thread t2 = new Thread(rai);
t1.start();
t2.start();

9
Ciclo de vida
Um thread est geralmente em um dentre trs estados:
executvel (e possvelmente executando) e no-executvel
(esperando, bloqueado, etc.)
O thread entre no estado executvel com t.start(), que causa
o incio de run(), e passa para o estado morto quando run()
chega ao fim.
Executando (running) Thread.sleep(1000)
blocked (socket, file, ...)
t.yield() object.wait() esperando acesso
t.setPriority() ...
Thread t = t.start()
Executvel (ready) No executvel
new Thread()

run() terminou

Morto
10
Filas de prioridades
O estado ready no garantia de execuo. Threads so regidos
por prioridades. Threads de baixa prioridade tm menos chances
A Ready (filas) Running B Um thread terminou
(CPU)
9
5 5 5 9 5 5 5 9
3 3 3 3 3 3 3 3
1 1 9
9 Dead
C Outro dorme
D Dando a preferncia
Sleeping yield()

5 5 5 5 5 5
3 3 3 3 3 3 3 3
1 1 11
Principais mtodos da classe Thread
Estticos
Thread currentThread(): retorna referncia para o thread
que est executando no momento
void sleep(long tempo): faz com que o thread que est
executando no momento pare por tempo milissegundos
no mnimo
void yield(): faz com que o thread atual pare e permita
que outros que esto na sua fila de prioridades executem
De instncia
void run(): o "main" do Thread. Deve ser implementado
no Thread ou no objeto Runnable passado ao thread
void start(): um bootstrap. Faz o JVM chamar o run()
boolean isAlive(): verifica se thread est vivo
12
Compartilhamento de recursos limitados
Recursos limitados podem ser compartilhados por vrios
threads simultaneamente
Cada objeto tm um bloqueio que pode ser acionado pelo
mtodo que o modifica para evitar corrupo de dados
Dados podem ser corrompidos se
Thread 1 Thread 2
um thread deixar um objeto em
um estado incompleto e outro saldo(): 1200

thread assumir a CPU saldo(): 1200


sacar(1000)
void operacaoCritica() {
sacar(1000)
if (saldo() > 1000)
sacar(1000);
else depositar(500);
} Controle do objeto
passou para o Thread 2
no meio da operao

13
Corrupo
Recursos compartilhados devem ser protegidos
A palavra-reservada synchronized permite que blocos sensveis
ao acesso simultneo sejam protegidos de corrupo
impedindo que objetos os utilizem ao mesmo tempo.
Thread 1 Thread 2
Synchronized deve limitar-se aos
saldo(): 1200
trechos crticos (performance!)
void operacaoCritica() { espera()
// ... trechos thread-safe sacar(1000)
synchronized (this) {
if (saldo() > 1000) saldo(): 200
depositar(500)
sacar(1000);
else depositar(500);
Thread 1 tem monoplio
} // (... trechos seguros ...)
do objeto enquanto estiver
} no bloco synchronized
Mtodos inteiros podem ser synchronized
synchronized void operacaoCritica() {}
14
Comunicao entre threads

Se um recurso crtico est sendo usado, s um


thread tem acesso. preciso que
Os outros esperem at que o recurso esteja livre
O thread que usa o recurso avise aos outros que o liberou
Esse controle possvel atravs de dois mtodos da
classe Object, que s podem ser usados em blocos
synchronized
wait(): faz com que o Thread sobre o qual chamado
espere por um tempo indeterminado, at receber um...
notify(): notifica o prximo Thread que o recurso
bloqueado foi liberado. Se h mais threads interessados,
deve-se usar o
notifyAll(): avisa a todos os threads.
15
Exemplo clssico de comunicao (1)

A seguinte classe uma pilha compartilhada por dois


threads. Como os mtodos push() e pop() contm
cdigo que pode corromper os dados, caso no sejam
executados atomicamente, eles so synchronized
public class PilhaSincronizada {
private int index = 0;
private int[] buffer = new int[10];

public synchronized int pop() {


index--;
return buffer[index];
}

public synchronized void push(int i) {


buffer[index] = i;
index++;
}
}
16
Exemplo de comunicao: (2) Produtor
O objeto abaixo produz 40 componentes em intervalos de 0
a 1 segundo e os tenta armazenar na pilha.
public class Producer implements Runnable {
PilhaSincronizada pilha;

public Producer(PilhaSincronizada pilha) {


this.pilha = pilha;
}

public void run() {


int colorIdx;
for (int i = 0; i < 40; i++) {
colorIdx = (int)(Math.random() * Colors.color.length);
pilha.push(colorIdx);
System.out.println("Criado: "+ Colors.color[colorIdx]);
try {
Thread.sleep((int)(Math.random() * 1000));
} catch (InterruptedException e) {}
}
}
}
17
Exemplo de comunicao (3) Consumidor
O objeto abaixo consome os 40 componentes da pilha mais
lentamente, esperando de 0 a 5 segundos
public class Consumer implements Runnable {

PilhaSincronizada pilha;

public Producer(PilhaSincronizada pilha) {


this.pilha = pilha;
}

public void run() {


int colorIdx;
for (int i = 0; i < 20; i++) {
colorIdx = pilha.pop();
System.out.println("Usado: "+ Colors.color[colorIdx]);
try {
Thread.sleep((int)(Math.random() * 5000));
} catch (InterruptedException e) {}
}
}
}
18
Monitor com wait() e notify()
A pilha foi modificada e agora faz com que os threads
executem wait() e notify() ao utilizarem seus mtodos
public class PilhaSincronizada {
private int index = 0;
private int[] buffer = new int[10];
public synchronized int pop() {
while (index == 0) {
try { this.wait();
} catch (InterruptedException e) {}
}
this.notify(); Apesar de aparecer antes, a
index--;
return buffer[index]; notificao s ter efeito
} quando o bloco synchronized
terminar
public synchronized void push(int i) {
while (index == buffer.length) {
try { this.wait();
} catch (InterruptedException e) {}
}
this.notify();
buffer[index] = i;
index++;
}
}
19
Problemas de sincronizao

Quando mtodos sincronizados chamam outros


mtodos sincronizados h risco de deadlock
Exemplo: para alterar valor no objeto C:
O Thread A espera liberao de acesso a objeto que est
com Thread B
O Thread B aguarda que algum (A, por exemplo) faa uma
alterao no objeto para que possa liber-lo (mas ningum
tem acesso a ele, pois B o monopoliza!)
Soluo
Evitar que mtodos sincronizados chamem outros mtodos
sincronizados
Se isto no for possvel, controlar liberao e retorno dos
acessos (hierarquia de chaves de acesso)
20
Exemplo de deadlock
public class Caixa {
double saldoCaixa = 0.0;
Cliente clienteDaVez = null;
public synchronized void atender(Cliente c, int op, double v) {
while (clienteDaVez != null) { wait(); } //espera vez
clienteDaVez = c;
switch (op) {
case -1: sacar(c, v); break;
case 1: depositar(c, v); break;
}
}
private synchronized void sacar(Cliente c, double valor) {
while (saldoCaixa <= valor) { wait(); } //espera saldo, vez
if (valor > 0) {
saldoCaixa -= valor; clienteDaVez = null;
notifyAll();
}
}
private synchronized void depositar(Cliente c, double valor) {
if (valor > 0 ) {
saldoCaixa += valor; clienteDaVez = null;
notifyAll();
}
}
} 21
Deadlock (2)

Cenrio 1:
Saldo do caixa: R$0.00
Cliente 1 (thread) atendido (recebe acesso do caixa),
deposita R$100.00 e libera o caixa
Cliente 2 (thread) atendido (recebe o acesso do caixa),
saca R$50.00 e libera o caixa
Cenrio 2: cliente 2 chega antes de cliente 1
Saldo do caixa: R$0.00
Cliente 2 atendido (recebe acesso do caixa), tenta sacar
R$50.00 mas no h saldo. Cliente 2 espera haver saldo.
Cliente 1 tenta ser atendido (quer depositar R$100.00)
mas no sua vez na fila. Cliente 1 espera sua vez.
DEADLOCK!
22
Exerccios

1. Implemente e rode o exemplo Trabalhador


mostrado neste captulo
2. Altere a classe para que o Thread rode para
sempre
Crie um mtodo parar() que altere um flag que faa o
loop infinito terminar
3. Implemente e rode o exemplo Produtor -
Consumidor
4. Implemente o exemplo de deadlock e encontre
um meio de evit-lo.

23
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
24
Java 2 Standard Edition

Colees,
Propriedades,
Resources e Strings
Helder da Rocha
www.argonavis.com.br
1
Assuntos abordados neste mdulo

Colees
Vetores, comparao e ordenao
Listas e Conjuntos
Iteradores
Mapas
Propriedades
Manipulao de strings
Classes String, StringBuffer e StringTokenizer
Classes para expresses regulares em Java
Recursos avanados
ClassLoader: resources e reflection (fundamentos)
JavaBeans

2
O que so colees?

So estruturas de dados comuns


Vetores (listas)
Conjuntos
Pilhas
rvores binrias
Tabelas de hash
etc.
Oferecem formas diferentes de colecionar dados com
base em fatores como
Eficincia no acesso ou na busca ou na insero
Forma de organizao dos dados
Forma de acesso, busca, insero

3
Java Collections API

Oferece uma biblioteca de classes e interfaces (no


pacote java.util) que
Implementa as principais estruturas de dados de forma
reutilizvel (usando apenas duas interfaces comuns)
Oferece implementaes de cursor para iterao (Iterator
pattern) para extrair dados de qualquer estrutura usando
uma nica interface
Oferece implementaes de mtodos estticos utilitrios
para manipulao de colees e vetores

4
Tipos de colees em Java

Vetores
Mecanismo nativo para colecionar valores primitivos e
referncias para objetos
Podem conter objetos (referncias) tipos primitivos
Forma mais eficiente de manipular colees
Colees
No suporta primitivos (somente se forem empacotados
dentro de objetos)
Classes e interfaces do pacote java.util
Interfaces Collection, List, Set e Map e implementaes
Iterator, classes utilitrias e colees legadas

5
Vetores de objetos

Forma mais eficiente de manter referncias


Caractersticas
Tamanho fixo. preciso criar um novo vetor e copiar o
contedo do antigo para o novo. Vetores no podem ser
redimensionados depois de criados.
Quantidade mxima de elementos obtida atravs da
propriedade length (comprimento do vetor)
Verificados em tempo de execuo. Tentativa de acessar
ndice inexistente provoca, na execuo, um erro do tipo
ArrayIndexOutOfBoundsException
Tipo definido. Pode-se restringir o tipo dos elementos que
podem ser armazenados

6
Vetores so objetos
Quando um vetor criado no heap, ele possui "mtodos" e
campos de dados como qualquer outro objeto
Diferentes formas de inicializar um vetor
class
class Coisa
Coisa {}
{} //
// uma
uma classe
classe
(...)
(...)
Coisa[]
Coisa[] a;
a; //
// referncia
referncia do
do vetor
vetor (Coisa[])
(Coisa[]) null
null

Coisa[]
Coisa[] bb == new
new Coisa[5];
Coisa[5]; //
// referncias
referncias Coisa
Coisa null
null

Coisa[]
Coisa[] cc == new
new Coisa[4];
Coisa[4];
for
for (int
(int ii == 0;
0; ii << c.length;
c.length; i++)
i++) {{
c[i]
c[i] == new
new Coisa();
Coisa(); //// refs.
refs. Coisa
Coisa inicializadas
inicializadas
}}

Coisa[]
Coisa[] dd == {new
{new Coisa(),
Coisa(), new
new Coisa(),
Coisa(), new
new Coisa()};
Coisa()};

aa == new
new Coisa[]
Coisa[] {new
{new Coisa(),
Coisa(), new
new Coisa()};
Coisa()};
7
Como retornar vetores

Como qualquer vetor (mesmo de primitivos)


objeto, s possvel manipul-lo via referncias
Atribuir um vetor a uma varivel copia a referncia do
vetor varivel
int[] vet = intArray; // se intArray for int[]
Retornar um vetor atravs de um mtodo
retorna a referncia para o vetor
int[] aposta = sena.getDezenas();

public static int[] getDezenas() {


int[] dezenas = new int[6];
for (int i = 0; i < dezenas.length; i++) {
dezenas[i] = Math.ceil((Math.random()*50));
}
return dezenas;
}
8
Como copiar vetores

Mtodo utilitrio de java.lang.System


static void arraycopy(origem_da_copia, offset,
destino_da_copia, offset,
num_elementos_a_copiar)
Ex:
int[] um = {12, 22, 3};
int[] dois = {9, 8, 7, 6, 5};
System.arraycopy(um, 0, dois, 1, 2);

Resultado: dois: {9, 12, 22, 6, 5};

Vetores de objetos
Apenas as referncias so copiadas (shallow copy)

9
Exerccios

1. Vetores e System.arraycopy()
(a) Crie dois vetores de inteiros. Um com 10 elementos e
outro com 20.
(b) Preencha o primeiro com uma seqncia e o segundo
com uma srie exponencial.
(c) Crie uma funo esttica que receba um vetor e
retorne uma String da forma "[a1, a2, a3]" onde a* so
elementos do vetor.
(d) Imprima os dois vetores.
(e) Copie um vetor para o outro e imprima novamente.
(f) experimente mudar os offsets e veja as mensagens
obtidas.

10
java.util.Arrays

Classe utilitria com diversos mtodos estticos para


manipulao de vetores
Mtodos suportam vetores de quaisquer tipo
Principais mtodos (sobrecarregados p/ vrios tipos)
void Arrays.sort(vetor)
- Usa Quicksort para primitivos
- Usa Mergesort para objetos (classe do objeto deve implementar a
interface Comparable)
boolean Arrays.equals(vetor1, vetor2)
int Arrays.binarySearch(vetor, chave)
void Arrays.fill(vetor, valor)

11
Ordenao

Para ordenar objetos preciso compar-los.


Como estabelecer os critrios de comparao?
equals() apenas informa se um objeto igual a outro,
mas no informa se " maior" ou "menor"
Soluo: interface java.lang.Comparable
Mtodo a implementar:
public int compareTo(Object obj);
Para implementar, retorne
Um inteiro menor que zero se objeto atual for "menor"
que o recebido como parmetro
Um inteiro maior que zero se objeto atual for "maior" que
o recebido como parmetro
Zero se objetos forem iguais
12
Exemplo: java.lang.Comparable
public class Coisa implements Comparable {
private int id;
public Coisa(int id) {
this.id = id;
}
public int compareTo(Object obj) {
Coisa outra = (Coisa) obj;
if (id > outra.id) return 1;
if (id < outra.id) return -1;
if (id == outra.id) return 0;
}
}
Como usar
Coisa c1 = new Coisa(123);
Coisa c2 = new Coisa(456);
if (c1.compareTo(c2)==0) System.out.println("igual");
Coisa coisas[] = {c2, c1, new Coisa(3)};
Arrays.sort(coisas);
Usa compareTo() 13
Comparator

Comparable exige que a classe do objeto a ser


comparado implemente uma interface
E se uma classe inaccessvel no a implementa?
O que fazer se voc no tem acesso para modificar ou
estender a classe?
Soluo: interface utilitria java.util.Comparator
Crie uma classe utilitria que implemente Comparator e
passe-a como segundo argumento de Arrays.sort().
Mtodo a implementar:
public int compare(Object o1, Object o2);

14
Exemplo: java.util.Comparator
public class MedeCoisas implements Comparator {
public int compare(Object o1, Object o2) {
Coisa c1 = (Coisa) o1;
Coisa c2 = (Coisa) o2;
if (c1.id < c2.id) return 1;
if (c1.id > c2.id) return -1;
if (c1.id == c2.id) return 0;
}
}
Ordenando ao contrrio
Como usar
Coisa c1 = new Coisa(123);
Coisa c2 = new Coisa(456);
Comparator comp = new MedeCoisas();
if(comp.compare(c1, c2)==0) System.out.println("igual");
Coisa coisas[] = {c2, c1, new Coisa(3)};
Arrays.sort(coisas, new MedeCoisas());

Usa compare() de MedeCoisas que tem precedncia sobre compareTo() de Coisa


15
No confunda Comparator e Comparable

Ao projetar classes novas, considere sempre


implementar java.lang.Comparable
Objetos podero ser ordenados mais facilmente
Critrio de ordenao faz parte do objeto
compareTo() compara objeto atual com um outro
java.util.Comparator no faz parte do objeto
comparado
Implementao de Comparator uma classe utilitria
Use quando objetos no forem Comparable ou quando
no quiser usar critrio de ordenao original do objeto
compare() compara dois objetos recebidos

16
Outras funes teis de Arrays
boolean equals(vetor1, vetor2)
Retorna true apenas se vetores tiverem o mesmo contedo
(mesmas referncias) na mesma ordem
S vale para comparar vetores do mesmo tipo primitivo ou
vetores de objetos
No serve para referncias!
void fill(vetor, valor)
Preenche o vetor (ou parte do vetor) com o valor passado
como argumento (tipo deve ser compatvel)
int binarySearch(vetor, valor)
Retorna inteiro com posio do valor no vetor ou valor
negativo com a posio onde deveria estar
No funciona se o vetor no estiver ordenado
Se houver valores duplicados no garante qual ir ser
localizado 17
Exerccios (2)

2. interface java.lang.Comparable
a) Use ou crie uma classe Circulo que tenha x, y e raio
inteiros e um construtor que receba os trs parmetros
para inicializar um novo Circulo. A classe deve ter
mtodos equals() e toString().
b) Faa o Circulo implementar Comparable. Use o raio
como critrio de ordenao
c) Em um main(), crie um vetor de 10 Crculos de
tamanho diferente. Coloque-os em ordem e imprima o
resultado

18
Exerccios (3)

3. Escreva um java.util.Comparator que ordene


Strings de acordo com o ltimo caractere
Crie uma classe que implemente Comparator
(LastCharComparator)
Use s.charAt(s.length() -1) (mtodo de String s) para
obter o ltimo caractere e us-lo em compare()
Use um vetor de palavras. Imprima o vetor na ordem
natural, uma palavra por linha
Rode o Arrays.sort() usando o Comparator que voc criou
e imprima o vetor novamente

19
Colees
Classes e interfaces do pacote java.util que representam
listas, conjuntos e mapas
Soluo flexvel para armazenar objetos
Quantidade armazenada de objetos no fixa, como ocorre
com vetores
Poucas interfaces (duas servem de base) permitem maior
reuso e um vocabulrio menor de mtodos
add(), remove() - principais mtodos de interface Collection
put(), get() - principais mtodos de interface Map
Implementaes parciais (abstratas) disponveis para cada
interface
H duas ou trs implementaes de cada interface

20
As interfaces

Colees de Colees de
elementos individuais pares de elementos

java.util.Collection java.util.Map
Pares chave/valor
(vetor associativo)
Collection de valores
(podem repetir)
Set de chaves
java.util.List java.util.Set (unvocas)

seqncia definida seqncia arbitrria


elementos indexados elementos no repetem

21
Principais implementaes concretas

java.util.List java.util.Set java.util.Map

LinkedList TreeSet TreeMap

ArrayList HashSet
HashMap

Alguns detalhes foram omitidos:


Classes abstratas intermedirias
Interfaces intermedirias
Implementaes menos usadas
22
Desvantagens das Colees

Menos eficientes que vetores


No aceitam tipos primitivos (s empacotados)
No permitem restringir o tipo especfico dos objetos
guardados (tudo java.lang.Object)
Aceitam qualquer objeto: uma coleo de Galinhas aceita
objetos do tipo Raposa
Requer cast na sada para poder usar objeto
List galinheiro = new ArrayList(); Ocorrer ClassCastException
galinheiro.add(new Galinha("Chocagilda")); quando Object retornado
galinheiro.add(new Galinha("Cocotalva")); apontar para uma Raposa e
galinheiro.add(new Raposa("Galius")); no para uma Galinha
for (int i = 0; i < galinheiro.size(); i++) {
Galinha g = (Galinha) galinheiro.get(i);
g.ciscar();
}

23
Typesafe Collection
Pode-se criar uma implementao de coleo que restringe o
tipo de objetos que aceita usando delegao
A classe abaixo uma coleo type-safe, que no permite a
entrada de objetos que no sejam do tipo Galinha ou
descendentes
Para recuperar objetos, no necessrio usar cast!
import java.util.*;
public class Galinheiro {
private List galinhas;
public Galinheiro(List list) { No compila!
galinhas = list;
}
No requer cast!
public get(int idx) {
return (Galinha) galinhas.get(idx);
}
public add(Galinha g) { Galinheiro g =
galinhas.add(g); new Galinheiro(new ArrayList());
} g.add(new Galinha("Frida"));
} // g.add(new Raposa("Max"));
Galinha frida = g.get(0);
24
Interface Iterator
Para navegar dentro de uma Collection e selecionar cada
objeto em determinada seqncia
Uma coleo pode ter vrios Iterators
Isola o tipo da Coleo do resto da aplicao
Mtodo iterator() (de Collection) retorna Iterator
package java.util;
java.util.Iterator
public interface Iterator {
boolean hasNext();
Object next();
void remove(); java.util.ListIterator
} hasPrevious()
previous()
ListIterator possui mais mtodos
add(Object)
Mtodo listIterator() de List retorna set(Object)
ListIterator
25
Iterator (exemplo tpico)

HashMap map = new HashMap();


map.put("um", new Coisa("um"));
map.put("dois", new Coisa("dois"));
map.put("tres", new Coisa("tres"));

(...)

Iterator it = map.values().iterator();
while(it.hasNext()) {
Coisa c = (Coisa)it.next();
System.out.println(c);
}

26
Interface Collection

Principais subinterfaces
List
Set
Principais mtodos (herdados por todas as
subclasses)
boolean add(Object o): adiciona objeto na coleo
boolean contains(Object o)
boolean isEmpty()
Iterator iterator(): retorna iterator
boolean remove(Object o)
int size(): retorna o nmero de elementos
Object[] toArray(Object[]): converte coleo em Array

27
Interface List

Principais subclasses
ArrayList
LinkedList
Principais mtodos adicionais
void add(int index, Object o): adiciona objeto na posio
indicada (empurra elementos existentes para a frente)
Object get(int index): recupera objeto pelo ndice
int indexOf(Object o): procura objeto e retorna ndice da
primeira ocorrncia
Object set(int index, Object o): grava objeto na posio
indicada (apaga qualquer outro que ocupava a posio).
Object remove(int index)
ListIterator listIterator(): retorna um iterator
28
Implementaes: ArrayList e LinkedList

ArrayList
Escolha natural quando for necessrio usar um vetor
redimensionvel: mais eficiente para leitura
Implementado internamente com vetores
Ideal para acesso aleatrio
LinkedList
Muito mais eficiente que ArrayList para remoo e
insero no meio da lista
Ideal para implementar pilhas, filas unidirecionais e
bidirecionais. Possui mtodos para manipular essas
estruturas
Ideal para acesso seqencial

29
List: exemplo

List lista = new ArrayList();


lista.add(new Coisa("um"));
lista.add(new Coisa("dois"));
lista.add(new Coisa("tres"));

(...)

Coisa c3 = lista.get(2); // == ndice de vetor


ListIterator it = lista.listIterator();
Coisa c = it.last();
Coisa d = it.previous();
Coisa[] coisas =
(Coisa[])list.toArray(new Coisa[lista.size()]);

30
Interface Set

Set representa um conjunto matemtico


No possui valores repetidos
Principais subclasses
TreeSet (implements SortedSet)
HashSet (implements Set)
Principais mtodos alterados
boolean add(Object): s adiciona o objeto se ele j no
estiver presente (usa equals() para saber se o objeto o
mesmo)
contains(), retainAll(), removeAll(), ...: redefinidos para
lidar com restries de no-duplicao de objetos (esses
mtodos funcionam como operaes sobre conjuntos)

31
Exemplo
Set conjunto = new HashSet();
conjunto.add("Um");
conjunto.add("Dois");
conjunto.add("Tres");
conjunto.add("Um");
conjunto.add("Um");
Iterator it = conjunto.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}

Imprime
Um
Dois
Tres

32
Interface Map

Objetos Map so semelhantes a vetores mas, em vez


de ndices numricos, usam chaves, que so objetos
Chaves so unvocas (um Set)
Valores podem ser duplicados (um Collection)
Principais subclasses: HashMap e TreeMap
Mtodos
void put(Object key, Object value): acrescenta um objeto
Object get (Object key): recupera um objeto
Set keySet(): retorna um Set de chaves
Collection values(): retorna um Collection de valores
Set entrySet(): retorna um set de pares chave-valor
contendo objetos representados pela classe interna
Map.Entry
33
Implementaes de Map e Map.Entry

HashMap
Escolha natural quando for necessrio um vetor associativo
Acesso rpido: usa Object.hashCode() para organizar e
localizar objetos
TreeMap
Mapa ordenado
Contm mtodos para manipular elementos ordenados
Map.Entry
Classe interna usada para manter pares chave-valor em
qualquer implementao de Map
Principais mtodos: Object getKey(), retorna a chave do
par; Object getValue(), retorna o valor.

34
Exemplo

Map map = new HashMap();


map.put("um", new Coisa("um"));
map.put("dois", new Coisa("dois"));
(...)
Set chaves = map.keySet();
Collection valores = map.values();
(...)
Coisa c = (Coisa) map.get("dois");
(...)
Set pares = map.entrySet();
Iterator entries = pares.iterator();
Map.Entry one = entries.next();
String chaveOne = (String)one.getKey();
Coisa valueOne = (Coisa)one.getValue();

35
HashMap: como funciona

HashMap Objetos com mesmo


hashCode()

1 1 1 1 1
put()
5
5 5 5
12
get() Objetos sero
56
12
diferenciados pelo
equals()
56 56

36
Colees legadas de Java 1.0/1.1
So thread-safe e, portanto, menos eficientes
Vector, implementa List
Use ArrayList, e no Vector, em novos programas
Stack, subclasse de Vector
Implementa mtodos de pilha: void push(Object), Object
pop() e Object peek().
Hashtable, implementa Map
Use HashMap, e no Hashtable, em novos programas
Enumeration: tipo de Iterator
Retornada pelo mtodo elements() em Vector, Stack,
Hashtable e por vrios outros mtodos de classes mais
antigas da API Java
boolean hasMoreElements(): equivalente a
Iterator.hasNext()
Object nextElement(): equivalente a Iterator.next()
Use Iterator, e no Enumeration, em novos programas 37
Propriedades do sistema e Properties
java.util.Properties: Tipo de Hashtable usada para
manipular com propriedades do sistema
Propriedades podem ser
1. Definidas pelo sistema* (user.dir, java.home, file.separator)
2. Passadas na linha de comando java (-Dprop=valor)
3. Carregadas de arquivo de propriedades contendo pares nome=valor
4. Definidas internamente atravs da classe Properties
Para ler propriedades passadas em linha de comando (2) ou
definidas pelo sistema (1) use System.getProperty():
String javaHome = System.getProperty("java.home");
Para ler todas as propriedades (sistema e linha de comado)
Properties props = System.getProperties();
Para adicionar uma nova propriedade lista
props.setProperty("dir.arquivos", "/imagens");

* Veja Javadoc de System.getProperties() para uma lista. 38


Arquivos de propriedades
teis para guardar valores que sero usados pelos programas
Pares nome=valor
Podem ser carregados de um caminho ou do classpath (resource)
Sintaxe
propriedade=valor ou propriedade: valor
Uma propriedade por linha (termina com \n ou \r)
Para continuar na linha seguinte, usa-se "\"
Caracteres "\", ":" e "=" so reservados e devem ser escapados com "\"
Comentrios: linhas que comeam com ! ou # ou vazias so ignoradas
Exemplo
# Propriedades da aplicao
driver=c:\\drivers\\Driver.class
classe.um=pacote.Classe
nome.aplicacao=JCoisas Verso 1.0\:Beta
Para carregar em propriedades (Properties props)
props.load(new FileInputStream("arquivo.conf"));
39
java.util.Properties

Mtodos de Properties
load(InputStream in): carrega um arquivo de Properties
para o objeto Properties criado (acrescenta propriedades
novas e sobrepe existentes do mesmo nome)
store(OutputStream out, String comentario): grava no
OutputStream as propriedades atualmente armazenadas
no objeto Properties. O comentrio pode ser null.
String getProperty(String nome): retorna o valor da
propriedade ou null se ela no faz parte do objeto
String setProperty(String nome, String valor): grava uma
nova propriedade
Enumeration propertyNames(): retorna uma lista com os
nomes de propriedades armazenados no objeto
40
A classe java.lang.String
uma seqncia de caracteres imutvel
Representa uma cadeia de caracteres Unicode
Otimizada para ser lida, mas no alterada
Nenhum mtodo de String modifica o objeto armazenado
H duas formas de criar Strings
Atravs de construtores, metodos, fontes externas, etc:
String s1 = new String("Texto");
String s2 = objeto.getText(); // mtodo de API
String s3 = coisa.toString();
Atravs de atribuio de um literal
String s3 = "Texto";
Strings criados atravs de literais so automaticamente
armazenadas em um pool para possvel reuso
Mesmo objeto reutilizado: comparao de Strings iguais criados
atravs de literais revelam que se tratam do mesmo objeto
41
Pool de strings
Como Strings so objetos imutveis, podem ser reusados
Strings iguais criados atravs de literais so o mesmo objeto
String um = "Um";
Todos os blocos de texto
String dois = "Um";
abaixo so impressos
if (um == dois)
System.out.println("um e dois so um!");
Mas Strings criados de outras formas no so
String tres = new String("Um");
if (um != tres)
System.out.println("um nao trs!");
Literais so automaticamente guardados no pool. Outros
Strings podem ser acrescentados no pool usando intern():
quatro = tres.intern();
if (um == quatro)
System.out.println("quatro um!");
42
Principais Mtodos de String
Mtodos que criam novos Strings
String concat(String s): retorna a concatenao do String atual com
outro passado como parmetro
String replace(char old, char new): troca todas as ocorrncias de um
caractere por outro
String substring(int start, int end): retorna parte do String incluindo a
posio inicial e exclundo a final
String toUpperCase() e String toLowerCase(): retorna o String em caixa
alta e caixa baixa respectivamente
Mtodos para pesquisa
boolean endsWith(String) e startsWith(String)
int indexOf(String), int indexOf(String, int offset): retorna posio
char charAt(int posio): retorna caractere em posio
Outros mtodos
char[] toCharArray(): retorna o vetor de char correspondente ao String
int length(): retorna o comprimento do String
43
A classe StringBuffer
uma seqncia de caracteres mutvel
Representa uma cadeia de caracteres Unicode
Otimizada para ser alterada, mas no lida
StringBuffers podem ser criados atravs de seus construtores
StringBuffer buffer1 = new StringBuffer();
StringBuffer buffer2 = new StringBuffer("Texto inicial");
StringBuffer buffer3 = new StringBuffer(40);
Mtodos de StringBuffer operam sobre o prprio objeto
StringBuffer append(String s): adiciona texto no final
StringBuffer insert(int posio, String s): insere na posio
void setCharAt(int posio, char c): substitui na posio
String toString(): transforma o buffer em String para que possa ser lido
Exemplo
StringBuffer buffer = new StringBuffer("H");
buffer.append("e").append("l").append("l").append(o");
System.out.println(buffer.toString());
44
Quando usar String e StringBuffer

Use String para manipular com valores constantes


Textos carregados de fora da aplicao
Valores literais
Textos em geral que no sero modificados intensivamente
Use StringBuffer para alterar textos
Acrescentar, concatenar, inserir, etc.
Prefira usar StringBuffer para construir Strings
Concatenao de strings usando "+" extremamente
cara: um novo objeto criado em cada fase da compilao
apenas para ser descartado em seguida
Use StringBuffer.append() e, no final, transforme o
resultado em String

45
java.util.StringTokenizer

Classe utilitria que ajuda a dividir texto em tokens


Recebe um String e uma lista de tokens
Usa um Enumeration para iterar entre os elementos
Exemplo:
String regStr = "Primeiro,Segundo,Terceiro,Quarto";
StringTokenizer tokens =
new StringTokenizer(regStr, ",");
String[] registros = null;
List regList = new ArrayList();
while (tokens.hasMoreTokens()) {
String item = tokens.nextToken();
regList.add(item);
}
int size = regList.size();
registros = (String[])regList.toArray(new String[size]);

46
Expresses regulares (1.4)

O pacote java.util.regex contm duas classes que


permitem a compilao e uso de expresses regulares
(padres de substituio): Pattern e Matcher
Exemplo
String padrao = "a*b?";
O padro de pesquisa pode ser compilado
Pattern p = Pattern.compile(padrao);
e reutilizado
Matcher m = p.matcher("aaaaab");
if(m.matches()) { ...}
Ou usado diretamente (sem compilacao)
if(Pattern.matches("a*b?", "aaaaa")) { ... }

Veja mais sobre expresses regulares nos JavaDocs 47


Resources
Arquivos de propriedades, arquivos de configurao, imagens
e outros freqentemente no esto em local definido
Aplicaes que podem mudar de lugar
Aplicaes empacotadas em um JAR
Usando o ClassLoader, possvel carregar arquivos do disco
sem precisar saber sua localizao exata, desde que estejam
no Class path
Usa-se um padro que define parte do caminho at o recurso (deve-
se usar o caminho mais completo possvel). Ex: conf/config.txt
Sistema ir localizar o arquivo e retornar uma URL ou stream para
que seja possvel ler os dados
Exemplo
String recurso = "config/dados.properties";
InputStream stream =
ClassLoader.getSystemResourceAsStream(recurso);
System.getProperties().load(stream);
48
Reflection
Reflection o nome de uma API que permite descobrir e
utilizar informaes sobre um objeto em tempo de execuo,
tendo-se apenas o bytecode e nome de sua classe
Carregar classes pelo nome dinamicamente via ClassLoader
Instanciar objetos dessas classes
Descobrir e chamar todos os seus mtodos
Com reflection, possvel escrever programas genricos, que
se adaptam a uma API desconhecida
As classes usadas so java.lang.Class e vrias outras no
pacote java.lang.reflect
Exemplo
Class classe = Class.forName("com.xyz.ClasseNova");
Method metodo = classe.getDeclaredMethod("toString");
Object o = classe.newInstance(); // cria novo objeto
metodo.invoke(o);

49
JavaBeans
Um JavaBean um componente reutilizvel que tem como
finalidade representar um modelo de dados
Define convenes para que atributos de dados sejam
tratados como "propriedades"
Permite manipulao de suas propriedades, ativao de
eventos, etc. atravs de um framework que reconhea as
convenes utilizadas
Basicamente, um JavaBean uma classe Java qualquer, que
tem as seguintes caractersticas
Construtor pblico default (sem argumentos)
Atributos de dados private
Mtodos de acesso (acessors) e/ou de alterao (mutators)
para cada atributo usando a conveno getPropriedade() (ou
opcionalmente isPropriedade() se boolean) e setPropriedade()
50
Exemplo de um JavaBean
public class UmJavaBean {
private String msg;
private int id;

public JavaBean () {}

public String getMensagem() {


return mensagem;
}
public void setMensagem(String msg) {
this.msg = msg;
}
public String getId() { Java Bean

return mensagem; UmJavaBean


} mensagem:String RW
public void metodo() { id:int R
... metodo():void
}
}
51
Exerccios
4. Implemente uma Type Safe Collection (List) que possa
conter Crculos
Teste a coleo adicionando, removendo, buscando e imprimindo os
objetos da lista
Crie um mtodo que retorne a lista como um array.
5. Aplicao da Biblioteca: Use os recursos de pesquisa em
Strings para e implementar o mtodo findPublicacoes() da
aplicao da biblioteca
O String passado pode ser uma palavra presente no ttulo da
publicao procurada.
6. Guarde os assuntos em um arquivo de propriedades
(assuntos.properties) no classpath e carregue-os na
inicializao da aplicao como propriedades do sistema
Use ClassLoader.getSystemResourceAsStream()
Copie as propriedades para o HashMap correspondente (assuntos)
52
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
53
Java 2 Standard Edition

Entrada
e Sada
Helder da Rocha
www.argonavis.com.br
1
Assuntos abordados
Este mdulo explora os componentes mais
importantes do pacote java.io e outros recursos da
linguagem relacionados E/S e arquivos
A classe File, que representa arquivos e diretrios
Objetos que implementam entrada e sada
InputStream e OutputStream, Readers e Writers
Compresso com GZIP streams
FileChannels
Objeto que implementa arquivo de acesso aleatrio
RandomAccessFile
Recursos de serializao bsica
Serializable, ObjectOutputStream e ObjectInputStream
Logging: fundamentos 2
O pacote java.io
Oferece abstraes que permitem ao programador
lidar com arquivos, diretrios e seus dados de uma
maneira independente de plataforma
File, RandomAccessFile
Oferecem recursos para facilitar a manipulao de
dados durante o processo de leitura ou gravao
bytes sem tratamento
caracteres Unicode
dados filtrados de acordo com certo critrio
dados otimizados em buffers
leitura/gravao automtica de objetos
Pacote java.nio (New I/O): a partir do J2SDK 1.4.0
Suporta mapeamento de memria e bloqueio de acesso
3
A classe File
Usada para representar o sistema de arquivos
apenas uma abstrao: a existncia de um objeto File no
significa a existncia de um arquivo ou diretrio
Contm mtodos para testar a existncia de arquivos, para definir
permisses (nos S.O.s onde for aplicvel), para apagar arquivos,
criar diretrios, listar o contedo de diretrios, etc.
Alguns mtodos
String getAbsolutePath()
String getParent(): retorna o diretrio (objeto File) pai
boolean exists()
boolean isFile()
boolean isDirectory()
boolean delete(): tenta apagar o diretrio ou arquivo
long length(): retorna o tamanho do arquivo em bytes
boolean mkdir(): cria um diretrio com o nome do arquivo
String[] list(): retorna lista de arquivos contido no diretrio
4
File: exemplo de uso
File diretorio = new File("c:\tmp\cesto");
diretorio.mkdir(); // cria, se possvel
File arquivo = new File(diretorio, "lixo.txt");
FileOutputStream out =
new FileOutputStream(arquivo);
// se arquivo no existe, tenta criar
out.write( new byte[]{'l','i','x','o'} );

File subdir = new File(diretorio, "subdir");


subdir.mkdir();
String[] arquivos = diretorio.list();
for (int i = 0; arquivos.length; i++) {
File filho = new File(diretorio, arquivos[i]);
System.out.println(filho.getAbsolutePath());
}
if (arquivo.exists()) {
arquivo.delete(); O bloco de cdigo acima
} precisa tratar IOException
5
Fluxos de Entrada e Sada

H vrias fontes de onde se deseja ler ou destinos


para onde se deseja gravar ou enviar dados
Arquivos
Conexes de rede
Console (teclado / tela)
Memria
H vrias formas diferentes de ler/escrever dados
Seqencialmente / aleatoriamente
Como bytes / como caracteres
Linha por linha / palavra por palavra, ...
APIs Java para I/O oferecem objetos que abstraem
fontes/destinos (ns) e fluxos de bytes e caracteres
6
Classes e interfaces para fluxos de E/S

Dois grupos:
e/s de bytes: InputStream e OutputStream
e/s de chars: Reader e Writer
InputStream OutputStream Reader Writer
ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter
FileInputStream FileOutputStream PipedReader BufferedWriter
ObjectInputStream StringReader
ObjectOutputStream FilterWriter
PipedInputStream FilterReader
PipedOutputStream PipedWriter
SequenceInputStream PushbackReader
FilterOutputStream PrintWriter
FilterInputStream InputStreamReader
BufferedInputStream BufferedOutputStream StringWriter
FileReader
DataInputStream DataOutputStream OuputStreamWriter
Buffered Reader
PushbackInputStream PrintStream
LineNumberReader FileWriter

7
E/S de bytes
InputStream
Classe genrica (abstrata) para lidar com fluxos de bytes de entrada e
ns de fonte (dados para leitura).
Mtodo principal: read()
OutputStream
Classe genrica (abstrata) para lidar com fluxos de bytes de sada e
ns de destino (dados para gravao).
Mtodo principal: write()
Principais implementaes
Ns (fontes): FileInputStream (arquivo), ByteArrayInputStream
(memria) e PipedInputStream (pipe).
Processamento de entrada: FilterInputStream (abstract) e subclasses
Ns (destinos): FileOutputStream (arquivo), ByteArrayOutputStream
(memria) e PipedOutputStream (pipe).
Processamento de sada: FilterOutputStream (abstract) e subclasses.
8
Mtodos de InputStream e OutputStream

Principais mtodos de InputStream


int read(): retorna um byte (ineficiente)
int read(byte[] buffer): coloca bytes lidos no vetor
passado como parmetro e retorna quantidade lida
int read(byte[] buffer, int offset, int length): idem
void close(): fecha o stream
int available(): nmero de bytes que h para ler agora
Mtodos de OutputStream
void write(int c): grava um byte (ineficiente)
void write(byte[] buffer)
void write(byte[] buffer, int offset, int length)
void close(): fecha o stream (essencial)
void flush(): esvazia o buffer
9
Exemplo de leitura e gravao de arquivo
Trecho de programa que copia um arquivo*
String nomeFonte = args[0];
String nomeDestino = args[1];
File fonte = new File(nomeFonte);
File destino = new File(nomeDestino);
if (fonte.exists() && !destino.exists()) {
FileInputStream in = new FileInputStream(fonte);
FileOutputStream out = new FileOutputStream(destino);
byte[] buffer = new byte[8192];
int length = in.read(buffer);
while ( length != -1) { -1 sinaliza EOF
out.write(buffer, 0, length);
in.read(buffer);
}
Grava apenas os bytes lidos
in.close();
out.flush(); (e no o buffer inteiro)
out.close();
}
* Mtodo e blocos try-catch (obrigatrios) foram omitidos para maior clareza. 10
FilterStreams
Implementam o padro de projeto Decorator
So concatenados em streams primitivos oferecendo
mtodos mais teis com dados filtrados
FilterInputStream: recebe fonte de bytes e oferece
mtodos para ler dados filtrados. Implementaes:
DataInputStream: readInt(), readUTF(), readDouble()
BufferredInputStream: read() mais eficiente
ObjectOutputStream: readObject() l objetos serializados
FilterOutputStream: recebe destino de bytes e
escreve dados via filtro. Implementaes:
DataOutputStream: writeUTF(), writeInt(), etc.
BufferedOutputStream: write() mais eficiente
ObjectOutputStream: writeObject() serializa objetos
PrintStream: classe que implementa println()
11
Exemplo: leitura de um stream fonte (arquivo)

// objeto do tipo File


File tanque = new File("agua.txt");
// referncia FileInputStream
// cano conectado no tanque
FileInputStream cano =
new FileInputStream(tanque);
// l um byte a partir do cano
byte octeto = cano.read();
12
Usando filtro para ler char

InputStreamReader um filtro que converte bytes


em chars
Para ler chars de um arquivo pode-se usar diretamente
um FileWriter em vez de concatenar os filtros abaixo.
// objeto do tipo File
File tanque = new File("agua.txt");
// referncia FileInputStream
// cano conectado no tanque
FileInputStream cano =
new FileInputStream(tanque);
// filtro chf conectado no cano
InputStreamReader chf =
new InputStreamReader(cano);
// l um char a partir do filtro chf
char letra = chf.read();
13
Usando outro filtro para ler linha

// filtro chf conectado no cano


InputStreamReader chf = new InputStreamReader(cano);
// filtro br conectado no chf
BufferedReader br = new BufferedReader (chf);
// l linha de texto a de br
String linha = br.readLine();
14
E/S de caracteres
Reader
Classe abstrata para lidar com fluxos de caracteres de entrada:
mtodo read() l um caractere (16 bits) por vez
Writer
Classe abstrata para lidar com fluxos de bytes de sada: mtodo
write() grava um caractere (16 bits) por vez
Principais implementaes
Ns (destinos): FileWriter (arquivo), CharArrayWriter (memria),
PipedWriter (pipe) e StringWriter (memria).
Processamento de sada: FilterWriter (abstract), BufferedWriter,
OutputStreamWriter (conversor de bytes para chars), PrintWriter
Ns (fontes): FileReader (arquivo), CharArrayReader (memria),
PipedReader (pipe) e StringReader (memria).
Processamento de entrada: FilterReader (abstract), BufferedReader,
InputStreamReader (conversor bytes p/ chars), LineNumberReader
15
Mtodos de Reader e Writer

Principais mtodos de Reader


int read(): l um char (ineficiente)
int read(char[] buffer): coloca chars lidos no vetor
passado como parmetro e retorna quantidade lida
int read(char[] buffer, int offset, int length): idem
void close(): fecha o stream
int available(): nmero de chars que h para ler agora
Mtodos de Writer
void write(int c): grava um char (ineficiente)
void write(char[] buffer)
void write(char[] buffer, int offset, int length)
void close(): fecha o stream (essencial)
void flush(): esvazia o buffer
16
Leitura e gravao de texto com buffer
A maneira mais eficiente de ler um arquivo de texto usar
FileReader decorado por um BufferedReader. Para gravar, use
um PrintWriter decorando o FileWriter
BufferedReader in = new BufferedReader(
new FileReader("arquivo.txt"));
StringBuffer sb =
new StringBuffer(new File("arquivo.txt").length());
String linha = in.readLine();
while( linha != null ) {
sb.append(linha).append('\n');
linha = in.readLine();
}
in.close();
String textoLido = sb.toString();
// (...)
PrintWriter out = new PrintWriter(
new FileWriter("ARQUIVO.TXT"));
out.print(textoLido.toUpperCase());
out.close();
17
Leitura da entrada padro e memria
A entrada padro (System.in) representada por um objeto
do tipo InputStream.
O exemplo abaixo l uma linha de texto digitado na entrada
padro e grava em uma String. Em seguida l
seqencialmente a String e imprime uma palavra por linha
BufferedReader stdin = new BufferedReader(
new InputStreamReader(System.in));
System.out.print("Digite uma linha:");
String linha = stdin.readLine());

StringReader rawIn = new StringReader(linha);


int c;
while((c = rawIn.read()) != -1)
if ( c == ' ') System.out.println();
else System.out.print((char)c);
}
18
RandomAccessFile

Classe "aliengena": no faz parte da hierarquia de


fluxos de dados do java.io
Implementa interfaces DataOutput e DataInput
Mistura de File com streams: no deve ser usado com
outras classes (streams) do java.io
Oferece acesso aleatrio a um arquivo atravs de um
ponteiro
Mtodos (DataOutput e DataInput) tratam da
leitura e escrita de Strings e tipos primitivos
void seek(long)
readInt(), readBytes(), readUTF(), ...
writeInt(), writeBytes(), writeUTF(), ...
19
RandomAccessFile

RandomAccessFile raf =
new RandomAccessFile ("arquivo.dat", "rw");

raf.seek(0) 0 0 0 11
raf.readLong()
raf.seek(11)
0 d 0 c (4 bytes)

0 0 j
raf.readChar()
(2 bytes) 0 a 0 v
0 a raf.seek(raf.length())

20
Exceptions
A maior parte das operaes de E/S provoca excees que
correspondem ou so subclasses de IOException
EOFException
FileNotFoundException
StreamCorruptedException
Para executar operaes de E/S preciso, portanto, ou
capturar IOException ou repassar a exceo atravs de
declaraes throws nos mtodos causadores
Nos exemplos mostrados o tratamento de excees foi
omitido. Tipicamente, as instrues close() ocorrem em um
bloco try-catch dentro de um bloco finally
try { ... } finally {
try { stream.close(); } catch (IOException e) {}
}
No adianta saber se o fechamendo to stream falhou
21
Serializao
Java permite a gravao direta de objetos em disco ou seu
envio atravs da rede
Para isto, o objeto deve declarar implementar java.io Serializable
Um objeto Serializable poder, ento
Ser gravado em qualquer stream usando o mtodo
writeObject() de ObjectOutputStream
Ser recuperado de qualquer stream usando o mtodo
readObject() de ObjectInputStream
Um objeto serializado um grafo que inclui dados da classe e
todas as suas dependncias
Se a classe ou suas dependncias mudar, o formato usado na
serializao mudar e os novos objetos sero incompatveis
com os antigos (no ser mais possvel recuperar arquivos
gravados com a verso antiga)
22
Exemplo: gravao e leitura de objetos
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream(armario)
);
Arco a = new Arco(); Gravao
Flecha f = new Flecha();
de
// grava objeto Arco em armario
out.writeObject(a);
objetos
// grava objeto flecha em armario
out.writeObject(f);

ObjectInputStream in = new ObjectInputStream(


new FileInputStream(armario)
Leitura de );
objetos na // recupera os dois objetos
mesma // mtodo retorna Object (requer cast)
ordem Arco primeiro = (Arco)in.readObject();
Flecha segundo = (Flecha)in.readObject();
23
ZIP e JAR

Os pacotes java.util.zip e java.util.jar permitem


comprimir dados e colecionar arquivos mantendo
intactas as estruturas de diretrios
Vantagens
Menor tamanho: maior eficincia de E/S e menor espao
em disco
Menos arquivos para transferir pela rede (tambm maior
eficincia de E/S)
Use classes de ZIP e JAR para colees de arquivos
ZipEntry, ZipFile, ZipInputStream, etc.
Use streams GZIP para arquivos individuais e para
reduzir tamanho de dados enviados pela rede
24
Exemplo com GZIP streams
GZIP usa o mesmo algoritmo usado em ZIP e JAR
mas no agrupa colees de arquivos
GZIPOutputStream comprime dados na gravao
GZIPInputStream expande dados durante a leitura
Para us-los, basta inclu-los na cadeia de streams:
ObjectOutputStream out = new ObjectOutputStream(
new java.util.zip.GZIPOutputStream(
new FileOutputStream(armario) ) );
Objeto gravado = new Objeto();
out.writeObject(gravado);
// (...)
ObjectInputStream in = new ObjectInputStream(
new java.util.zip.GZIPInputStream(
new FileInputStream(armario) ) );
Objeto recuperado = (Objeto)in.readObject();
25
FileChannel
Novidade no J2SDK 1.4
Permite ler e gravar arquivos, mapeando memria e
bloqueando acesso (afeta performance)
Mapeamento permite abrir o arquivo como se fosse um
vetor, usando a classe java.nio.ByteBuffer. Ideal para ler
arquivos consistindo de registros de tamanho fixo.
preciso importar java.nio.* e java.nio.channels.*;
Exemplo: ler registro de arquivo de registros fixos
FileInputStream stream = new FileInputStream("a.txt");
FileChannel in = stream.getChannel();
int len = (int) in.size();
ByteBuffer map = in.map(FileChannel.MapMode.READ_ONLY, 0, len);
final int TAM = 80; // tamanho de cada registro: 80 bytes
byte[] registro = new byte[TAM]; //array p/ guardar 1 registro
map.position( 5 * TAM ); // posiciona antes do 5o. registro
map.get( registro ); // preenche array com dados encontrados
26
Logging
Recurso introduzido no J2SDK 1.4
Oferece um servio que gera relatrios durante a execuo de
uma aplicao. Os relatrios so formados por eventos
escolhidos pelo programador e podem ter como destino:
A tela (console), um arquivo, uma conexo de rede, etc.
Os dados tambm podem ser formatados de diversas formas
Texto, XML e filtros
As mensagens so classificadas de acordo com a severidade,
em sete nveis diferentes. O usurio da aplicao pode
configur-la para exibir mais ou menos mensagens de acordo
com o nvel desejado
Principais classes
java.util.logging.Logger e java.util.logging.Level

27
Logger
Para criar um Logger, preciso usar seu construtor esttico:
Logger logger = Logger.getLogger("com.meupacote");
Os principais mtodos de Logger encapsulam os diferentes
nveis de detalhamento (severidade) ou tipos de informao.
Mtodos log() so genricos e aceitam qualquer nvel
config(String msg)
entering(String class, String method)
exiting(String class, String method)
fine(String msg)
finer(String msg)
finest(String msg)
info(String msg)
log(Level level, String msg)
severe(String msg)
throwing(String class, String method, Throwable e)
warning(String msg)
28
Exemplo de Logging

Exemplo da documentao da Sun [J2SDK14]


package com.wombat;
public class Nose{
// Obtain a suitable logger.
private static Logger logger =
Logger.getLogger("com.wombat.nose");

public static void main(String argv[]){


// Log a FINE tracing message
logger.fine("doing stuff");
try{
Wombat.sneeze();
} catch (Error ex){ // Log the error
logger.log(Level.WARNING,"trouble sneezing",ex);
}
logger.fine("done");
}
}
29
Nveis de severidade

As seguintes constantes da classe Level devem ser


usadas para indicar o nvel das mensagens gravadas
Level.OFF (no imprime nada no log)
Level.SEVERE (maior valor - imprime mensagens graves)
Level.WARNING
Level.INFO
Level.CONFIG
Level.FINE
Level.FINER
Level.FINEST (menor valor - imprime detalhamento)
Level.ALL (imprime tudo no log)
Quanto maior o valor escolhido pelo usurio, menos
mensagens so gravadas.
30
Exerccios
1. Escreva um programa que leia um arquivo de texto para
dentro de uma janela de aplicao grfica (TextArea)
2. Faa um programa que leia um arquivo XML ou HTML e
arranque todos os tags. Imprima na sada padro.
3. Aplicao da Biblioteca: Crie uma classe
RepositorioDadosArquivo que implemente RepositorioDados
mantenha arquivos armazenados em dois diretorios:
agentes/
publicacoes/
Cada diretrio dever armazenar um arquivo por registro. O
nome do arquivo deve ser o codigo do registro e os dados
devem estar guardados um em cada linha.
Pode-se usar BufferedReader.readLine() para l-los.

31
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
32
Java 2 Standard Edition

Classes internas

Helder da Rocha
www.argonavis.com.br 1
Classes internas
Classes podem ser membros de classes, de objetos ou locais
a mtodos. Podem at serem criadas sem nome, apenas com
corpo no momento em que instanciam um objeto
H poucas situaes onde classes internas podem ou devem
ser usadas. Devido complexidade do cdigo que as utiliza,
deve-se evitar usos no convencionais
Usos tpicos incluem tratamento de eventos em GUIs,
criao de threads, manipulao de colees e soquetes
Classes internas podem ser classificadas em quatro tipos
Classes dentro de instrues (classes annimas)
Classes dentro de mtodos (classes locais)
Classes dentro de objetos (membros de instncia)
Classes internas estticas (membros de classe)
2
Tipos de classes internas
So sempre classes dentro de classes. Exemplo:
class Externa {
private class Interna {
public int campo;
public void metodoInterno() {...}
}
public void metodoExterno() {...}
}
Podem ser private, protected, public ou package-private
Exceto as que aparecem dentro de mtodos, que so locais
Podem ser estticas:
E chamadas usando a notao Externa.Interna
Podem ser de instncia, e depender da existncia de objetos:
Externa e = new Externa();
Externa.Interna ei = e.new Externa.Interna();
Podem ser locais (dentro de mtodos)
E nas suas instrues podem no ter nome (annimas)
3
Classes estticas (internal classes)
Declaradas como static
Idnticas s classes externas, mas no tm campos static
Classe externa age como um pacote para vrias classes internas
estticas: Externa.Coisa, Externa.InternaUm
Compilador gera arquivo Externa$InternaUm.class
class Externa {
private static class InternaUm {
public int campo;
public void metodoInterno() {...}
}
public static class InternaDois
extends InternaUm {
public int campo2;
public void metodoInterno() {...}
}
public static interface Coisa {
void existe();
}
public void metodoExterno() {...}
}
4
Classes de instncia (embedded classes)
So membros do objeto, como mtodos e campos de dados
Requerem que objeto exista antes que possam ser usadas.
Externamente use referencia.new para criar objetos
Variveis de mesmo nome sempre se referem classe externa
Use NomeDaClasse.this para acessar campos internos
class Externa {
public int campoUm;
private class Interna {
public int campoUm;
public int campoDois;
public void metodoInterno() {
this.campoUm = 10; // Externa.campoUm
Interna.this.campoUm = 15;
}
}
public static void main(String[] args){
Interna e = (new Externa()).new Interna();
}
}
5
Classes dentro de mtodos (embedded)
Servem para tarefas "descartveis" j que deixam de existir
quando o mtodo acaba
Tm o escopo de variveis locais. Objetos criados, porm, podem
persistir alm do escopo do mtodo, se retornados
Se usa variveis locais do mtodo essas variveis devem ser
constantes (declaradas final), pois assim podem persistir aps a
concluso do mtodo.
public Multiplicavel calcular(final int a, final int b) {
class Interna implements Multiplicavel {
public int produto() {
return a * b; // usa a e b, que so constantes
}
}
return new Interna();
}
public static void main(String[] args){
Multiplicavel mul = (new Externa()).calcular(3,4);
int prod = mul.produto();
}
6
Classes annimas (dentro de instrues)
Classes usadas dentro de mtodos freqentemente servem
apenas para criar um objeto uma nica vez
A classe abaixo estende ou implementa SuperClasse, que pode ser
uma interface ou classe abstrata (o new, neste caso, indica a
criao da classe entre chaves, no da SuperClasse)
Object i = new SuperClasse() { implementao };
Compilador gera arquivo Externa$1.class, Externa$2.class,
public... Multiplicavel calcular(final int a, final int b) {
return new Multiplicavel() {
public int produto() { Compare com parte em
return a * b; preto e vermelho do
} A classe est dentro da instruo: slide anterior!
};
} preste ateno no ponto-e-vrgula!
public static void main(String[] args){
Multiplicavel mul = (new Externa()).calcular(3,4);
int prod = mul.produto();
}

7
Para que servem classes internas?

Mais reutilizao
Recurso poderoso quando combinado com interfaces e
herana - facilita implementao de delegao: tipo de
herana de implementao que combinando composio
com herana de interfaces (simula herana mltipla)
"Ponteiros seguros" apontando para mtodos localizados
em classes internas
Flexibilidade para desenvolver objetos descartveis
Riscos
Aumenta significativamente a complexidade do cdigo
Dificulta o trabalho de depurao (erros de compilador
so mais confusos em classes internas)
Evite fugir do convencional ao usar classes internas
8
Como delegao simula herana mltipla
ClasseConcretaUm
ClasseConcretaDois
Efeito metodoUm()
metodoDois() metodoCinco()
Desejado metodoTres() metodoQuatro()
(no permitido em Java)

ClasseDerivada

ClasseConcretaUm interface

metodoUm() InterfaceUm
metodoDois() metodoCinco()
metodoTres() metodoQuatro()
Efeito Possvel
em Java
ClasseDerivada
ClasseConcretaDois
deleg:ClasseConcretaUm
deleg metodoCinco()
metodoQuatro() metodoQuatro() Classes existentes
metodoCinco()
Classes novas
deleg.metodoQuatro()
9
Exerccios

1. Escreva uma aplicao que chame o mtodo


imprimir() de cada uma das classes do arquivo
Internas.java (cap15)
2. Implemente a classe InMethod de Internas.java
como uma classe annima.

10
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
11
Java 2 Standard Edition

Como construir
aplicaes grficas
e applets
Helder da Rocha
www.argonavis.com.br 1
AWT e Swing

AWT ou Abstract Window Toolkit o antigo conjunto


de ferramentas para interfaces grficas do Java
Serve para oferecer infraestrutura mnima de interface
grfica (nivela por baixo)
Componentes tm aparncia dependente de plataforma
Limitado em recursos devido a depender de suporte de
cada plataforma para os componentes oferecidos
Bugs e incompatibilidades entre plataformas
JFC (Java Foundation Classes) oferece uma interface
muito mais rica
Swing o nome dado coleo de componentes
preciso importar java.awt e javax.swing para usar JFC

2
Histria do AWT

Interface grfica: componentes, layout, eventos


Java 1.0
Interface que roda de forma medocre em todas as
plataformas (Abominable Window Toolkit)
Modelo de eventos arcaico
Java 1.1
Melhora do modelo de eventos: por delegao usando
design pattern Observer
Java 1.2
JFC/Swing substitui totalmente componentes AWT
Mantm e estende a interface de eventos e layout

3
Java Foundation Classes

Parte do J2SE desde Java SDK 1.2. Consiste de:


1. Swing: componentes leves, que no dependem de
implementao nativa (veja Java Tutorial)
Uma das mais completas bibliotecas grficas j criadas
Baseada em JavaBeans: ferramentas GUI conseguem gerar
cdigo legvel e reutilizvel
2. "Look & Feel": Drag & drop, cut & paste,
undo/redo, i18n, texto estilizado
Biblioteca de componentes (apenas o Swing)
compatvel com JDK 1.1.4
Pode ser baixada separadamente e usada com verses
limitadas do Java como J# da Microsoft e MacOS 9
4
JFC/Swing
Veja demo em $JAVA_HOME/demo/jfc/SwingSet2/
> java -jar SwingSet2.jar SwingSet2

Como implementar aplicaes com Swing?


Java Tutorial: Swing "trail" possui guias passo-a-passo para uso de cada
componente e recurso do JFC e Swing (www.java.sun.com/tutorial)
5
Tipos de aplicaes

H dois tipos de aplicaes grficas em Java


Componentes iniciados via browser (applets)
Aplicaes standalone iniciadas via sistema operacional
Ambas capturam eventos do sistema e desenham-se
sobre um contexto grfico fornecido pelo sistema
Applets so aplicaes especiais que rodam a partir
de um browser
So componentes que executam em um container
(ambiente operacional) fornecido pelo browser
Browser quem controla seu ciclo de vida (incio, fim, etc.)
Geralmente ocupam parte da janela do browser mas
podem abrir janelas extras
Possuem restries de segurana
6
java.awt.Component

Raiz da hierarquia de componentes grficos


Componentes Swing herdam de javax.swing.JComponent,
que "neto" de Component
H um Component por trs de tudo que pode ser
pintado na tela
Principais mtodos (chamados pelo sistema):
void paint (java.awt.Graphics g)
void repaint()
void update(java.awt.Graphics g)
O objeto passado como argumento durante a
execuo (contexto grfico) , na verdade, um
java.awt.Graphics2D (subclasse de Graphics)
7
Componentes AWT

H dois tipos importantes de componentes:


1) descendentes diretos de java.awt.Component
"Apenas" componentes: descendentes da classe
Component que no so descendentes de Container
(todos os componentes da AWT)
2) descendentes de java.awt.Container
Subclasse de java.awt.Component
So "recipientes." Podem conter outros componentes.
So descendentes da classe Container: Frame, Panel,
Applet e JComponent (raiz da hierarquia dos
componentes Swing)

8
Containers essenciais

Frame (AWT) e JFrame (Swing)


Servem de base para qualquer aplicao grfica
Panel e JPanel
Container de propsito geral
Serve para agrupar outros componentes e permitir layout
em camadas
Applet e JApplet
Tipo de Panel (JPanel) que serve de base para aplicaes
que rodam dentro de browsers
Pode ser inserido dentro de uma pgina HTML e ocupar o
contexto grfico do browser

9
Exemplo de JFrame
import java.awt.*;
import javax.swing.*;

public class Swinggy extends JFrame {

public Swinggy(String nome) {


super(nome);

this.setSize(400,350);
this.setVisible(true);
}

public static void main(String[] args) {


new Swinggy("Swinggy 1.0");
}

}
10
AWT thread

Thread que responsvel pela atualizao do


contexto grfico
Chama update() (mtodo de Component) e passa
referncia para o contexto grfico como argumento sempre
que for necessrio redesenh-lo.
Mtodo update(Graphics g)
1. Limpa a rea a ser redesenhada (contexto grfico)
2. Chama paint(g)
Mtodos update() e paint() nunca devem ser
chamados diretamente a partir do thread principal
Use repaint(), que faz o agendamento de uma chamada a
update() atravs do AWT thread
Sobreponha update() se desejar
11
java.awt.Graphics

Representa o contexto grfico de cada componente


Passado pelo sistema quando chama update()
Programador pode desenhar no componente usando
referncia recebida via paint() ao sobrepor o mtodo:
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
Shape s = new Ellipse2D.Double();
g2.setColor(Color.red);
g2.draw(s);
}
Para definir o que ser desenhado em determinado
componente, sobreponha seu mtodo paint()
Use Graphics2D! Mais recursos!
12
Applets

Aplicao grfica que roda em browser


Toda a infraestrutura herdada da classe
javax.swing.JApplet (ou java.applet.Applet)
um componente de um framework que executa em
ambiente de execuo (container) no browser
Mtodos de JApplet, chamados automaticamente,
devem ser sobrepostos. Ciclo de vida:
init() - inicializao dos componentes do applet
start() - o que fazer quando applet iniciar
stop() - o que fazer antes de applet parar
destroy() - o que fazer quando applet terminar
paint() - o que desenhar no contexto grfico

13
Ciclo de vida

applet start
carregada descartando
visitando uma pgina
uma pgina
saindo ou
init descarregando destroy
uma pgina

stop

paint() outro mtodo que chamado automaticamente, mas


no faz parte do ciclo de vida do Applet, especificamente
Faz parte do ciclo de vida de qualquer aplicao grfica
No Applet, chamado depois do start() e sempre que o contexto
grfico do applet for precisar ser atualizado (redimensionamento da
janela do browser, ocultao do applet por outra janela, etc.)
14
Como construir applets

Applet mnimo
import javax.swing.*; Comentrio usado pelo
import java.awt.*; appletviewer para exibir
Applet:
> appletviewer HelloApplet.java
/*
* <applet code="HelloApplet" height="50"
* width="200"></applet>
*/
public class HelloApplet extends JApplet {
public void init() {
Container pane = this.getContentPane();
JLabel msg = new JLabel("Hello Web");
pane.add(msg);
}
}

15
Como usar applets

At Java 1.1: para incluir um applet na pgina Web usava-se


<applet code=pacote.Classe
height=100 width=100>
<param name=parametro1 value=valor>
<param name=parametro2 value=valor>
</applet>
Java 2 (J2SDK 1.2 em diante ) usa HTML 4.0 (que tornou o
tag <applet> obsoleto)
<object classid=XXX-XXX ...> ... </object>
Para gerar <object> a partir de <applet> use o HTML
Converter, distribudo com o SDK:
java -jar $JAVA_HOME/lib/htmlconverter.jar -gui

16
Applet/Aplicao

JApplets podem ser includos em JFrames e Applets


podem ser includos em Frames
Para criar um programa que roda tanto como applet
como aplicao
1. Escreva o applet da forma convencional, implementando
init(), start(), etc. (mtodos do framework, que o
container usa para controlar o ciclo de vida do applet)
2. Crie um mtodo main, e nele
Crie um novo JFrame e uma instncia do applet
Adicione o applet no novo JFrame
Torne o JFrame visvel
Chame init() e start() do applet
17
Exemplo
public class HelloApplet extends JApplet {
public void init() {
(...)
}

public static void main(String[] args) {


HelloApplet ap = new HelloApplet();
JFrame f = new JFrame("Applet");
f.getContentPane().add(ap);
f.setSize(200,50);
ap.init(); Fazendo o papel
ap.start(); do container
f.setVisible(true);
}
}
18
Restries dos applets

H vrias coisas que aplicaes comuns podem e


que um applet no pode fazer:
No pode carregar bibliotecas ou definir mtodos nativos
No pode ler ou escrever arquivos na mquina cliente
No pode fazer conexes de rede a no ser para a
mquina de onde veio
No pode iniciar a execuo de nenhum programa na
mquina do cliente
No tem acesso maior parte das propriedades do
sistema
Janelas abertas sempre tm aviso de segurana
Vrias restries podem ser flexibilizadas se o applet
for assinado.
19
Applets: vantagens / desvantagens

Desvantagens
Restries
Dependncia de plug-in e incompatibilidade em browsers
Tempo de download
Vantagens
Facilidade para realizar comunicao em rede
Possibilidade de abrir janelas externas
Capacidade de estender o browser em recursos de
segurana, protocolos de rede, capacidade grfica
Aplicao sempre atualizada
Capacidade de interagir com a pgina via JavaScript
Alternativa (1.4)
Java Web Start: aplicaes "normais" instaladas via rede
20
Java Web Start
Aplicao distribuda (cliente e servidor) que viabiliza a
distribuio e instalao de aplicaes via rede
Aplicao instalada via Web Start uma aplicao Java "normal" com
possibilidade de ter acesso irrestrito ao sistema (usurio deve
autorizar esse acesso na instalao)
Checa, sempre que inicializada, se houve atualizao caso a rede
esteja disponvel
Use o cliente Java Web Start para localizar aplicaes
remotas e instal-las na sua mquina
Em mquinas Windows, cliente instalado junto com J2SDK
Configure seu servidor Web para suportar JNLP (Java Network
Launch Protocol) e distribuir aplicaes via Java Web Start
Configurao bsica consiste da criao de alguns arquivos XML e
definio de novo MIME type no servidor
Veja links para info sobre Java Web Start na documentao do J2SDK
21
Recursos grficos bsicos: Fontes e Cores

Qualquer componente pode mudar a sua fonte e cor


A mudana afeta todos os componentes contidos no
componente afetado
Cores
instncia da classe java.awt.Color
componente.setBackground(new Color(255,0,0));
componente.setForeGround(Color.yellow);
Fontes
instncia da classe java.awt.Font
Font f = new Font("SansSerif", Font.BOLD, 24);
componente.setFont(f);
H maneiras mais
sofisticadas de lidar
com fontes (esta
compatvel com AWT)
22
Posicionamento de componentes: Layouts

H duas formas de acrescentar componentes em um


container
Usar um algoritmo de posicionamento (layout manager)
para dimensionar e posicionar os componentes (esta a
maneira recomendada e default)
Desligar o algoritmo de layout e posicionar e
redimensionar os componentes diretamente (pixels)
Todo container tem um algoritmo de layout default
Frame e JFrame: BorderLayout (layout "geogrfico")
Outros Containers: FlowLayout (layout seqencial)

23
JFrame

Para acrescentar objetos em um JFrame ou JApplet,


preciso obter uma interface opaca chamada
ContentPane
O ContentPane uma rea independente de plataforma
que cobre a rea til do JFrame
O layout definido no ContentPane
Objetos so adicionados no ContentPane
Cores e fontes devem ser definidas a partir do ContentPane
Para obter o ContentPane use
Container pane = frame.getContentPane();
Para definir um layout (diferente de BorderLayout)
pane.setLayout(referncia_para_layout);
24
FlowLayout, JButton, Icon
FlowLayout
o layout mais simples
Dispe os objetos um depois do outro como se fossem letras
digitadas em um editor de texto
Estilo default centralizado (pode ser alterado)
pane.setLayout(new FlowLayout());
JButton
Botes simples
Aceitam textos ou imagens (atravs da interface Icon)
JButton b1 = new Button("texto");
JButton b2 = new Button("texto", icone);
cones de imagem
Icon icone = new ImageIcon("caminho");
Caminho deve ser relativo (de preferncia) e usar sempre "/" como
separador
25
Componentes de texto
JTextField Principais mtodos
campo de entrada de dados simples getText():
JPasswordField recupera o texto
campo para entrada de dados ocultos contido no
componente
JTextArea
setText(valor):
campo de entrada de texto multilinha substitui o texto
JEditorPane com outro
editor que entende HTML e RTF
JTextPane Veja documentao
editor sofisticado com vrios recursos para mais detalhes

26
Exemplo
public class Swinggy2 extends JFrame {

public Swinggy2(String nome) {


super(nome);

Container ct = this.getContentPane();
ct.setLayout(new FlowLayout());

Icon icone = new ImageIcon("jet.gif");


JButton b1 = new JButton("Sair");
JButton b2 = new JButton("Viajar", icone);

ct.add(b1);
ct.add(b2);

this.setSize(400,350);
this.setVisible(true);
}
} 27
Layout null

Algoritmos de layout podem ser combinados para


obter qualquer configurao
Mais fceis de manter e reutilizar
Layout em camadas e "orientado a objetos"
Controlam posicionamento e dimenso de componentes
Algoritmos de layout podem ser criados implementando
interface LayoutManager (e LayoutManager2)
Para desligar layouts
pane.setLayout(null);
Agora preciso definir posio e tamanho de cada
componente
componente.setBounds(x, y, larg, alt);

28
Exemplo
private JButton b1, b2, b3;
public Swinggy3(String nome) {
Container ct = this.getContentPane();
ct.setLayout(null);

Icon pataverm = new ImageIcon("redpaw.gif");


Icon pataverd = new ImageIcon("greenpaw.gif");
Icon pataazul = new ImageIcon("bluepaw.gif");
b1 = new JButton("Vermelha", pataverm);
b2 = new JButton("Verde", pataverd);
b3 = new JButton("Azul", pataazul);
b1.setBounds(10,10,150,40);
b2.setBounds(10,60,150,40);
b3.setBounds(10,110,150,40);
ct.add(b1);
ct.add(b2);
ct.add(b3);
}
29
Aplicao fica mais simples com vetores
private JButton[] b;
private String[] txt = {"Roda", "Para", "Pausa", "Sai",
"Olha", "Urgh!"};
private String[] img = { "greenpaw.gif", "redpaw.gif",
"bluepaw.gif", "jet.gif",
"eye.gif", "barata.gif"};
public Swinggy4(String nome) {
Container ct = this.getContentPane();
ct.setLayout(null);
b = new JButton[txt.length];
for (int i = 0; i < b.length; i++) {
b[i] = new JButton(txt[i],
new ImageIcon(img[i]));
b[i].setBounds(10,10+(i*50),150,40);
ct.add(b[i]);
} // (...) medida em que a complexidade desta
} soluo aumentar, voc poder querer
encapsular a lgica em um LayoutManager! 30
Outros Layout Managers

GridLayout (linhas, colunas)


Layout que posiciona os elementos como elementos de
uma tabela
BorderLayout
Layout que posiciona elementos em quatro posies
"cardeais" e no centro
Norte e Sul tm prioridade sobre Leste e Oeste que tm
prioridade sobre Centro
Constantes BorderLayout.CENTER, BorderLayout.WEST,
BorderLayout.NORTH, etc.
BoxLayout e GridBagLayout
Permitem layouts sofisticados com amplo controle

31
Exemplo com BorderLayout
(...)

ct.setLayout(new BorderLayout());
b = new JButton[txt.length];
String[] pos = {BorderLayout.NORTH,
BorderLayout.SOUTH,
BorderLayout.WEST,
BorderLayout.EAST,
BorderLayout.CENTER};
for (int i=0; i < Math.min(b.length, pos.length); i++) {
b[i] = new JButton(txt[i], new ImageIcon(img[i]));
ct.add(pos[i], b[i]);
}

(...)
Veja restante do cdigo
(vetores b, txt e img)
em slides anteriores
32
Preferred Size dos componentes
Layout Managers so "tiranos"
impossvel controlar tamanho e posio de componentes se
um LayoutManager estiver sob controle
Para flexibilizar regras de posicionamento, configure o Layout
Manager usado atravs de seus construtores e mtodos
Para flexibilizar regras de dimensionamento, altere o
preferred size dos seus componentes
Tamanhos preferidos dos componentes
setPreferredSize(), disponvel em alguns componentes,
permite definir o seu tamanho ideal
getPreferredSize(), disponvel em todos os componentes pode
ser sobreposto em subclasses e ser chamado pelos Layout
Managers que o respeitam (Flow, Border)
33
Regras de BorderLayout
As reas de Border Layout s aceitam um componente
Se for necessrio ter mais de um componente no NORTH, por
exemplo, preciso primeiro adicion-los dentro de um nico
componente que ser adicionado (um Panel, por exemplo)
Regras de ocupao de espao
NORTH E SOUTH tm prioridade sobre a ocupao da largura (usam
todo o espao disponvel) mas tm altura limitada pelo preferred size
do componente
EAST e WEST tem altura limitada apenas pela existncia ou no de
componentes no NORTH e/ou SOUTH e tem largura limitada pelo
preferred size do componente
CENTER ignora preferred size e ocupa todo o espao que puder, mas
limitado pela existncia de NORTH, SOUTH, EAST ou WEST
Construtores de BorderLayout permitem controle detalhado
de espaamento e outros detalhes
34
Exemplo com GridLayout

(...)
ct.setLayout(new GridLayout(3, 2));

b = new JButton[txt.length];
for (int i = 0; i < b.length; i++) {
b[i] = new JButton(txt[i],
new ImageIcon(img[i]));
ct.add(b[i]);
}
(...) Redimensione a janela
e veja o resultado

35
Regras de GridLayout

Cada clula aceita um componente


Se houver mais clulas que componentes, clulas no
preenchidas ficaro em branco
Se houver mais componentes que clulas, estes no sero
mostrados
Regras de ocupao de espao
Qualquer componente adicionado ocupa toda a clula
GridLayout ignora preferred size dos componentes:
aumento do frame estica todos os componentes
Para manter o preferred size de um componente, pode-se
adicion-lo em um componente que o respeita (por
exemplo, um que use FlowLayout) e adicionar este
componente em GridLayout
36
Mesmo exemplo com FlowLayout
(...)
public Swinggy5(String nome) { Redimensione a janela
e veja o resultado
super(nome);
Container ct = this.getContentPane();
ct.setLayout(new FlowLayout());
b = new JButton[txt.length];
for (int i = 0; i < b.length; i++) {
b[i] = new JButton(txt[i],
new ImageIcon(img[i]));
ct.add(b[i]);
}
this.setSize(400,350);
this.setVisible(true);
} (...)

37
Regras de FlowLayout

Elementos so adicionados em seqncia


Comportamento default posicionar elementos lado a lado
at que a linha em que esto colocados no mais couber
nenhum
Elementos so centralizados por default
Construtores permitem controle sobre espaamento e
alinhamento dos componentes
Espao entre componentes alterado para todos os
componentes
Alinhamento pode ser pela direita ou pela esquerda, alm
de default (pelo centro)
Preferred size respeitado para todos os
componentes
38
Combinao de Layouts
Componentes podem ser combinados em recipientes (como
JPanel) para serem tratados como um conjunto
JPanel p = new JPanel();
p.setLayout(layout do JPanel); comp1 comp2
p.add(comp1);
p.add(comp2);
p
pane.add(BorderLayout.EAST, p);
Possibilita a criao de layouts complexos
que consistem de vrias camadas
Cada JPanel uma camada

pane
EAST

39
Exemplo (1/2)
import javax.swing.*;
import java.awt.*;
public class Swinggy8 extends JFrame {
public Swinggy8(String nome) {
super(nome);
Container framePane = this.getContentPane();
framePane.setLayout(new BorderLayout());
JPanel botoes = new JPanel();
botoes.setBackground(Color.yellow);
botoes.setLayout(new GridLayout(3,1));
botoes.add(new JButton("Um"));
botoes.add(new JButton("Dois"));
botoes.add(new JButton("Trs"));
JPanel lateral = new JPanel();
lateral.add(botoes);
40
Exemplo (2/2)
JInternalFrame if1 =
new JInternalFrame("Um", true, true, true);
JInternalFrame if2 =
new JInternalFrame("Dois", true, true, true);
if1.getContentPane().add(new JEditorPane());
if2.getContentPane().add(new JEditorPane());
if1.setBounds(20,20, 250,200);
if2.setBounds(70,70, 250,200);
if1.setVisible(true);
if2.setVisible(true);

JDesktopPane dtp = new JDesktopPane();


dtp.add(if1); dtp.add(if2);
framePane.add(BorderLayout.CENTER, dtp);
framePane.add(BorderLayout.WEST, lateral);
this.setSize(400,350);
this.setVisible(true);
}
} 41
Exemplo: resultado

42
Exerccio

1. Construa uma aplicao grfica que contenha trs


botes (JButton), um JTextField e um JTextPane
distribudos da seguinte forma
JTextField Use BorderLayout para
JTextPane distribuir os componentes
Copiar JTextField, JEditorPane e
JPanel
Limpar

Sair Use GridLayout para


distribuir os botes

2. Experimente usar outros componentes e outros


layouts (veja SwingSet demo)
43
Eventos

Eventos em Java so objetos


Subclasses de java.util.EventObject
Todo evento tem um objeto que sua fonte
Object fonte = evento.getSource();
Mtodos de ouvintes (listeners) que desejam tratar
eventos, recebem eventos como argumento
public void eventoOcorreu(EventObject evento) {
Object fonte = evento.getSource();
System.out.println("" +evento+ " em " +fonte);
}
Ouvintes precisam ser registrados nas fontes
Quando ocorre um evento, um mtodo de todos os ouvintes
registrados chamado e evento passado como argumento
44
Fontes, Eventos, Ouvintes
Evento capturado pelo
Fonte: Boto x = 344 S.O.: dados sobre o clique
2. Usurio clica y = 230
OK ref=0x6a do mouse e outras
no boto ... informaes
...

Objeto do tipo Objeto do tipo


interface
MouseEvent 3. Envia objeto comp. ActionEvent com ActionListener
com dados sobre cmd: OK dados sobre
clique do mouse componente actionPerformed(...)

x=344 1. Registra-se OuvinteDeAcao


y=230
actionPerformed(ActionEvent) interface
MouseListener
mouseEntered(...)
mouseExited(...)
...
OuvinteDeMouse
1. Registra-se
mouseEntered(MouseEvent)
mouseExited(MouseEvent)
3. Envia objeto ...

45
Eventos da Interface Grfica

Descendentes de java.awt.event.AWTEvent
Divididos em categorias (java.awt.event)
ActionEvent (fonte: componentes de ao)
MouseEvent (fonte: componentes afetados pelo mouse)
ItemEvent (fonte: checkboxes e similares)
AdjustmentEvent (fonte: scrollbars)
TextEvent (fonte: componentes de texto)
WindowEvent (fonte: janelas)
FocusEvent (fonte: componentes em geral)
KeyEvent (fonte: componentes afetados pelo teclado)
...

46
Listeners

Cada evento tem uma interface Listener


correspondente que possui mtodos padro para
trat-los
ActionEvent: ActionListener
MouseEvent: MouseListener e MouseMotionListener
ItemEvent: ItemListener
AdjustmentEvent: AdjustmentListener
TextEvent: TextListener
WindowEvent: WindowListener
FocusEvent: FocusListener
KeyEvent: KeyListener
...
XXXEvent: XXXListener
47
Como ligar a fonte ao listener
Na ocorrncia de um evento, em uma fonte, todos os
listeners registrados sero notificados
preciso antes cadastrar os listeners na fonte
fonte.add<Listener>(referncia_para_listener);
Exemplo:
JButton button = new JButton("Fonte");
ActionListener ouvinte1 = new OuvinteDoBotao();
MouseListener ouvinte2 = new OuvinteDeCliques();
button.addActionListener(ouvinte1);
button.addMouseListener(ouvinte2);
O mesmo objeto que fonte s vezes tambm listener, se
implementar as interfaces
Ainda assim, necessrio registrar a fonte ao listener (o objeto no
adivinha que ele mesmo tem que capturar seus eventos)
this.addWindowListener(this);
Fonte Listener 48
Como implementar um listener

Crie uma nova classe que declare implementar o(s)


listener(s) desejado(s)
public class MeuListener implements
ActionListener, ItemListener { ...}
Implemente cada um dos mtodos da(s) interface(s)
public void actionPerformed(ActionEvent e) { ...}
public void itemStateChanged(ItemEvent e) {...}
Veja a documentao sobre o listener usado e o evento
correspondente (para saber que mtodos usar para
obter suas informaes)
Todos os mtodos so public void
Todos recebem o tipo de evento correspondente ao tipo do
listener como argumento
49
Quais os listeners, mtodos, eventos?
Consulte a documentao no pacote java.awt.event
Veja em cada listener a assinatura dos mtodos que voc deve
implementar
public void actionPerformed(ActionEvent evt)
Veja em cada evento os mtodos que voc pode chamar
dentro do listener para obter as informaes desejadas (por
exemplo textos, coordenadas, teclas apertadas, etc.)
String comando = actionEvent.getActionCommand();
Veja em cada componente-fonte os mtodos que voc pode
chamar para obter informaes sobre o componente:
Object fonte = evento.getSource();
if (fonte instanceof JButton)
JButton b = (JButton) fonte;
String label = b.getLabel();
50
Alguns Eventos, Listeners e Mtodos
ActionEvent ActionListener actionPerformed(ActionEvent)
ItemEvent ItemListener itemStateChanged(ItemEvent)
KeyEvent KeyListener keyPressed(KeyEvent)
keyReleased(KeyEvent)
keyTyped(KeyEvent)
MouseEvent MouseListener mouseClicked(MouseEvent)
mouseEntered(MouseEvent)
mouseExited(MouseEvent)
mousePressed(MouseEvent)
mouseReleased(MouseEvent)
MouseMotionListener mouseDragged(MouseEvent)
mouseMoved(MouseEvent)
TextEvent TextListener textValueChanged(TextEvent)
WindowEvent WindowListener windowActivated(WindowEvent)
windowClosed(WindowEvent)
windowClosing(WindowEvent)
windowDeactivated(WindowEvent)
windowDeiconified(WindowEvent)
windowIconified(WindowEvent)
windowOpened(WindowEvent)
51
Adapters

Alguns listeners possuem uma classe Adapter que


implementa todos os mtodos, sem instrues
Implementao vazia: {}
S existe para listeners que tm mais de um mtodo
So teis quando um Ouvinte precisa implementar
apenas um dentre vrios mtodos de um Listener
Pode sobrepor a implementao desejada do mtodo do
Adapter e no precisa se preocupar com os outros
No so teis em ouvintes que j estendem outras classes
ou quando implementam diferentes listeners
O nome do adapter semelhante ao do Listener
MouseListener: MouseAdapter,
WindowListener: WindowAdapter, ...
52
Exemplo
import java.awt.event.*;
public class Swinggy9 extends JFrame {
public Swinggy9(String nome) {
(...)
JButton b1 = new JButton("Sair");
JButton b2 = new JButton("Viajar", icone);
JTextField tf = new JTextField(10);
b1.setActionCommand("Saindo");
b2.setActionCommand("Viajando");
ActionListener listener = new Eco();
b1.addActionListener(listener);
b2.addActionListener(listener);
(...)
}
// Classe interna!!
class Eco implements ActionListener {
public void actionPerformed(ActionEvent e) {
tf.setText(e.getActionCommand());
}
}
}
53
Tratamento de eventos com classes internas
comum utilizar-se classes internas, mais especificamente,
classes annimas no tratamento de eventos de uma GUI
Vantagens incluem a possibilidade de enxergar os
componentes que geralmente so atributos private
O exemplo anterior usa uma classe interna de instncia
(tambm chamada de classe aninhada, ou embedded)
O exemplo abaixo usa classes annimas (compare os dois!):
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tf.setText(e.getActionCommand());
}
});
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tf.setText(e.getActionCommand());
}
}); (...)
54
Exerccio

3. Implemente os eventos para a aplicao


Copiar deve acrescentar o texto do JTextField no
JEditorPane e limpar o JTextField
Limpar deve limpar o JTextField
Sair deve sair do programa
4. Implemente os botes como itens do menu
"Operaes"
Use JMenuBar, JMenu e JMenuItem
5. Implemente um JToggleButton "desenhar/escrever"
que troque o JTextPane por um JCanvas e permita
rabiscar com o mouse (use MouseEvent)
Veja aplicao-exemplo no CD
55
Exerccio

6. Implemente uma interface grfica para a


aplicao da biblioteca (captulo 7).
Use o JTabbedPane para criar diferentes painis: um para
entrada de Agentes (autores, editores), outro para
entrada de Publicaes (livros, revistas, artigos) e outro
para buscas.
Use um combo-box para selecionar cada tipo de agente
ou publicao
Desabilite campos no utilizados.
Implemente os eventos chamando os mtodos da fachada
(Biblioteca)

56
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
57
Java 2 Standard Edition

Fundamentos de

Helder da Rocha
www.argonavis.com.br
1
JDBC

JDBC uma interface baseada em Java para acesso


a bancos de dados atravs de SQL.
Pacote Java padro: java.sql
Baseada em ODBC
Usando JDBC, pode-se obter acesso direto a bancos
de dados atravs de applets e outras aplicaes Java
Este mdulo apresenta uma introduo superficial
do JDBC mas suficiente para integrar aplicaes Java
com bancos de dados relacionais que possuam
drivers JDBC
No so abordados Connection Pools nem DataSources

2
JDBC

JDBC uma interface de nvel de cdigo


Cdigo SQL usado explicitamente dentro do cdigo Java
O pacote java.sql consiste de um conjunto de classes e
interfaces que permitem embutir cdigo SQL em
mtodos.
Com JDBC possvel construir uma aplicao Java
para acesso a qualquer banco de dados SQL.
O banco deve ter pelo menos um driver ODBC, se no
tiver driver JDBC
Para usar JDBC preciso ter um driver JDBC
O J2SE distribui um driver ODBC que permite o acesso a
bancos que no suportam JDBC mas suportam ODBC

3
Pacote java.sql

SQLInput Connection java.lang.Object

SQLOutput ResultSet DriverPropertyInfo

SQLType Statement DriverManager


SQLData Types
PreparedStatement
Struct
CallableStatement java.util.Date

StructLocator ResultSetMetaData Time


ArrayLocator DatabaseMetaData Date
BlobLocator Driver TimeStamp
ClobLocator
Inferfaces
Ref
Classes
4
Tipos de Drivers JDBC

Tipo 1: ponte ODBC-JDBC


Usam uma ponte para ter acesso a um banco de dados. Este tipo
de soluo requer a instalao de software do lado do cliente.
Tipo 2: soluo com cdigo nativo
Usam uma API nativa. Esses drivers contm mtodos Java
implementados em C ou C++. Requer software no cliente.
Tipo 3: soluo 100% Java no cliente
Oferecem uma API de rede via middleware que traduz requisies
para API do driver desejado. No requer software no cliente.
Tipo 4: soluo 100% Java
Drivers que se comunicam diretamente com o banco de dados
usando soquetes de rede. uma soluo puro Java. No requer
cdigo adicional do lado do cliente.

5
Arquitetura JDBC
Aplicao JDBC
API JDBC (pacote java.sql)
JDBC Driver Manager
Protocolo JDBC
Driver tipo 1 Driver tipo 2 Driver tipo 3 Driver tipo 4
Ponte JDBC-ODBC API nativa JDBC-Rede Pure Java

Cdigo nativo Cdigo nativo Protocolo de


rede aberto
Driver ODBC Protocolo
Middleware
Protocolo
proprietrio
Protocolo proprietrio Protocolo
SGBD
proprietrio SGBD proprietrio
SGBD SGBD

BD BD BD BD
6
URL JDBC

Uma aplicao JDBC pode carregar ao mesmo tempo


diversos drivers.
Para determinar qual driver ser usado usa-se uma URL:
jdbc:<subprotocolo>:<dsn>
A aplicao usa o subprotocolo para identificar e selecionar
o driver a ser instanciado.
O dsn o nome que o subprotocolo utilizar para localizar
um determinado servidor ou base de dados.
Sintaxe dependente do fabricante. Veja alguns exemplos:
jdbc:odbc:anuncios
jdbc:oracle:thin:@200.206.192.216:1521:exemplo
jdbc:mysql://alnitak.orion.org/clientes
jdbc:cloudscape:rmi://host:1098/MyDB;create=true

7
DriverManager e Driver
A interface Driver utilizada apenas pelas implementaes
de drivers JDBC
preciso carregar a classe do driver na aplicao que ir utiliz-
lo. Isto pode ser feito com Class.forName():
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

A classe DriverManager manipula objetos do tipo Driver.


Possui mtodos para registrar drivers, remov-los ou list-los.
usado para retornar Connection, que representa uma conexo a
um banco de dados, a partir de uma URL JDBC recebida como
parmetro
Connection con =
DriverManager.getConnection
("jdbc:odbc:dados",
"nome","senha");
8
Connection, ResultSet e Statement

Interfaces que contm mtodos implementados em


todos os drivers JDBC.
Connection
Representa uma conexo ao banco de dados, que
retornada pelo DriverManager na forma de um objeto.
Statement
Oferece meios de passar instrues SQL para o sistema
de bancos de dados.
ResultSet
um cursor para os dados recebidos.

9
Statement

Obtendo-se um objeto Connection, chama-se sobre


ele o mtodo createStatement() para obter um
objeto do tipo Statement:
Statement stmt = con.createStatement()
que poder usar mtodos como execute(),
executeQuery(), executeBatch() e executeUpdate()
para enviar instrues SQL ao BD.
Subinterfaces:
PreparedStatement e CallableStatement
PreparedStatement pstmt =
con.prepareStatement(...);
CallableStatement cstmt = con.prepareCall(...);

10
Enviando instrues

Exemplo de uso de Statement


stmt.execute("CREATE TABLE dinossauros "
+ "(codigo INT PRIMARY KEY, "
+ "genero CHAR(20), "
+ "especie CHAR(20));");

int linhasModificadas =
stmt.executeUpdate("INSERT INTO dinossauros "
+ "(codigo, genero, especie) VALUES "
+ "(499,'Fernandosaurus','brasiliensis')");

ResultSet cursor =
stmt.executeQuery("SELECT genero, especie " +
" FROM dinossauros " +
" WHERE codigo = 355");
11
ResultSet

O mtodo executeQuery(), da interface Statement,


retorna um objeto ResultSet.
Cursor para as linhas de uma tabela.
Pode-se navegar pelas linhas da tabela recuperar as
informaes armazenadas nas colunas
Os mtodos de navegao so
next(), previous(), absolute(), first() e last()
Mtodos para obteno de dados:
getInt()
getString()
getDate()
getXXX(), ...

12
Tipos JDBC e mtodos getXXX()

Mtodo de ResultSet Tipo de dados SQL92


getInt() INTEGER
getLong() BIG INT
getFloat() REAL
getDouble() FLOAT
getBignum() DECIMAL
getBoolean() BIT
getString() CHAR, VARCHAR
getDate() DATE
getTime() TIME
getTimestamp() TIME STAMP
getObject() Qualquer tipo (Blob)
13
ResultSet

Exemplo de uso de ResultSet


ResultSet rs =
stmt.executeQuery("SELECT Numero, Texto, "
+ " Data FROM Anuncios");

while (rs.next()) {
int x = rs.getInt("Numero");
String s = rs.getString("Texto");
java.sql.Date d = rs.getDate("Data");
// faa algo com os valores obtidos...
}

14
Transaes
Permite a execuo atmica de comandos enviados ao banco.
Implementada atravs dos mtodos de Connection
commit()
rollback()
setAutoCommit(boolean autoCommit): default true.
Por default, as informaes so processadas a medida em que
so recebidas. Para mudar:
con.setAutoCommit(false);
Agora vrias instrues podem ser acumuladas.
Para processar:
con.commit();
Se houver algum erro e todo o processo necessitar ser desfeito,
pode-se emitir um ROLLBACK usando:
con.rollback();
15
PreparedStatement
Statement pr-compilado que mais eficiente quando vrias
queries similares so enviadas com parmetros diferentes
String com instruo SQL preparado previamente, deixando-
se "?" no lugar dos parmetros
Parmetros so inseridos em ordem, com setXXX() onde XXX
um tipo igual aos retornados pelos mtodos de ResultSet
String sql = "INSERT INTO Livros VALUES(?, ?, ?)";
PreparedStatement cstmt = con.prepareStatement(sql);
cstmt.setInt(1, 18943);
cstmt.setString(2, "Lima Barreto");
cstmt.setString(3, "O Homem que Sabia Javans");
cstmt.executeUpdate();
...

16
Stored Procedures
Procedimentos desenvolvidos em linguagem proprietria do
SGBD (stored procedures) podem ser chamados atravs de
objetos CallableStatement
Parmetros so passados da mesma forma que em instrues
PreparedStatement
Sintaxe
con.prepareCall("{ call proc_update(?, ?, ...) }");
con.prepareCall("{ ? = call proc_select(?, ?, ...) }");

CallableStatement cstmt =
con.prepareCall("{? = call sp_porAssunto(?)}";
cstmt.setString(2, "520.92");
ResultSet rs = cstmt.executeQuery();
...

17
Fechar conexo e Excees

Aps o uso, os objetos Connection, Statement e


ResultSet devem ser fechados. Isto pode ser feito
com o mtodo close():
con.close();
stmt.close();
rs.close();
A exceo SQLException a principal exceo a ser
observada em aplicaes JDBC

18
Metadados

Classe DatabaseMetaData: permite obter informaes


relacionadas ao banco de dados
Connection con; (...)
DatabaseMetaData dbdata = con.getMetaData();
String nomeDoSoftwareDoBanco =
dbdata.getDatabaseProductName();

Classe ResultSetMetaData: permite obter informaes sobre


o ResultSet, como quantas colunas e quantas linhas existem
na tabela de resultados, qual o nome das colunas, etc.
ResultSet rs; (...)
ResultSetMetaData meta = rs.getMetaData();
int colunas = meta.getColumnCount();
String[] nomesColunas = new String[colunas];
for (int i = 0; i < colunas; i++) {
nomesColunas[i] = meta.getColumnName(i);
}
19
Resources (javax.sql)
O pacote javax.sql, usado em aplicaes J2EE, contm outras
classes e pacotes que permitem o uso de conexes JDBC de
forma mais eficiente e portvel
javax.sql.DataSource: obtm uma conexo a partir de um
sistema de nomes JNDI (previamente registrada)
Context ctx = new InitialContext();
DataSource ds =
(DataSource)ctx.lookup("jdbc/EmployeeDB");
Connection con = ds.getConnection();

DataSource uma alternativa mais eficiente que DriverManager:


possui pool de conexes embutido
javax.sql.RowSet e suas implementaes
Extenso de ResultSet
Permite manipulao customizada de ResultSet
20
Padres de Projeto implementados em JDBC

Drivers JDBC implementam vrios padres de projeto.


Os principais so
Bridge: define uma soluo para que uma implementao
(o driver que permite a persistncia dos objetos) seja
independente de sua abstrao (a hierarquia de objetos)
Abstract Factory: permite que hierarquias de classes
sejam plugadas e objetos diferentes, de mesma interface,
sejam produzidos (uma createStatement() cria um objeto
Statement com a implementao do driver instalado.)
Factory Method: a implementao dos mtodos
getConnection(), createStatement(), etc. que devolvem um
objeto sem que a sua implementao seja conhecida.
Iterator: o ResultSet e seu mtodo next()
21
Exerccios
1. Construa uma aplicao Java simples que permita que o
usurio envie comandos SQL para um banco de dados e
tenha os resultados listados na tela.
Veja detalhes em README.txt no diretrio cap18/
2. Crie uma aplicao com o mesmo objetivo que a aplicao
do exerccio 1, mas, desta vez, faa com que os dados sejam
exibidos dentro de vrios JTextField (um para cada campo)
organizados lado a lado como uma planilha.
Use JScrollPane() para que os dados caibam na tela
Use um JPanel que posicione os JTextField (de tamanho fixo) lado a
lado e outro, que possa crescer dinamicamente, para os registros
(colees de JTextField)
3. Descubra como usar o JTable (so vrias classes) e refaa
o exerccio 2.
22
Exerccios 2

4. Crie uma classe RepositorioDadosBD que


implemente RepositorioDados da aplicao
biblioteca
a) Crie tabelas autor, editor, livro, revista e artigo
b) Crie tabelas de relacionamentos: publicacao_autor,
palavras_chave, artigo_revista
b) Implemente os mtodos usando SQL e JDBC
c) Teste a aplicao

23
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
24
Java 2 Standard Edition

Fundamentos de

Helder da Rocha
www.argonavis.com.br
1
Sobre este mdulo

Este mdulo pretende apenas cobrir conceitos


essenciais sobre programao em rede com Java
Como criar um servidor e um cliente TCP/IP
Como abrir uma conexo TCP/IP
Como ler de uma conexo
Como escrever para uma conexo
Classes abordadas do pacote java.net
Socket e ServerSocket
InetAddress
URL
Para maiores detalhes, consulte as referncias no
final do captulo
2
Pacote java.net
O pacote java.net contm classes para implementar
comunicao atravs da rede
Fceis de usar. Semelhante criao de arquivos:
Socket sock = new Socket("www.x.com", 80); (1)
PrintWriter os = new PrintWriter(
new OutputStreamWriter(
sock.getOutputStream()));
BufferedReader is = new BufferedReader(
new InputStreamReader(
sock.getInputStream());
os.println("GET / HTTP/1.0\n\n"); (2)
String linha = "";
while ((linha = is.readLine()) != null) {
System.out.println(linha); (3)
} // ... feche o socket com sock.close();
(1) Abre socket para servidor Web, (2) envia comando e (3) imprime resposta
3
TCP/IP no pacote java.net

A comunicao via protocolo TCP (Transfer Control


Protocol), confivel, suportada pelas classes
Socket (soquete de dados)
ServerSocket (soquete do servidor).
A comunicao via UDP (Unreliable Datagram
Protocol), no-confivel, suportada pelas classes
DatagramSocket (soquete de dados UDP),
DatagramPacket (pacote UDP)
MulticastSocket (soquete UDP para difuso).
Endereamento
InetAddress (representa um endereo na Internet)
URL (representa uma URL)
4
URL
Representa uma URL
Principais mtodos
openStream() obtm um InputStream para os dados
openConnection(): retorna um objeto URLConnection que contm
mtodos para ler o cabealho dos dados
getContent(): retorna os dados diretamente como Object se contedo
for conhecido (texto, imagens, etc.)
Para imprimir a pgina HTML de um site
try {
URL url = new URL("http://www.site.com");
InputStreamReader reader =
new InputStreamReader(url.openStream());
BufferedReader br = new BufferedReader(reader);
String linha = "";
while ( (linha = br.readLine()) != null) {
System.out.println(linha);
}
} catch (MalformedURLException e) { ... }
5
InetAddress

Representa um endereo Internet


Principais mtodos estticos construtores
getLocalHost() retorna InetAddress
getByName(String host) retorna InetAddress
Principais mtodos de instncia
getHostAddress() retorna String com IP do InetAddress
getHostName() retorna String com nome no InetAddress
Para descobrir o IP e nome da mquina local:
InetAddress address = InetAddress.getLocalHost();
String ip = address.getHostAddress();
String nome = address.getHostName();

6
Socket
Um dos lados de uma conexo bidirecional TCP
Principais mtodos servem para obter fluxos de
entrada e sada
getInputStream()
getOutputStream()
close()
Exemplo
InetAddress end =
InetAddress.getByName("info.acme.com");
Socket con = new Socket(end, 80);
InputStream dados = con.getInputStream();
OutputStream comandos =
con.getOutputStream();

Depois de obtido os fluxos, basta ler ou enviar dados


7
Socket (2)

Para ler ou gravar caracteres ao invs de bytes,


pode-se decorar os fluxos obtidos de um socket com
as classes Reader e Writer:
Socket con = new
Socket("maquina.com.br", 4444);
Reader r = new InputStreamReader(
con.getInputStream());
Writer w = new OutputStreamWriter(
con.getOutputStream());
// Use aqui os fluxos de dados
con.close();

8
ServerSocket

Com ServerSocket pode-se implementar um servidor


que fica escutando uma porta a espera de um cliente
Principal mtodo
accept(): aceita a conexo e retorna o seu socket
Exemplo de servidor dedicado
ServerSocket escuta = new ServerSocket(80);
while(true) {
Socket cliente = escuta.accept(); // espera
InputStream comandos =
cliente.getInputStream();
OutputStream dados =
cliente.getOutputStream();
// ... use os dados
cliente.close();
}
9
Excees de rede
Vrias excees podem ocorrer em um ambiente de rede
O programa deve tomar medidas para reduzir o impacto das excees
inevitveis, como rede fora do ar ou conexo recusada
O compilador ir informar, durante o desenvolvimento, as excees
que precisam ser declaradas ou tratadas
As excees mais comuns do pacote java.net so
SocketException
MalformedURLException
UnknownHostException
ProtocolException
Operaes de timeout, liberao de threads, sincronizao,
transaes, etc. devem ser implementados pelo programador
em aplicaes de rede
No h excees tratando esses problemas automaticamente

10
Exerccios

1. Escreva um programa que descubra e imprima o


nmero IP da sua mquina
2. Escreva um programa que
Conecte-se na porta HTTP (geralmente 80) de um
servidor conhecido
Envie o comando: "GET / HTTP/1.0\n\n"
Grave o resultado em um arquivo resultado.html
3. Servidor dedicado: escreva um servidor simples que
responda a comandos da forma "GET arquivo".
Localize o arquivo e imprima-o no OutputStream
Escreva um cliente que receba o arquivo e grave-o
localmente
11
Exerccios (2)

4. Servidor multithreaded: Escreva um programa que


use um ServerSocket para aguardar conexes de um
cliente. O programa dever ter duas partes:
(1) uma classe principal (Servidor) que fica escutando a
porta escolhida (nmero acima de 1024) e
(2) uma classe que estende Thread (Conexao) e que ir
tratar as requisies do cliente.
O servidor dever imprimir na tela todos os comandos
enviados por todos os clientes.
Os clientes enviam mensagens de texto, como um chat.
5. Crie um cliente para a aplicao acima e teste-o
em vrias mquinas diferentes.
12
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
13
Java 2 Standard Edition

Fundamentos de
Objetos
Remotos
Helder da Rocha
www.argonavis.com.br
1
Sobre este mdulo

Este mdulo tem como objetivo dar uma viso geral,


porm prtica, da criao e uso de objetos remotos
em Java com RMI
Para permitir a demonstrao de uma aplicao
simples, vrios conceitos importantes, essenciais em
aplicaes RMI reais foram omitidos, como
Necessidade de implantar um gerente de segurana
Necessidade de divulgar um codebase (Classpath
distribudo)
Para maiores detalhes, consulte as fontes de
referncia para este curso

2
O que so objetos remotos

Objetos remotos so objetos cujos mtodos podem


ser chamados remotamente, como se fossem locais
Cliente precisa, de alguma forma, localizar e obter uma
instncia do objeto remoto (geralmente atravs de um
proxy intermedirio gerado automaticamente)
Depois que o cliente tem a referncia, faz chamadas nos
mtodos do objeto remoto (atravs do proxy) usando a
mesma sintaxe que usaria se o objeto fosse local
Objetos remotos abstraem toda a complexidade da
comunicao em rede Proxies
locais
Objetos
remotos
Estende o paradigma OO alm
do domnio local Cliente Rede

Torna a rede transparente


3
Como implementar objetos remotos
Para usar objetos remotos, preciso ter uma infraestrutura que
cuide da gerao das classes, comunicao e outros detalhes
H duas solues disponveis para implementar objetos
remotos em Java
Interface de programao
OMG CORBA: requer o uso, alm de Java,
da linguagem genrica OMG IDL, mas OMG IDL Java
suporta integrao com outras linguagens
Java RMI: para solues 100% Java CORBA Java RMI
As duas solues diferem principalmente
na forma de implementao IIOP JRMP
Em ambas, um programa cliente poder
chamar um mtodo em um objeto remoto
Interface para
da mesma maneira como faz com um comunicao
mtodo de um objeto local em rede
4
Objetos remotos com Java RMI
Java RMI (Remote Method Invocation) pode ser implementado
usando protocolos e infraestrutura prprios do Java (JRMP e
RMI Registry) ou usando IIOP e ORBs, prprios do CORBA
JRMP - Java Remote Method Protocol Interface de programao
Pacote java.rmi - RMI bsico
OMG IDL Java
Ideal para aplicaes 100% Java.
IIOP - Internet Inter-ORB Protocol Java IDL
RMI-IIOP RMI-JRMP
Pacote javax.rmi - RMI sobre IIOP (CORBA)
Ideal para ambientes heterogneos.
IIOP JRMP
A forma de desenvolvimento similar
H pequenas diferenas na gerao da Interface de
comunicao em rede
infraestrutura (proxies) e registro de objetos
RMI sobre IIOP permite programao Java RMI e comunicao
em CORBA, viabilizando integrao entre Java e outras
linguagens sem a necessidade de aprender OMG IDL
5
RMI: funcionamento bsico
Um objeto remoto previamente registrado obtido,
atravs de servidor de nomes especial: RMI Registry.
Permite que os objetos publicamente acessveis atravs
da rede sejam referenciados atravs de um nome.
Servio de nomes: classe java.rmi.Naming
Mtodo Naming.lookup() consulta um servidor de nomes
RMI e obtm uma instncia de um objeto remoto
Exemplo (jogo de batalha naval):
Territorio mar =
(Territorio)Naming.lookup("rmi://gamma/caspio");
Agora possvel chamar mtodos remotos de mar:
tentativa[i] = mar.atira("C", 9);

6
Arquitetura RMI
Uma aplicao distribuda com RMI tem acesso transparente
ao objeto remoto atravs de sua Interface Remota
A "Interface Remota" uma interface que estende java.rmi.Remote
A partir da Interface Remota e implementao do objeto remoto o
sistema gera objetos (proxies) que realizam todas as tarefas
necessrias para viabilizar a comunicao em rede
Objeto remoto
Comunicao
RMIClient aparente HelloImpl

java.rmi.Remote
Stub Skeleton
HelloImpl_Stub RemoteHello HelloImpl_Skel
Comunicao
real
7
Padres de Projeto: Proxy

A implementao RMI um exemplo do padro de


projeto chamado Proxy
Proxy uma soluo para situaes onde o objeto de
interesse est inaccessvel diretamente, mas o
cliente precisa operar em uma interface idntica
A soluo oferecida por Proxy criar uma classe que
tenha a mesma interface que o objeto de interesse
(implemente a mesma interface Java) e que implemente,
em seus mtodos, a lgica de comunicao com o objeto
inaccessvel.
Em RMI, o proxy o Stub gerado automaticamente pelo
ambiente de desenvolvimento (rmic)
8
Como usar RMI em 10 passos

O objetivo deste mdulo oferecer apenas uma


introduo bsica a Java RMI. Isto ser feito atravs
de um exemplo simples
1. Definir a interface
2. Implementar os objetos remotos
3. Implementar um servidor para os objetos
4. Compilar os objetos remotos
5. Gerar stubs e skeletons com rmic
6. Escrever, compilar e instalar o(s) cliente(s)
7. Instalar o stub no(s) cliente(s)
8. Iniciar o RMI Registry no servidor
9. Iniciar o servidor de objetos
10. Iniciar os clientes informando o endereo do servidor.
9
1. Definir a interface remota

Declare todos os mtodos que sero acessveis


remotamente em uma interface Java que estenda
java.rmi.Remote.
Todos os mtodos devem declarar throws
java.rmi.RemoteException.
Isto deve ser feito para cada objeto que ser
acessvel atravs da rede.
import java.rmi.*;
public interface Mensagem extends Remote {
public String getMensagem()
throws RemoteException;
public void setMensagem(String msg)
throws RemoteException;
}
10
2. Implementar os objetos remotos
Cada objeto remoto uma classe que estende a classe
java.rmi.server.UnicastRemoteObject e que implementa a
interface remota criada no passo 1.
Todos os mtodos declaram causar java.rmi.RemoteException
inclusive o construtor, mesmo que seja vazio.
import java.rmi.server.*;
import java.rmi.*;

public class MensagemImpl extends UnicastRemoteObject


implements Mensagem {
private String mensagem = "Inicial";
public MensagemImpl() throws RemoteException {}
public String getMensagem() throws RemoteException {
return mensagem;
}
public void setMensagem(String msg) throws RemoteException {
mensagem = msg;
}
}
11
3. Estabelecer um servidor

Crie uma classe que


a) Crie uma instncia do objeto a ser servido e
b) Registre-a (bind ou rebind) no servio de nomes.
import java.rmi.*;
public class MensagemServer {

public static void main(String[] args)


throws RemoteException {
Mensagem mens = new MensagemImpl();
Naming.rebind("mensagens", mens);
System.out.println("Servidor no ar. "+
" Nome do objeto servido: '"
+ "mensagens" +"'");
}
}
12
4. Compilar os objetos remotos

Compile todas as interfaces e classes utilizadas para


implementar as interfaces Remote
javac Mensagem.java MensagemImpl.java

13
5. Gerar stubs e skeletons

Use a ferramenta do J2SDK: rmic


Ser gerado um arquivo stub
MensagemImpl_stub.class
e um arquivo skeleton
MensagemImpl_skel.class
para cada objeto remoto (neste caso, apenas um)
RMIC = RMI Compiler
Use opo -keep se quiser manter cdigo-fonte
Execute o rmic sobre as implementaes do objeto remoto
j compiladas:
> rmic MensagemImpl

14
6. Compilar e instalar o(s) cliente(s)
Escreva uma classe cliente que localize o(s) objeto(s) no
servio de nomes (java.rmi.Naming)
a) Obtenha uma instncia remota de cada objeto
b) Use o objeto, chamando seus mtodos
import java.rmi.*;
public class MensagemClient {
public static void main(String[] args)
throws Exception {
String hostname = args[0];
String objeto = args[1];
Object obj =
Naming.lookup("rmi://" + hostname + "/"
+ objeto);
Mensagem mens = (Mensagem) obj;
System.out.println("Mensagem recebida: "
+ mens.getMensagem());
mens.setMensagem("Fulano esteve aqui!");
}
}
15
7. Instalar o stub no(s) cliente(s)

Distribua o cliente para as mquinas-cliente. A


distribuio deve conter
Classe(s) que implementa(m) o cliente
(HelloMensagem.class)
Os stubs (HelloMensagem_stub.class)
As interfaces Remote (Mensagem.class)

Em aplicaes reais, os stubs podem ser mantidos no servidor


O cliente faz download do stub quando quiser us-lo
Para isto preciso definir algumas propriedades adicionais
(omitidas no nosso exemplo simples) como Codebase (CLASSPATH
distribudo), SecurityManager e polticas de segurana (Policy)

16
8. Iniciar o RMI Registry no servidor

No Windows
> start rmiregistry
No Unix
> rmiregistry &
(O RMI Registry fica "calado" quando est rodando)
Neste exemplo ser preciso iniciar o RMIRegistry no
diretrio onde esto os stubs e interface Remote
Isto para que o RMIRegistry veja o mesmo CLASSPATH
que o resto da aplicao
Em aplicaes RMI reais isto no necessrio, mas
preciso definir a propriedade java.rmi.server.codebase
contendo os caminhos onde se pode localizar o cdigo
17
9. Iniciar o servidor de objetos

O servidor uma aplicao executvel que registra os


objetos no RMIRegistry. Rode a aplicao:
> java MensagemServer
Servidor no ar. Nome do objeto servido: mensagens
Neste exemplo ser preciso iniciar o servidor no
diretrio onde esto os stubs e interface Remote
Isto para que o RMIRegistry veja o mesmo CLASSPATH
que o resto da aplicao
Em aplicaes RMI reais isto no necessrio, mas
preciso definir a propriedade java.rmi.server.codebase
contendo os caminhos onde se pode localizar o cdigo

18
10. Iniciar os clientes

Rode o cliente
Informe o endereo do servidor e objetos a utilizar
> java MensagemClient maquina.com.br mensagens

Exerccio
Implemente os exemplos mostrados, inventando uma
mensagem diferente para seu objeto remoto. Use o seu
cliente para acessar os objetos remotos registrados
nas mquinas de seus colegas.

19
Resumo
java.rmi.Remote extends interface Mensagem extends Remote{ Mensagem.java
void getMensagem() throws RemoteException;
} 1
java.rmi.server.UnicastRemoteObject
implements
2
extends
MensagemImpl.java MensagemImpl_Skel
MensagemImpl_Stub
Mensagem.java
5 4 ...
MensagemServer.java void getMensagem throws
Mensagem h =(Mensagem) MensagemImpl rf = RemoteException {
Naming.lookup("hello"); System.out.println("Hello");
Stub Skel
new MensagemImpl();
h.getMensagem(); Naming.bind(rf, "hello"); }
3

6 Java 2 RMIC
compiler

lookup() bind() MensagemServer


MensagemClient RMIRegistry

MensagemImpl
(obj remoto)
MensagemImpl_Stub MensagemImpl_Skel
JRMP
20
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
21

Vous aimerez peut-être aussi