Você está na página 1de 354

FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 1

Programao emJava:
linguagem, APIs, boas prticas e Eclipse
FEUP, Novembro 2005
Ademar Aguiar
ademar.aguiar @ fe.up.pt
http://www.ademarguiar.org/
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 2
Objectivos
Aprender a desenvolver programas em linguagem Java:
utilizar os principais utilitrios do kit de desenvolvimento para Java (JDK)
verso 1.4.2.
desenvolver interfaces grficas em linguagem Java recorrendo aos
packages AWT e Swing.
conhecer e utilizar as principais funcionalidades disponveis nos packages
de coleces, entrada e sada de dados, acesso a dados de bases de dados
e acesso a dados remotos.
Motivar os participantes para a adopo de boas prticas de
desenvolvimento de software:
testes unitrios, refactoring, padres de desenho, reviso de cdigo,
documentao,
Utilizar o Eclipse como ambiente de desenvolvimento (IDE).
Consolidao dos conhecimentos transmitidos atravs da sua
aplicao na resoluo de exerccios prticos.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 3
Contedos
Parte 1: Introduo ao Java e Classes fundamentais
Parte 2: Collections e Entrada/sada de dados
Parte 3: Interfaces grficas com Swing
Parte 4: Acesso a dados remotos por JDBC e HTTP
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 4
Bibliografia
Object-oriented Design With Applications", Grady Booch,,
The Benjamin/cummings Publishing Company Inc., 2nd
Edition, Redwood City, California, 1995.
The Java Programming Language", K. Arnold, J. Gosling,
Adisson-Wesley, 2nd Edition, 1998, ISBN 0-201-31006-6.
"Java in a Nutshell", Flanagan, David, O'Reilly &
Associates, 2004.
"Java Examples in a Nutshell", Flanagan, David, 3rd
edition, O'Reilly & Associates, 2004.
Eclipse: Eclipse Rich Client Platform: Designing, Coding,
and Packaging Java Applications, Jeff McAffer, Jean-
Michel Lemieux, Eclipse series, Addison-Wesley, 2005.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 5
Parte 1
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 6
Introduo ao Java
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 7
Objectivos
Identificar os elementos principais do Java
Descrever a Java Virtual Machine (JVM)
Comparar a utilizao do Java para a construo de
applets e de aplicaes
Identificar os componentes principais do Java
Development Kit (JDK)
Descrever as opes de instalao do Java (deployment)
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 8
O que o Java?
Concebido pela Sun para a electrnica de consumo, mas
rapidamente alcanou a WWW.
Uma linguagem orientada por objectos e um conjunto de
bibliotecas de classes (frameworks).
Utiliza uma mquina virtual para a execuo de
programas.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 9
Vantagens Principais do Java
Linguagem orientada por objectos
Interpretado e independente da plataforma
Dinmico e distribudo
Multi-threaded
Robusto e seguro
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 10
Independente da Plataforma
O cdigo Java armazenado num ficheiro .java
Um programa . j ava compilado para ficheiros . cl ass
Bytecodes so interpretados em tempo de execuo
Compile Compile
movie.java movie.java
JVM JVM
executar executar
programa programa
movie.class movie.class
(javac) (javac) (java) (java)
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 11
Ambiente de Segurana do Java
Interfaces especficas
Carregador de Classes
Verificador de Bytecode
Linguagem e Compilador
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 12
Applets Java
A forma mais comum de utilizao do Java, inicialmente
Vocacionada para utilizao em pginas HTML
Pode incluir contedos activos (forms, udio, imagens,
vdeo)
Aparece num browser e pode comunicar com o servidor
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 13
Aplicaes Java
Instalao no lado do cliente
JVM corre em aplicaes autnomas
No necessita de carregar classes pela rede
Instalao do lado do servidor
Pode servir mltiplos clientes a partir de uma mesma origem
Encaixa bem com modelos multi-camada para computao na
Internet
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 14
JVM - Java Virtual Machine
Operating system
JVM
Application
Browser
JVM
Applet
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 15
Como funciona a JVM
O JVM class loader carrega todas as classes necessrias.
O JVM verifier verifica os bytecodes ilegais.
O gestor de memria da JVM liberta memria de volta ao
sistema operativo.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 16
Compiladores Just-in-Time (JIT)
Melhoram a performance
So teis se os mesmos bytecodes forem executados
repetidas vezes
Traduz bytecodes para instrues nativas
Optimizam cdigo repetitivo, tais como ciclos
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 17
Java e Computao na Internet
A computao na Internet opera-se em trs camadas:
Java pode ser usada em todas estas camadas.
Data server Data server Application Application
server server
Client Client
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 18
Resumo
O cdigo Java compilado para bytecodes independentes
da plataforma.
Os bytecodes so interpretados por uma JVM.
As applets correm num browser no cliente.
As aplicaes Java so executadas de forma autnoma
tanto no cliente como no servidor.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 19
Conceitos Bsicos do Java
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 20
Objectivos
Conhecer os elementos principais do Java
Conhecer a sntaxe bsica do Java
Descrever ficheiros . j ava e . cl ass
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 21
Tpicos
Componentes Java
Convenes
Classes, objectos e mtodos
Utilizao de Javadoc
Compilar e executar programas Java
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 22
JDK - Java Development Kit
O JDK da Sun fornece:
Compilador (javac)
Visualizador de applets (appletviewer)
Interpretador de bytecode (java)
Gerador de documentao (javadoc)
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 23
JDK - Java Development Kit
O JDK da Sun fornece pacotes standard para:
linguagem
sistema de janelas
controlo de applets
entrada/sada
comunicao em rede
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 24
JDK - Java Development Kit
O JDK da Sun fornece suporte de documentao para:
Comentrios
Implementao
Documentao
Gerador de Documentao (j avadoc)
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 25
Convenes de Nomes
As convenes incluem:
Nomes de ficheiros (Palavras capitalizadas)
Customer.java, RentalItem.java
Nomes de Classes (Palavras capitalizadas)
Customer, RentalItem, InventoryItem
Nomes de Mtodos (verbo + palavras capitalizadas)
getCustomerName(), setRentalItemPrice()
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 26
Convenes de Nomes...
Standard para variveis
customerName, customerCreditLimit
Standard para constantes
MIN_WIDTH, MAX_NUMBER_OF_ITEMS
Utilizao de caracteres maisculos e minsculos
Nmeros e caracteres especiais
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 27
Definio de Classes
A definio de classes normalmente inclui:
Modificador de acesso: public, private
A palavra-chave class
Campos das instncias
Construtores
Mtodos das instncias
Campos da classe
Mtodos da classe
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 28
Definio de Classes...
public class Customer {
// Instance variveis
String customerName;
String customerPostalCode;
float customerAmountDue;

// Instance mtodos
float getAmountDue (String cust) {

}
Declara Declara o o
Vari Vari vel vel
de de
Instncia Instncia
M M todo todo
da da
Instncia Instncia
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 29
Definio de Mtodos
Sempre dentro de uma classe
Especificam:
Modificador de acesso
Palavra-chave static
Argumentos
Tipo de retorno
[access-modifiers] [static] <return-type>
<method-name> ([arguments]) <java code block>
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 30
Definio de Mtodos
float getAmountDue (String cust) {
// mtodo variveis
int numberOfDays;
float due;
float lateCharge = 1.50;
String customerName;
// mtodo body
numberOfDays = this.getOverDueDays();
due = numberOfDays * lateCharge;
customerName = getCustomerName(cust);
return due;
}
Declara Declara o o
Vari Vari veis veis
de m de m todo todo
Instru Instru es es
de m de m todo todo
Retorno Retorno
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 31
Variveis e Constantes
Devem ser declaradas antes de ser utilizadas
Uma declarao por linha
No incio de um bloco de cdigo
O bloco de cdigo define o mbito
A inicializao imediata opcional
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 32
Variveis e Constantes
float getAmountDue (String cust) {
float due = 0;
int numberOfDays = 0;
float lateFee = 1.50;
{int tempCount = 1; // new code block
due = numberOfDays * lateFee;
tempCount++;

} // end code block


return due;
}
Vari Vari veis veis
de m de m todo todo
Vari Vari veis veis
tempor tempor rias rias
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 33
Criao de blocos de cdigo
Agrupar todas as declaraes de classe.
Agrupar todas as declaraes de mtodos.
Agrupar outros segmentos de cdigo relacionado entre si.
public class SayHello {
public static void main(String[] args) {
System.out.println("Hello world");
}
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 34
Criao de instrues
As instrues terminam sempre com um ponto-e-vrgula (;)
Instrues compostas so definidas dentro de chavetas { }.
Utilizar chavetas para instrues de controlo.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 35
Compilar e Executar Aplicaes
Para compilar um ficheiro .java:
Para executar um ficheiro .class:
Ateno s maisculas e minsculas!
$aaguiar> javac SayHello.java
compiler output
$aaguiar> java SayHello
Hello world
Prompt>
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 36
Resumo
O JDK fornece as ferramentas Java essenciais.
O JDK fornece um conjunto valioso de classes e mtodos
pr-definidos.
Os programas Java so constitudos por classes, objectos,
e mtodos.
A adopo de normas de programao facilita a leitura e
reutilizao de cdigo.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 37
Exerccios
Ex1. Instalar JDK 1.4.2_05
Ex2. HelloWorld
Ex3. Instalar Eclipse 3.1.1
Ex4. FizzBuzz
Ex5. Echo
Ex6. Reverse Echo
Ex7. Factorial
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 38
Tipos de Dados e Operadores
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 39
Objectivos
Descrever os tipos de dados primitivos
Declarar e inicializar variveis primitivas
Utilizar operadores para manipular o valor de uma varivel
primitiva
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 40
Tpicos
O Java oferece primitivas para os tipos de dados bsicos.
As primitivas so a fundao para armazenar e utilizar
informao.
Declarar e inicializar primitivas a base da construo de
tipos definidos pelo utilizador.
Os operadores manipulam dados e objectos.
Aceitam um ou mais argumentos e produzem um valor.
Java oferece 44 operadores diferentes.
Alguns operadores alteram o valor do operando.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 41
Variveis
A varivel a unidade bsica de armazenamento.
As variveis devem ser declaradas explicitamente.
Cada varivel tem um tipo, um identificador, e um mbito.
As variveis podem ser inicializadas.
int myAge;
boolean isAMovie;
float maxItemCost = 17.98;
Tipo Tipo
Identificador Identificador
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 42
Nomes de Variveis
Os nomes das variveis devem comear por uma letra do
alfabeto, um underscore, ou um $.
Os outros caracteres podem incluir digitos.
Deve-se utilizar nomes elucidativos para as variveis; por
exemplo,
customerFirstName, ageNextBirthday.
a item_Cost
itemCost _itemCost
item$Cost itemCost2

item#Cost item-Cost
item*Cost abstract
2itemCost

FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 43


Palavras Reservadas
abstract
final
native
private
protected
public
static
synchronized
transient
volatile
break
case
catch
continue
default
do
else
finally
for
if
return
switch
throw
try
while
boolean
byte
char
double
float
int
long
short
void
false
null
true
class
extends
implements
interface
throws
instanceof
new
super
this
import
package
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 44
Tipos de Variveis
Oito tipos de dados primitivos:
Seis tipos numricos
Tipo char, para caracteres
Tipo Booleano, para valores verdadeiro ou falso
Tipos definidos pelo utilizador
Classes
Interfaces
Arrays
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 45
Tipos de Dados Primitivos
Integer Floating
Point
Character True
False
byt e f l oat char bool ean
shor t doubl e
i nt
l ong
1, 2, 3, 42
07
0xf f
3. 0
. 3337
4. 022E23
' a'
' \ 141'
' \ u0061'
' \ n'
t r ue
f al se


FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 46
Declarao de Variveis
A forma bsica de declarao de uma varivel:
As variveis podem ser inicializadas quando declaradas.
public static void main(String[] args) {
int itemsRented;
float itemCost;
int i, j, k;
double interestRate;
}
tipo tipo identifier identifier [ = valor] [ = valor]
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 47
Declarao de Variveis
As variveis locais esto contidas apenas num mtodo ou
bloco de cdigo.
As variveis locais devem ser inicializadas antes de ser
usadas.
class Rental {
private int instVar; // instance varivel
public void addItem() {
float itemCost = 3.50; // local varivel
int numOfDays = 3; // local varivel
}
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 48
Literais Nmericos
0 1 42 - 23795 ( deci mal )
02 077 0123 ( oct al )
0x0 0x2a 0X1FF ( hex)
365L 077L 0x1000L ( l ong)
1. 0 4. 2 . 47
1. 22e19 4. 61E- 9
6. 2f 6. 21F
Literais Inteiros Literais Inteiros
Literais Literais
Floating Floating- -point point
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 49
Literais no-Nmericos
t r ue f al se
' a' ' \ n' ' \ t ' ' \ 077'
' \ u006F'
"Hel l o, wor l d\ n"
Literais Booleanos Literais Booleanos
Literais String Literais String
Literais Caracter Literais Caracter
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 50
Exerccio: Declarao de variveis
Encontrar os erros no cdigo abaixo e corrigi-los.
byte sizeof = 200;
short mom = 43;
short hello mom;
int big = sizeof * sizeof * sizeof;
long bigger = big + big + big // ouch
double old = 78.0;
double new = 0.1;
boolean consequence = true;
boolean max = big > bigger;
char maine = "New England state";
char ming = 'd';
1
2
3
4
5
6
7
8
9
10
11
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 51
Operadores
Cinco tipos de operadores:
Atribuio
Aritmticos
Manipulao de bits
Relacionais
Booleanos
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 52
Operador de Atribuio
A expresso da direita atribuda varivel da esquerda:
A expresso da direita sempre avaliada antes da
atribuio.
As atribuies podem ser agrupadas:
int var1 = 0, var2 = 0;
var1 = 50; // var1 now equals 50
var2 = var1 + 10; // var2 now equals 60
var1 = var2 = var3 = 50;
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 53
Operadores Aritmticos
Realizam operaes aritmticas bsicas
Operam sobre variveis e literais nmericos
int a, b, c, d;
a = 2 + 2; // addition
b = a * 3; // multiplication
c = b - 2; // subtraction
d = b / 2; // division
e = b % 2; // returns the remainder of division
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 54
Operadores Aritmticos...
A maioria das operaes resultam num int ou long:
Valores byte, char, e short so promovidos a int antes da
operao.
Se algum argumento for long, o outro promovido a long, e
o resultado long.
byte b1 = 1, b2 = 2, b3;
b3 = b1 + b2; // error: result is an int
// b3 is byte
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 55
Converses e Casts
O Java converte automaticamente valores de um tipo
numrico para outro tipo maior.
O Java no faz automaticamente o downcast.
byte byte long long int int short short
byte byte
short short
int int
long long
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 56
Incrementar e Decrementar
O operador ++ incrementa 1 unidade:
O operador ++ pode ser usado de duas maneiras:
O operador -- decrementa 1 unidade.
int var1 = 3;
var1++; // var1 now equals 4
int var1 = 3, var2 = 0;
var2 = ++var1; // Prefix: Increment var1 first,
// then assign to var2.
var2 = var1++; // Postfix: Assign to var2 first,
// then increment var1.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 57
Comparaes
Operadores relacionais e de igualdade:
greater than
greater than or equal to
less than
less than or equal to
equal to
not equal to
>
>=
<
<=
==
!=
int var1 = 7, var2 = 13;
boolean res = true;
res = (var1 == var2); // res now equals false
res = (var2 > var1); // res now equals true
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 58
Operadores Lgicos
Os resultados de expresses Booleanas podem ser
combinados usando operadores lgicos:
e (with / without short-circuit evaluation)
or (with / without short-circuit evaluation)
exclusive or
not
&& &
|| |
^
!
int var0 = 0, var1 = 1, var2 = 2;
boolean res = true;
res = (var2 > var1) & (var0 == 3); // now false
res = !res; // now true
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 59
Atribuio Composta
O operador de atribuio pode ser combinado com
qualquer operador binrio convencional:
double total=0, num = 1;
double percentage = .50;

total = total + num; // total is now 1


total += num; // total is now 2
total -= num; // total is now 1
total *= percentage; // total is now .5
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 60
Precedncia de Operadores
Operators
++ -- + - ~
!(type)
* / %
+ - +
<< >> >>>
< > <= >=
instanceof
== !=
&
^
|
&&
||
?:
= op=
Comments
Unary operadores
Multiply, divide, remainder
Add, subtract, add string
Shift (>>> is zero-fill shift)
Relational, tipo compare
Equality
Bit/logical e
Bit/logical exclusive OR
Bit/logical inclusive OR
Logical e
Logical OR
Conditional operador
Assignment operadores
Order
1
2
3
4
5
6
7
8
9
10
11
12
13
Assoc.
R
L
L
L
L
L
L
L
L
L
L
R
R
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 61
Precedncias
A precedncia de um operador determina a ordem pela
qual os operadores so executados:
Operadores com a mesma precedncia so executados da
esquerda para a direita (ver nota):
Os parntesis permitem alterar a ordem definida.
int var1 = 0;
var1 = 2 + 3 * 4; // var1 now equals 14
int var1 = 0;
var1 = 12 - 6 + 3; // var1 now equals 9
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 62
Concatenao de Strings
O operador + cria e concatena strings:
String name = "Jane ";
String lastName = "Hathaway";
String fullName;
name = name + lastName; // name is now
//"Jane Hathaway"
// OR
name += lastName; // same result
fullName = name;
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 63
Resumo
O Java tem oito tipos de dados primitivos.
Uma varivel deve ser declarada antes de ser usada.
O Java dispe de um bom conjunto de operadores.
Casting explcitos podem ser necessrios se utilizar tipos
de dados menores do que int.
Os operadores + e += podem ser usados para criar e
concatenar strings.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 64
Exerccios...
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 65
Instrues de Controlo de Fluxo
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 66
Objectivos
Ser capaz de:
Utilizar construes para tomar decises
Realizar ciclos de operaes
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 67
Tpicos
O cdigo por defeito executa sequencialmente.
Cdigo mais complexo exige uma execuo condicional.
Existem instrues que necessitam de ser executadas
repetidamente.
O Java dispe de mecanismos de controlo standard.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 68
Tipos Bsicos de Controlo
Controlo de fluxo pode ser categorizado em quatro tipos:
Sequencial Sequencial
Transferncia Transferncia
Selec Selec o o
Itera Itera o o
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 69
Controlo de Fluxo em Java
Agrupar instrues utilizando chavetas para formar uma
instruo composta, i.e. um bloco.
Cada bloco executado como uma nica instruo dentro
da estrutura de controlo de fluxo.
{
boolean finished = true;
System.out.println("i = " + i);
i++;
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 70
if ... else
if ( boolean_expr )
statement1;
[else]
statement2;
if (i % 2 == 0)
System.out.println("Even");
else
System.out.println("Odd");

if (i % 2 == 0) {
System.out.println(i);
System.out.println(" is even");
}
Forma geral: Forma geral:
Exemplos: Exemplos:
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 71
if...if...if...else if...else
if (speed >= 25)
if (speed > 65)
System.out.println("Speed over 65");
else
System.out.println("Speed over 25");
else
System.out.println("Speed under 25");
if (speed > 65)
System.out.println("Speed over 65");
else if (speed >= 25)
System.out.println("Speed over 25");
else
System.out.println("Speed under 25");
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 72
Operador Condicional ( ? : )
( boolean_expr ? expr1 : expr2)
uma alternativa til ao ifelse:
Se boolean_expr=true, o resultado expr1, seno o
resultado expr2:
boolean_expr ? expr1 : expr2
int val1 = 120, val2 = 0;
int highest;
highest = (val1 > val2) ? 100 : 200;
System.out.println("Highest value is " + highest);
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 73
Exerccio: Descubra os Erros!
int x = 3, y = 5;
if (x >= 0)
if (y < x)
System.out.println("y is less than x");
else
System.out.println("x is negative");
int x = 7;
if (x = 0)
System.out.println("x is zero");
int x = 15, y = 24;
if ( x % 2 == 0 && y % 2 == 0 );
System.out.println("x and y are even");
1
2
3
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 74
switch...case
til para seleccionar um entre vrios valores inteiros
alternativos
switch ( integer_expr ) {
case constant_expr1:
statement1;
break;
case constant_expr2:
statement2;
break;
[default:
statement3;
break;]
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 75
switch...case
As etiquetas de
case devem ser
constantes.
Utilizar break para
saltar fora do
switch.
Dar sempre uma
alternativa default.
switch (choice) {
case 37:
System.out.println("Coffee?");
break;
case 45:
System.out.println("Tea?");
break;
default:
System.out.println("???");
break;
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 76
Ciclos
Em Java existem trs tipos de ciclos:
while
dowhile
for
Todos os ciclos tm quatro partes:
Inicializao
Iterao
Corpo
Terminao
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 77
while...
O while o mais simples de todos os ciclos:
Exemplo:
while ( boolean_expr )
statement;
int i = 0;
while (i < 10) {
System.out.println("i = " + i);
i++;
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 78
dowhile
Os ciclos dowhile tm o teste no fim do ciclo:
Exemplo:
do
statement;
while ( termination );
int i = 0;
do {
System.out.println("i = " + i);
i++;
} while (i < 10);
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 79
for...
Os ciclos for so os mais comuns:
Exemplo:
Qual o ciclo while equivalente?
for (i = 0; i < 10; i++)
System.out.println(i);
for ( initialization; termination; iteration )
statement;
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 80
for...
Podem ser declaradas variveis na parte de inicializao
do ciclo for:
As partes de inicializao e iterao podem consistir de
uma lista de expresses separadas por vrgulas:
for (int i = 0; i < 10; i++)
System.out.println("i = " + i);
for (int i = 0, j = 10; i < j; i++, j--) {
System.out.println("i = " + i);
System.out.println("j = " + j);
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 81
Exerccio: Descubra os Erros!
int x = 10;
while (x > 0);
System.out.println(x--);
System.out.println("We have lift off!");
int x = 10;
while (x > 0)
System.out.println("x is " + x);
x--;
int sum = 0;
for (; i < 10; sum += i++);
System.out.println("Sum is " + sum);
1
2
3
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 82
break
Interrompe um ciclo ou uma instruo switch:
Transfere o controlo para a primeira instruo depois do
corpo do ciclo ou instruo switch
Pode simplificar o cdigo

while (age <= 65) {


balance = (balance+payment) * (1 + interest));
if (balance >= 250000)
break;
age++;
}

FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 83

for (int year = 2000; year < 2099; year++) {


if ((year % 100 == 0) && (year % 400 != 0))
continue;
if (year % 4 == 0)
System.out.println(year);
}

continue
Apenas pode ser usado em ciclos
Abandona a iterao em curso e salta para a prxima
iterao do ciclo
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 84
labeled break, continue
Pode ser usado para saltar fora de ciclos encaixados, ou
continuar um ciclo exterior ao ciclo corrente
outer_loop:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 5; j++) {
System.out.println(i, j);
if (i + j > 7)
break outer_loop;
}
}

FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 85


Resumo
A intruo if...else a forma principal de implementar
decises.
Java tambm dispe de instruo switch.
Java oferece trs instrues de ciclos:
while
dowhile
for
A utilizao de break e continue deve ser feita
criteriosamente.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 86
Exerccios...
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 87
Reviso de Conceitos de
Orientao por Objectos
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 88
Tpicos
Objectos: estado, comportamento
Classes
Encapsulamento
Agregao: hierarquia de objectos
Herana: hierarquia de classes
Polimorfismo
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 89
Orientao por Objectos
OO um paradigma diferente para desenho e
programao de software
OO baseia-se na construo de modelos de objectos reais
OO cria programas que so reutilizveis e facilmente
adaptveis
Os objects so autnomos e incluem informao e
comportamento
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 90
O que um Objecto?
Definio filosfica: uma entidade que pode ser
identificada
Na terminologia
OO: uma abstraco de um objecto real
empresarial: uma entidade relevante para o domnio de aplicao
software: uma estrutura de dados e as funes associadas
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 91
Os Objectos executam Operaes
Um objecto existe para contribuir com funcionalidade
(comportamento) a um sistema.
Cada comportamento distinto dado o nome de operao.
Objecto: Objecto:
A minha caneta azul A minha caneta azul
Opera Opera o: o:
escrever escrever
Objecto: Objecto:
Caixa Multibanco Caixa Multibanco
Opera Opera o: o:
levantamento levantamento
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 92
Os Objectos memorizam Valores
Os objects tm conhecimento (informao) sobre o seu
estado actual.
Cada elemento de informao dado o nome de atributo.
Tinta
Atributo: Atributo:
Volume de tinta Volume de tinta
Atributo: Atributo:
Dinheiro levantado Dinheiro levantado
Objecto: Objecto:
A minha caneta azul A minha caneta azul
Objecto: Objecto:
Caixa Multibanco Caixa Multibanco
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 93
Os Objectos so Abstraces
No modelo de um objecto, apenas necessrio incluir
operaes e atributos que so importantes para o
problema em questo.
Exemplo de uma opera Exemplo de uma opera o que no interessa incluir: o que no interessa incluir:
apontar apontar- -a a
Exemplos de atributos que no interessam incluir: Exemplos de atributos que no interessam incluir:
comprimento do bico comprimento do bico
fabricante da tinta fabricante da tinta
idade idade
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 94
Encapsulamento
O encapsulamento permite ocultar como as coisas
funcionam e o que se sabe para alm da interfaceas
operaes de um objecto.
Uma caixa Multibanco um objecto que entrega dinheiro
aos seus utilizadores:
A caixa MB encapsula isto para os seus utilizadores.
Violar o encapsulamento considerado um roubo ao banco.
Violar o encapsulamento em programao orientada por
objectos impossvel.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 95
Um banco pode Um banco pode
ser um objecto. ser um objecto.
Um banco pode ter Um banco pode ter
uma caixa MB que uma caixa MB que
tamb tamb m pode ser um m pode ser um
objecto. objecto.
Uma caixa MB pode ter um Uma caixa MB pode ter um
teclado, leitor de cartes, teclado, leitor de cartes,
dispensador de notas, todos dispensador de notas, todos
podendo ser objectos. podendo ser objectos.
Hierarquias de objectos
Os objectos so compostos por outros objectos.
Os objectos podem fazer parte de outros objectos.
Esta relao entre objectos conhecida por agregao.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 96
Quando se cria a Quando se cria a minha caneta azul minha caneta azul , no , no necess necess rio rio
especificar as suas opera especificar as suas opera es e atributos. es e atributos.
Basta simplesmente indicar a classe a que pertence. Basta simplesmente indicar a classe a que pertence.
O que uma Classe?
Uma classe uma especificao de objectos.
Uma definio de uma classe especifica as operaes e
atributos para todas as instncias de uma classe.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 97
Porque necessitamos de classes?
Uma classe descreve o tipo de um objecto.
Uma classe define o comportamento (operaes) e
estrutura (atributos) de um grupo de objectos:
Pode-se reduzir a complexidade utilizando classes.
No mundo existem imensos objectos, razo pela qual as pessoas os
agrupam em tipos.
Se se compreender o tipo, pode-se aplic-lo a vrios objectos.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 98
Classes versus Objectos
As classes so definies estticas que nos permitem
compreender todos os objectos de uma classe.
Os objectos so as entidades dinmicas que existem no
mundo real e em suas simulaes.
Notaem OO as pessoas frequentemente utilizam ambas
as palavras classes e objectos de forma indiferente;
necessrio utilizar o contexto para distinguir entre os dois
significados possveis.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 99
Herana
Podem existir semelhanas entre classes distintas.
Deve-se definir as propriedades comuns (atributos,
operaes) entre classes numa superclasse comum.
As subclasses utilizam herana para incluir as
propriedades comuns entre elas.
Conta Poupan Conta Poupan a a
Conta Dep Conta Dep sitos sitos Ordem Ordem
Conta Conta
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 100
Relao Is-a-Kind-of
Um objecto de uma subclasse -um-tipo-de objecto de
uma superclasse.
Uma subclasse deve ter todo o comportamento da
superclasse.
Conta Poupan Conta Poupan a a
Conta Conta Caneta Caneta
L L pis pis
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 101
Polimorfismo
O polimorfismo a capacidade de um nico nome poder
referir objectos de classes diferentes, se relacionadas por
uma superclasse comum
O polimorfismo surge quando a linguagem de programao
simultaneamente suporta herana e a associao
dinmica de tipos (late binding)
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 102
Polimorfismo...
O polimorfismo permite que uma operao possa existir
em diferentes classes.
Cada operao tem um mesmo significado mas
executada de forma particular.
Transportar passageiros Transportar passageiros
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 103
Resumo
Um objecto uma abstraco de objecto real.
Uma classe um molde ou frma de objectos.
As classes formam rvores de herana; as operaes
definidas numa classe so herdadas por todas as suas
subclasses.
O polimorfismo liberta quem invoca uma operao de
conhecer a classe exacta do objecto que a ir receber.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 104
Manipulao de
Classes e Objectos
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 105
Objectivos
Utilizar packages para agrupar classes relacionadas
Definir variveis e mtodos de instncias
Criar objectos e invocar mtodos
Utilizar as palavras public, private e protected
Redefinir mtodos de uma classe (overloading)
Escrever construtores
Utilizar variveis e mtodos de classes
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 106
Tpicos
As classes definem as caractersticas, atributos e
comportamento dos objectos.
Todo o cdigo Java reside em classes.
Toda a informao dos objectos armazenada em
variveis.
Os packages auxiliam a controlar o acesso a classes.
O overloading permite ter interfaces simples.
Os construtores garantem consistncia na criao de
objectos.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 107
Classes Java
Package
Mtodos Objectos
Referncias
para Objectos
Atributos
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 108
Packages
AcmeVideo
Copy Title Rental
Game Member Movie
AcmeVideo
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 109
Controlo de Acesso
AcmeVideo
AcmeTools
private
protected
public
public
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 110
Classes e Objectos
Cada objecto Cada objecto
uma instncia de uma instncia de
uma classe. uma classe.
public void displayDetails()
private String title;
private String rating;
public void setRating()
title: Gone with
rating: PG
title: Last Action
rating: PG-13
Movie
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 111
Criao de Objectos
Os objectos so criados pelo operador new:
Por exemplo, para criar dois objectos Movie:
Movie mov1 = new Movie("Gone ...");
Movie mov2 = new Movie("Last ...");
objectRef = new ClassName();
title: Gone with
rating: PG
title: Last Action
rating: PG-13
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 112
new
O operador new realiza o seguinte:
Aloca memria para o novo objecto
Invoca um mtodo especial da classe para inicializao de objectos,
um constructor
Retorna uma referncia para o novo objecto
Movie mov1 = new Movie("Gone...");
title: Gone...
rating: PG
mov1
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 113
Objectos e valores primitivos
As variveis de tipos
primitivos armazenam
valores.
As variveis de tipos de
classes armazenam
referncias para objectos.
int i;
int j = 3;
Movie mov1 = new Movie();
title: null
rating: null
mov1
null
Movie mov1;
mov1
0
3
i
j
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 114
A referncia null
As referncias para objectos tm o valor null at serem
inicializadas.
possvel comparar referncias de objectos a null.
Pode-se eliminar um objecto pela atribuio do valor
null a uma referncia.
Movie mov1 = null; //Declare object reference

if (mov1 == null) //Ref not initialized?


mov1 = new Movie(); //Create a Movie object

mov1 = null; //Forget the Movie object


FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 115
Atribuio de Referncias
A atribuio de uma referncia a outra resulta em duas
referncias para o mesmo objecto:
Movie mov1 = new Movie("Gone...");
mov1
Movie mov2 = mov1;
mov2
title: Gone ...
rating: PG
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 116
Variveis de instncia
As variveis de instncia so declaradas na classe:
Criao de vrios movie:
public class Movie {
public String title;
public String rating;

}
Movie mov1 = new Movie();
Movie mov2 = new Movie();
title: null
rating: null
mov2
title: null
rating: null
mov1
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 117
Acesso a variveis de instncia
As variveis pblicas de instncia podem ser acedidas
atravs do operador . :
public class Movie {
public String title;
public String rating;

}
Movie mov1 = new Movie();
mov1.title = "Gone ...";

if ( mov1.title.equals("Gone ... ") )


mov1.rating = "PG";
Ser Ser isto interessante? NO! isto interessante? NO!
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 118
Criar e manipular objectos
public class MovieTest {
public static void main(String[] args) {
Movie mov1, mov2;
?
mov1.title = "Gone with the Wind";
mov2 = mov1;
mov2.title = "Last Action Hero";
System.out.println("Movie 1 is " + ? );
System.out.println("Movie 2 is " + ? );
}
}
public class Movie {
public String title;
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 119
Mtodos
Um mtodo equivalente a uma funo ou subrotina de
outras linguagens:
Um mtodo apenas pode ser definido na definio de uma
classe.
modifier returnType methodName (argumentList) {
// method body

}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 120
Argumentos de Mtodos
public void displayDetails() {
System.out.println("Title is " + title);
System.out.println("Rating is " + rating);
}
public void setRating(String newRating) {
rating = newRating;
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 121
Retorno de valores dum mtodo
public class Movie {
private String rating;

public String getRating () {


return rating;
}
public void setRating (String r) {
this.rating = r;
}
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 122
Invocar mtodos a uma instncia
public class Movie {
private String title, rating;
public String getRating(){
return rating;
}
public void setRating(String newRating){
rating = newRating;
}
}
Movie mov1 = new Movie();

if (mov1.getRating().equals("G"))
Operador . :
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 123
Encapsulamento
As variveis de instncia devem ser declaradas private.
Apenas mtodos de instncia podem ter acesso a
variveis de instncia.
O encapsulamento permite isolar a interface d uma classe
da sua implementao interna.
Movie mov1 = new Movie();

if ( mov1.rating.equals("PG") ) // Error
mov1.setRating("PG"); // OK
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 124
Passagem de valores a mtodos
Quando um valor primitivo passado a um mtodo,
gerada uma cpia do valor:
public void aMethod(int arg) {
if (arg < 0 || arg > 100)
arg = 0;
System.out.println("arg: " + arg);
}
int num = 150;
anObj.aMethod(num);
System.out.println("num: " + num);
num
150
arg
150
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 125
Passagem de objectos a mtodos
Quando um objecto passado a um mtodo, o argumento
refere o objecto original:
public void aMethod(Movie ref2) {
ref2.setRating("R");
}
title: " Gone"
rating: " R"
mov1
ref2
Movie mov1 =
new Movie("Gone");
mov1.setRating("PG");
anObj.aMethod(mov1);
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 126
Overloading de mtodos
Diversos mtodos de uma classe podem ter o mesmo
nome.
Os mtodos devem ter diferentes assinaturas.
public class Movie {
public void setPrice() {
price = 3.50;
}
public void setPrice(float newPrice) {
price = newPrice;
}
}
Movie mov1 = new Movie();
mov1.setPrice();
mov1.setPrice(3.25);
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 127
Inicializao de atributos
As variveis de instncia podem ser inicializadas na sua
declarao.
A inicializao feita na criao do objecto.
Inicializaes mais complexas devem ser colocadas num
mtodo construtor.
public class Movie {
private String title;
private String rating = "G";
private int numOfOscars = 0;
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 128
Construtores
Para uma inicializao adequada, a classe deve fornecer
construtores.
O construtor invocado automaticamente quando o
objecto criado:
Normalmente declarado public
Tem o mesmo nome da classe
No especifica nenhum tipo de retorno
O compilador automaticamente fornece um construtor por
defeito sem argumentos.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 129
Definio de Construtores
public class Movie {
private String title;
private String rating = "PG";
public Movie() {
title = "Last Action ";
}
public Movie(String newTitle) {
title = newTitle;
}
}
Movie mov1 = new Movie();
Movie mov2 = new Movie("Gone ");
Movie mov3 = new Movie("The Good ");
A classe Movie A classe Movie
fornece dois fornece dois
construtores construtores
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 130
A referncia this
Os mtodos de instncia recebem um argumento com o
nome this, que refere para o objecto corrente.
public class Movie {
public void setRating(String newRating) {
this.rating = newRating;
}
void anyMethod() {
Movie mov1 = new Movie();
Movie mov2 = new Movie();
mov1.setRating("PG");
title: null
rating: null
mov2
mov1
title : null
rating: PG
this
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 131
Partilha de cdigo entre construtores
public class Movie {
private String title;
private String rating;
public Movie() {
this("G");
}
public Movie(String newRating) {
rating = newRating;
}
}
Um construtor Um construtor
pode invocar pode invocar
outro atrav outro atrav s de s de
this() this()
Movie mov2 = new Movie();
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 132
title
rating
Variveis de Classe
As variveis de classe pertencem a uma classe e so
comuns a todas as instncias dessa classe.
As variveis de classe so declaradas como static na
definio da classe.
public class Movie {
private static double minPrice; // class var
private String title, rating; // inst vars
title
rating
title
rating
minPrice
classe Movie objectos Movie
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 133
Inicializao de variveis de classe
As variveis de classe podem ser inicializadas na
declarao.
A inicializao realizada quando a classe carregada.
public class Movie {
private static double minPrice = 1.29;
private String title, rating;
private int length = 0;
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 134
Mtodos de Classe
Os mtodos de classe so partilhados por todas as
instncias.
So teis para manipular variveis de classe:
Um mtodo de classe pode ser invocado utilizando o nome
da classe ou uma referncia para um objecto.
public static void increaseMinPrice(double inc) {
minPrice += inc;
}
Movie.increaseMinPrice(.50);
mov1.increaseMinPrice(.50);
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 135
Mtodos de classe ou de instncia?
public class Movie {
private static float price = 3.50f;
private String rating;

public static void setPrice(float newPrice) {


price = newPrice;
}
public float getPrice() {
return price;
}
}
Movie.setPrice(3.98f);
Movie mov1 = new Movie();
mov1.setPrice(3.98f);
float a = Movie.getPrice();
float b = mov1.getPrice();
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 136
Exemplos de Java
Exemplos de mtodos e variveis static:
main()
Math.sqrt()
System.out.println()
public class MyClass {
public static void main(String[] args) {
double num, root;

root = Math.sqrt(num);
System.out.println("Root is " + root);
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 137
Variveis final
Uma varivel declarada final uma constante.
Uma varivel final no pode ser modificada.
Uma varivel final deve ser inicializada.
Uma varivel final normalmente pblica para permitir
acesso externo.
public final class Color {
public final static Color black=new Color(0,0,0);

}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 138
Garbage Collection
Quando todas as referncia para um objecto so
eliminadas, o objecto marcado para ser destrudo.
Garbage collection liberta a memria utilizada pelo objecto.
Garbage collection automtica.
No existe necessidad de interveno do programador, mas no
possui qualquer controlo sobre quando o objecto realmente
destrudo
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 139
O mtodo finalize()
Se um objecto utilizar um outro recurso (p.e. Um ficheiro),
o objecto deve libert-lo.
Pode ser fornecido um mtodo finalize().
O mtodo finalize() invocado antes do objecto ser
destrudo.
public class Movie {

public void finalize() {


System.out.println("Goodbye");
}
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 140
Resumo
A definio de uma classe especifica as caractersticas comuns
de um conjunto de objectos.
Um objecto uma instncia de uma classe particular:
Criam-se objectos atravs do operador new.
Manipula-se um objecto atravs da invocao de mtodos pblicos de
instncia.
Os mtodos de instncia recebem a referncia this
Os mtodos podem ter diferentes implementaes
As classes fornecem um ou mais construtores para inicializar
objectos.
Podem ser definidos variveis e mtodos para implementar
comportamentos globais classe.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 141
Exerccios...
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 142
Parte 2
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 143
Java Collections Framework (JCF)
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 144
Tipos abstractos de dados
Estrutura de dados + Algoritmos
Standard
Fcil de compreender
Eficiente
Exemplos
Stack, queue, linked list
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 145
Desenho baseado eminterfaces
Separao entre interface e implementao
Especificamente construdo para a linguagem Java
Polimorfismo
List l = new LinkedList();
l.add() invoca o mtodo add() da classe LinkedList
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 146
Framework de Collections
Interoperabilidade entre APIs diferentes
Reduz o esforo de aprendizagem de APIs
Reduz o esforo de desenho e implementaao de APIs
Promove reutilizao de software
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 147
Objectivos da Collections Framework
API pequena
Nmero de interfaces
Nmero de mtodos por interface
Poucos conceitos
Ter como base as coleces do Java (Vector, Hashtable)
Permitir converso para arrays Java
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 148
Disponibilidade da JCF
Includa desde o JDK 1.2
http://java.sun.com/docs/books/tutorial/collections/
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 149
Desenho baseado emInterfaces
i nt er f ace Li st {}
cl ass Li nkedLi st i mpl ement s Li st {}

Li st l = new Li nkedLi st ( ) ;
l . add( new Dat e( ) ) ;
Dat e d = ( Dat e) l . get ( 0) ;
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 150
Interfaces principais
Collection
Set
List
Map
SortedSet
SortedMap
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 151
Interfaces e Classes Utilitrias
Interfaces
Comparator
Iterator
Classes
Collections
Arrays
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 152
Collection
Um grupo de objectos
Principais mtodos:
i nt si ze( ) ;
bool ean i sEmpt y( ) ;
bool ean cont ai ns( Obj ect ) ;
I t er at or i t er at or ( ) ;
Obj ect [ ] t oAr r ay( ) ;
bool ean add( Obj ect ) ;
bool ean r emove( Obj ect ) ;
voi d cl ear ( ) ;
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 153
Set
Set herda de Collection
Uma coleco de objectos no ordenados
No permite elementos duplicados
Os mesmos mtodos de Collection
A semntica diferente; obriga a utilizar uma interface diferente.
Implementada por AbstractSet, HashSet, TreeSet,
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 154
List
List herda de Collection
Uma coleco de objectos no ordenados
Permite elementos duplicados
Principais mtodos:
Obj ect get ( i nt ) ;
Obj ect set ( i nt , Obj ect ) ;
i nt i ndexOf ( Obj ect ) ;
i nt l ast I ndexOf ( Obj ect ) ;
voi d add( i nt , Obj ect ) ;
Obj ect r emove( i nt ) ;
Li st subLi st ( i nt , i nt ) ;
add( ) i nser t s
r emove( ) del et es
Implementada por AbstractList, ArrayList, LinkedList, Vector
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 155
Map
Map no herda de Collection
Um objecto que mapeia chaves para valores
Cada chave pode ter um valor associado
Veio substituir a interface java.util.Dictionary
Ordenao pode ser fornecida por classes de implementao
Principais mtodos:
i nt si ze( ) ;
bool ean i sEmpt y( ) ;
bool ean cont ai nsKey( Obj ect ) ;
bool ean cont ai nsVal ue( Obj ect ) ;
Obj ect get ( Obj ect ) ;
Obj ect put ( Obj ect , Obj ect ) ;
Obj ect r emove( Obj ect ) ;
voi d put Al l ( Map) ;
voi d cl ear ( ) ;
Implementada por HashMap, Hashtable, Attributes, TreeMap,
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 156
Acesso aos membros de um Map
Mtodos
Set keySet ( ) ;
Col l ect i on val ues( ) ;
Set ent r ySet ( ) ;
Map.Entry
Objecto que contmo par chave-valor
- get Key( ) , get Val ue( )
Thread safety
As coleces retornadas so criadas pelo map
- Quando o map alterado, a coleco tambm alterada.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 157
Iterator
Representa um iterador para um ciclo
Criado por Collection.iterator()
Similar Enumeration
Nomes melhorados
Permite a operao remove() no item corrente.
Principais mtodos:
- bool ean hasNext ( ) devol ve t r ue se a i t er ao t em
mai s el ement os
- Obj ect next ( ) devol ve o pr xi mo el ement o na
i t er ao
- voi d r emove( ) r emove o el ement o cor r ent e da
col eco
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 158
ListIterator
A interface ListIterator herda de Iterator
Criado por List.listIterator()
Adiciona mtodos para
Visitar uma List em qualquer direco
Modificar a List durante a iterao
Mtodos adicionados:
hasPr evi ous( ) , pr evi ous( )
next I ndex( ) , pr evi ousI ndex( )
set ( Obj ect ) , add( Obj ect )
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 159
Set: Implementaes
HashSet
Um Set baseado numa hash table
TreeSet
Uma implementao baseada numa rvore binria balanceada
Impe ordenao dos elementos
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 160
List: Implementaes
ArrayList
Uma implementao unsynchronized, sem mtodos legados,
baseada num array de tamanho dinmico, tal como Vector
LinkedList
Uma implementao baseada numa lista duplamente ligada
Pode ter melhor performance do que a ArrayList se os elementos
forem frequentemente inseridos/apagados no meio da lista
til para queues e double-ended queues (deques)
Vector
Uma implementao synchronized baseada num array de tamanho
dinmico e com mtodos legados adicionais.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 161
Map: Implementaes
HashMap
Um Map implementado com base numa tabela de hash
Idntico a Hashtable, mas suporta chaves e valores com null.
TreeMap
Uma implementao baseada numa rvore binria balanceada
Impe ordenao dos elementos
Hashtable
Uma implementao synchronized baseada numa tabela de hash,
com mtodos "legados adicionais.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 162
Ordenao
Disponibilizado por Collections.sort()
Arrays.sort(Object[]) permite ordenar Arrays
SortedSet, SortedMap interfaces
Collections que permitem manter os seus elementos ordenados
Os iterators garantem uma visita ordenada
Ordered Collection Implementations
TreeSet, TreeMap
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 163
Ordenao
Comparable interface
Deve ser implementado por todos os elementos de SortedSet
Deve ser implementado por todos as chaves SortedMap
i nt compar eTo( Obj ect o)
Define uma ordem natural para os objectos de uma classe
Comparator interface
Define uma funo que compara dois objectos
Permite esquemas de ordenao diversos
i nt compar e( Obj ect o1, Obj ect o2)
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 164
Operaes no suportadas
Uma classe de implementao pode decidir no suportar
um determinado mtodo da interface reportando ento
uma excepo em tempo de execuo do tipo
UnsupportedOperationException.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 165
Modificao de Coleces
Modifiable/Unmodifiable
Modifiable: coleces que suportam operaes de
modificao: add(), remove(), clear()
Unmodifiable: coleces que no suportam operaes de
modificao
Mutable/Immutable
Immutable: coleces que garantem que nenhuma
modificao poder ser efectuada por operaes de
interrogao: iterator(), size(), contains()
Mutable: coleces que no garantem serem imutveis.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 166
Thread safety
As Collections, por omisso, NO so thread-safe, por
motivos de performance e simplicidade.
Solues:
Encapsulated Collections
Synchronized Collections
- Li st l i st = Col l ect i ons. synchr oni zedLi st ( new Ar r ayLi st ( . . . ) ) ;
Unmodifiable Collections
- Li st l i st = Col l ect i ons. unmodi f i abl eLi st ( new Ar r ayLi st ( . . . ) ) ;
Fail-fast iterators
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 167
Classes Utilitrias
Collections
sor t ( Li st )
bi nar ySear ch( Li st , Obj ect )
r ever se( Li st )
shuf f l e( Li st )
f i l l ( Li st , Obj ect )
copy( Li st dest , Li st sr c)
mi n( Col l ect i on)
max( Col l ect i on)
synchr oni zedX, unmodi f i abl eX f act or y met hods
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 168
Classes Utilitrias
Arrays (mtodos aplicveis a arrays)
sor t
bi nar ySear ch
equal s
f i l l
asLi st r et or na umAr r ayLi st comos cont edos
do ar r ay
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 169
Exerccios...
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 170
Tratamento de Excepes
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 171
Excepes
Permitem tratar (catch) de forma agradvel os erros que
podem acontecer durante a execuo de um programa.
Permitem especificam diferentes formas de tratamento de
excepes distintas.
Oferecem uma forma standard de gerar (throw) erros.
Permitem representar como objectos os erros de um
programa que podem ser recuperados (exceptions).
Permitem criar uma hierarquia extensvel de classes de
excepes para um tratamento de erros preciso.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 172
Tipos de Excepes/Erros
Excepes (podem ser resolvidos pelo programa):
Erros de I/O (teclado/ floppy / disco / entrada de dados)
Erros de rede (internet, LAN)
Casting ilegal, desreferenciao de objectos (null), matemtica
ndice de array / coleco fora dos limites
Erros (no podem ser resolvidos de forma conveniente):
Falta de memria
Erro / bug / crash na Java Virtual Machine
Classes Java requeridas pelo programa corruptas
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 173
Hierarquia de herana de Exception
java.lang.Throwable
Error
ThreadDeath
OutOfMemoryError
VirtualMachineError
Exception
AWTException
IOException
FileNotFoundException
MalformedURLException
RemoteException
SocketException
RuntimeException
ArithmeticException
ClassCastException
IllegalArgumentException
IndexOutOfBoundsException
NullPointerException
UnsupportedOperationException
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 174
Excepes Checked vs. Runtime
checked:
Podem ter sido causadas por algo fora do controlo do nosso
programa; DEVEM ser tratadas pelo nosso cdigo, seno o
programa no compila.
unchecked (runtime):
So culpa nossa!
(provavelmente) poderiamter sido evitadas se fossem devidamente
analisadas e tratadas no cdigo (verificar situaes de erro).
No precisam de ser tratadas, mas faro com que o programa crash
no caso de ocorrerem emruntime.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 175
Gerar Excepes emRuntime
Podem ser geradas em qualquer parte do cdigo pelo
programador.
No precisam de ser tratadas (handled) pelas chamadas que as
apanham.
publ i c Obj ect get ( i nt i ndex) {
/ / ver i f i car se ar gument o vl i do
i f ( i ndex < 0)
throw new IndexOutOfBoundsException(indice < 0!);
r et ur n dados[ i ndex] ;
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 176
Gerar Checked Exceptions
No cabealho do mtodo devem ser especificados os tipos de
excepes que ele pode originar (throws).
Quem invocar um mtodo que possa originar excepes deve
trat-las ou ento passar essas excepes a quem o invocou.
publ i c voi d r eadFi l e( St r i ng f i l eName) throws IOException {
i f ( ! canRead( f i l eName) )
throw new IOException(Cant read file!);
el se
doSomet hi ng( ) ;
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 177
Sntaxe
try
{
codeThat Mi ght Cr ash( ) ;
}
catch ( KindOfException exceptionVarName)
{
/ / code t o deal wi t h i ndex except i on
}
/ / opt i onal !
finally {
/ / code t o execut e af t er t he t r y code,
/ / or except i on s cat ch code has f i ni shed r unni ng
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 178
Tratamento de mltiplas excepes
try {
codeThat Mi ght Cr ash( ) ;
mor eBadCode( ) ;
} catch ( I ndexOut Of BoundsExcept i on i oobe) {
/ / code t o deal wi t h i ndex except i on
} catch ( I OExcept i on i oe) {
/ / opt i onal ; code t o deal wi t h i / o except i on
} catch ( Except i on e) {
/ / opt i onal ; code t o deal wi t h any ot her except i on
} finally {
/ / opt i onal ; code t o execut e af t er t he t r y code,
/ / or except i on s cat ch code has f i ni shed r unni ng
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 179
Try/Catch: Exemplo 1
try {
r eadFi l e( har dcode. t xt ) ;
} catch ( I OExcept i on i oe) {
/ / code coul d t hr ow compi l e- t i me I OExcept i on; must cat ch.
/ / I l l handl e i t by pr i nt i ng an er r or message t o t he user
Syst em. out . pr i nt l n( Unabl e t o r ead f i l e! ) ;
} finally {
/ / whet her i t succeeded or not , I want t o cl ose t he f i l e
cl oseFi l e( ) ;
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 180
Try/Catch: Exemplo 2
whi l e ( t r ue) {
i nt i ndex = kb. r eadI nt ( ) ;
try {
Obj ect el ement = myCol l ect i on. get ( i ndex) ;
br eak; / / i f I get her e, i t must have wor ked!
} catch ( I ndexOut Of BoundsExcept i on i oobe) {
/ / woul dn t have t o cat ch t hi s r unt i me except i on. . .
Syst em. out . pr i nt ( Bad i ndex; t r y agai n. ) ;
}
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 181
Excepes: Boas maneiras
Imprimir uma mensagem de erro (System.out.println)
Abrir uma caixa de erro (em GUIs)
Voltar a perguntar ao utilizador (em erros de teclado)
Tentar a operao novamente (para problemas de I/O)
Corrigir o erro (nem sempre possvel)
Re-lanar a excepo (provavelmente algum acima
conseguir tratar a excepo).
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 182
Ms maneiras de tratar excepes
Try-block muito pequenos.
Try-block muito grandes.
Bloco de instrues do catch muito genrico (Exception).
Bloco de instrues do catch ineficaz ({} ?).
Tratar uma excepo runtime quando podia ter sido
evitada por verificao prvia (null, index).
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 183
A nossa classe Exception
publ i c cl ass DeckExcept i on
extends RuntimeException {
publ i c DeckExcept i on( St r i ng message) {
super ( message) ;
}
publ i c St r i ng t oSt r i ng( ) {
r et ur n Er r or i n deck car d: + get Message( ) ;
}
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 184
Algumas observaes
No se conseguem tratar alguns erros: porqu?
As excepes podem ocorrer em diversas reas:
I/O
rede / internet
Invocao remota de cdigo
Cdigo com reflexo (reflection)
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 185
Preveno / Debugging
Obrigar os mtodos a lanar checked exceptions obriga-
os a serem usados de forma mais cuidadosa.
Tcnica de debug interessante:
new RuntimeException().printStackTrace();
Asseres (J2SE v1.4): testes booleanos
publ i c voi d deposi t ( doubl e amount ) {
asser t amount >= 0. 0;
debugger: Eclipse / JDB (JDK)
logging, profiling
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 186
Referncias
The Java Tutorial: Exception-Handling.
http://java.sun.com/docs/books/tutorial/java/
nutsandbolts/exception.html
The Java Tutorial: Handling Errors with Exceptions.
http://java.sun.com/docs/books/tutorial/essential/
exceptions/index.html
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 187
Entrada/Sada de dados
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 188
Objectivos
Aprender a ler dados de ficheiros.
Compreender o modelo unificado do Java para I/O.
Aprender a serializar objectos.
Compreender a base de acesso a recursos em rede, web,
wireless, etc.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 189
Streams
stream: uma abstraco para uma origem ou destino
de dados
Os bytes fluem de (input) para (output) streams
Podem representar mltiplas fontes de dados:
Ficheiros em disco
Outros computadores em rede
Pginas web
Dispositivos de entrada
(teclado, rato, etc.)
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 190
Hierarquia de Streams
java.io.InputStream
AudioInputStream
FileInputStream
ObjectInputStream
java.io.OutputStream
ByteArrayOutputStream
FileOutputStream
ObjectOutputStream
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 191
Input Streams
Mtodos comuns a todas as input streams:
i nt r ead( ) t hr ows I OExcept i on
l um byte (caracter) de dados
voi d r eset ( ) t hr ows I OExcept i on
inicia a stream para que os seus bytes possam ser lidos novamente
voi d cl ose( ) t hr ows I OExcept i on
notifica a stream de que ela vai deixar de ser usada
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 192
Output Streams
Mtodos comuns a todas as input streams:
voi d wr i t e( i nt n) t hr ows I OExcept i on
escreve um byte (caracter) de dados
voi d f l ush( ) t hr ows I OExcept i on
escreve os bytes que estavam espera para ser escritos
voi d cl ose( ) t hr ows I OExcept i on
notifica a stream de que de que ela vai deixar de ser usada
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 193
Exemplo (MAU, aborrecido)
try {
I nput St r eami n = new Fi l eI nput St r eam( f i l e. t xt ) ;
char oneLet t er = ( char ) i n. read( ) ;
St r i ng st r = a l ong st r i ng;
Out put St r eamout = new Fi l eOut put St r eam( f i l e. t xt ) ;
/ / wr i t e each l et t er of st r i ng t o f i l e
f or ( i nt i i = 0; i i < st r . l engt h( ) ; i i ++)
out . write( st r . char At ( i i ) ) ;
out . close( ) ;
} catch ( I OExcept i on i oe) {
. . .
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 194
Filtered Streams
Uma stream que obtm os seus dados de outra stream.
Pode-se criar cadeias de streams para combinar as suas
capacidades/caractersticas.
A stream exterior pode adicionar funcionalidade stream
interior, ou melhorar a sua funcionalidade
Exemplo do Decorator pattern
I nput St r eami n = new Fi l eI nput St r eam( f i l e. t xt ) ;
Dat aI nput St r eamdi s = new Dat aI nput St r eam( i n) ;
doubl e number = di s. readDouble( ) ;
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 195
Readers e Writers
Classes utilitrias para ajudar a utilizar streams
Colmatam falhas de mtodos em streams e tornam-nas
mais robustas.
Outro exemplo do Decorator pattern.
Os readers so mais comuns do que os writers.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 196
Alguns Readers de interesse
j ava. i o. Reader
publ i c i nt r ead( ) t hr ows I OExcept i on
publ i c bool ean ready( )
j ava. i o. InputStreamReader
publ i c I nput St r eamReader ( I nput St r eami n)
j ava. i o. FileReader
publ i c Fi l eReader ( St r i ng f i l eName)
j ava. i o. BufferedReader
publ i c Buf f er edReader ( Reader r )
publ i c St r i ng readLine( ) t hr ows I OExcept i on
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 197
Mais funcionalidade
I nput St r eami n = new Fi l eI nput St r eam( har dcode. t xt ) ;
I nput St r eamReader i sr = new I nput St r eamReader ( i n) ;
Buf f er edReader br = new Buf f er edReader ( i sr ) ;
St r i ng whol eLi ne = br . readLine( ) ;
/ / or , shor t er synt ax f or r eadi ng f i l es. . .
Buf f er edReader br 2 = new Buf f er edReader (
new Fi l eReader ( har dcode. t xt ) ) ;
St r i ng anot her Li ne = br 2. readLine( ) ;
Mais uma vez, o Decorator pattern.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 198
java.nio: a nova API para I/O
Novas funcionalidades e performance melhorada em termos de
gesto de buffering, dados remotos e I/O de ficheiros, suporte
para character-sets, filtragem com expresses regulares.
A nova API java.nio adiciona funcionalidade API java.io.
As APIs NIO incluem o seguinte:
Buffers para dados de tipos primitivos
Codificadores e descodificadores dependentes do character-set
Pattern-matching atravs de expresses regulares tipo Perl.
Channels, uma nova abstraco de I/O
Uma interface para ficheiro que suporta locks e mapeamento de memria.
Uma facilidade de non-blocking I/O para escrita de servidores escalveis.
As novas APIs so sofisticadas, teis, mas para situaes
complexas.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 199
Serializao
Ler e escrever objectos e o
seu estado exacto usando
streams.
Permitem aos prprios
objectos se escreverem em
ficheiros, atravs da rede,
web, etc.
Evita a converso do estado
do objecto para um formato
textual arbitrrio.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 200
Classes usadas para serializao
j ava. i o. ObjectInputStream
publ i c Obj ect I nput St r eam( I nput St r eami n)
publ i c Obj ect readObject( ) t hr ows . . .
j ava. i o. ObjectOutputStream
publ i c Obj ect Out put St r eam( Out put St r eamout )
publ i c voi d writeObject( Obj ect o)
t hr ows I OExcept i on
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 201
Exemplo de serializao: escrita
t r y {
Out put St r eamos = new Fi l eOut put St r eam( f i l e. t xt ) ;
Obj ect Out put St r eamoos = new ObjectOutputStream( os) ;
oos. writeObject( someLi st ) ;
oos. f l ush( ) ;
os. cl ose( ) ;
} cat ch ( I OExcept i on i oe) { . . . }
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 202
Exemplo de serializao: leitura
t r y {
I nput St r eami s = new Fi l eI nput St r eam( f i l e. t xt ) ;
Obj ect I nput St r eamoi s = new ObjectInputStream( i s) ;
Ar r ayLi st someLi st = (Ar r ayLi st )oi s. readObject( ) ;
i s. cl ose( ) ;
} cat ch ( Exception e) { . . . }
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 203
Tornar uma classe Serializable
Basta implementar a interface java.io.Serializable para que
uma classe seja compatvel com streams I/O de objectos.
publ i c cl ass BankAccount implements Serializable
{ . . . }
Garantir que todas as variveis de instncia da classe so
igualmente serializveis ou temporrias (transient).
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 204
Possveis problemas com a serializao
Grafos de objectos
Quando um objecto tem variveis de instncia que so referncias
para outros objectos, esses objectos tambm deve ser guardados
(object graph).
Variveis temporrias
As variveis de instncia que no precisam de ser guardadas (ou
no podem ser serializadas) devem ser declaradas com o
modificador transient
pr i vat e t r ansi ent Text Reader i n;
Uma instncia do Memento pattern.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 205
Serializao para XML
java.beans.XMLDecoder e java.beans.XMLEncoder
A serializao para XML pode ser facilmente obtida atravs da API
para XML Object Serializers.
/ ** Save t he dat a t o di sk. */
publ i c voi d wr i t e( Obj ect t heGr aph) t hr ows I OExcept i on {
XMLEncoder os = new XMLEncoder ( new Buf f er edOut put St r eam(
new Fi l eOut put St r eam( FI LENAME) ) ) ;
os. wr i t eObj ect ( t heGr aph) ;
os. cl ose( ) ;
}
/ ** Dump t he dat a */
publ i c voi d dump( ) t hr ows I OExcept i on {
XMLDecoder i s = new XMLDecoder ( new Buf f er edI nput St r eam(
new Fi l eI nput St r eam( FI LENAME) ) ) ;
Syst em. out . pr i nt l n( i s. r eadObj ect ( ) ) ;
i s. cl ose( ) ;
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 206
Referncia
The Java Tutorial: I/O.
http://java.sun.com/docs/books/tutorial/
essential/io/index.html
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 207
Exerccios...
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 208
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 209
Parte 3
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 210
Multithreading
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 211
Objectivos
Explicar os conceitos bsicos de multithreading
Criar threads mltiplos
Aplicar a palavra reservada synchronized
Descrever o ciclo de vida de um thread
Usar wait() e notifyAll()
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 212
Threads m Threads m ltiplos ltiplos
Trabalhador Trabalhador
Trabalhador Trabalhador
Escalonamento pela JVM Escalonamento pela JVM
Afecta Afecta o o
Prioridade Prioridade
de espera e de espera e
de regresso de regresso
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 213
O que um Thread?
Um thread uma execuo sequencial de um programa.
Cada programa tem pelo menos um thread.
Cada thread tem a sua prpria pilha, prioridade e conjunto
de registos virtuais.
Os threads subdividem o comportamento de um programa
em subtarefas independentes.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 214
Onde que se usam Threads?
So usados virtualmente em todos os computadores:
Em muitas aplicaes (imprimir)
Em programas como browsers Internet
Em bases de dados
No sistema operativo
Os Threads so normalmente usados sem serem
percebidos pelo utilizador.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 215
Porque se devem usar Threads?
Para melhor aproveitar as capacidades do computador
(utilizar o CPU enquanto se faz entrada/sada de dados)
Maior produtividade para o utilizador final (uma interface
mais interactiva)
Vantagens para o programador (simplificar a lgica
aplicacional)
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 216
Os Threads so algo de novo?
No!
Evoluo:
Utilizador nico e sistemas em batch
Sistemas multi-processo
Sistemas multi-tarefa
Sistemas multi-thread
Sistemas multi-processador
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 217
A Classe Thread
Mantm o estado de um thread
Fornece diversos construtores
Fornece diversos mtodos
Thread.currentThread()
Thread.sleep()
Thread.setName()
Thread.isAlive()
Escalonados pela JVM
Utiliza o sistema operativo ou um package de threads
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 218
Exemplo de utilizao de Thread
Cada programa corre num thread.
Adormecer um thread uma tcnica que permite que
outros threads executem.
public static void main (args[] s) {
System.out.println("I am thread " +
Thread.currentThread().getName());
try {Thread.sleep(5000)}
catch (InterruptedException e){}

}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 219
Criao de um novo Thread
1. Criar a nova classe.
a. Definir uma subclasse de Thread.
b. Redefinir o seu mtodo run().
2. Instanciar e executar o thread.
a. Criar uma instncia da classe.
b. Invocar o mtodo start().
3. O escalonador invoca o mtodo run().
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 220
Criar a Classe
public class SleepingThread extends Thread {
public void run () {
Date startTime = new Date();
try {Thread.currentThread().sleep
((int) (1000 * Math.random()));}
catch (Exception es) {}
long elapsedTime =
new Date().getTime() - startTime.getTime();
System.out.println(
Thread.currentThread().getName() +
": I slept for " + elapsedTime +
"milliseconds"); }}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 221
Instanciar e Executar
public static void main(String[] args) {
new SleepingThread().start();
new SleepingThread().start();
System.out.println("Started two threads");
}
Started two threads
Thread-1: I slept for 78 milliseconds
Thread-2: I slept for 428 milliseconds
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 222
Acesso a Recursos partilhados
Os dados podem ficar corrompidos se acedidos por vrios
threads:
Utilizar a palavra synchronized para evitar conflitos de
recursos partilhados.
public class BankAccount {
private double balance;
public void withdraw(double amt) {
balance -= amt;
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 223
Ciclo de Vida de um Thread
Blocked
New thread
Dead
start()
sleep()
notify()
Running
Ready to
run
Escalonado pelo JVM Escalonado pelo JVM
wait()
other
I/O block
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 224
Bloquear um Thread
Utilizar wait() para bloquear o thread actual.
O thread deve conter o monitor do objecto, ie, ser
sincronizado (synchronized).
O monitor ser desbloqueado quando o wait() for invocado.
O thread pode esperar indefinidamente ou por um perodo
fixo de tempo.
notifyAll() acorda todos os threads bloqueados.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 225
Mtodos synchronized
Se um thread invoca um mtodo synchronized, nenhum
outro thread pode executar um mtodo sincronizado no
mesmo objecto at o primeiro thread completar a sua
tarefa.
public class CheckOutFrame extends JFrame {
public synchronized void updateElapsedTime() {

}
public synchronized void
computeAverageTime(Date old) {

}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 226
Mtodos synchronized
public class BankAccount {
private double balance;
public synchronized void withdraw(double amt) {
balance -= amt;
}
public synchronized void deposit(double amt) {
balance += amt;
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 227
Cuidado com synchronized!
Cuidado para evitar deadlocks, evitando que todos os
mtodos sejam synchronized.
void FinishButton(ActionEvent e) {

finished = true;
while(elapsedTime == 0) {}
jText.setText("");
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 228
Outra forma de criar Threads
Implementar Runnable.
Implementar o mtodo run().
Criar uma instncia da classe (objecto alvo).
Criar uma instncia do Thread, passando o objecto alvo
como um parmetro.
Invocar start() no objecto Thread.
O escalonador invoca run() sobre o objecto alvo.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 229
Exemplo com Runnable
public class MyApplet extends Applet
implements Runnable{
private Thread t;
public void startApplet(){ // called by
browser
t = new Thread(this); // creates a new
// runnable Thread
t.start(); // starts the new Thread
}
public void run(){ // The new runnable Thread
// calls run() and the
// method runs in a
} // separate thread
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 230
Escalonamento e Prioridades
Cada thread tem uma prioridade (1 to 10).
O escalonamento dependente do sistema operativo.
Um thread de alta prioridade pode interromper um de baixa-
prioridade.
Threads de alta prioridade podem dominar o processador.
Threads de prioridade idntica podem ser escalonados de forma
circular.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 231
Exerccios...
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 232
Introduo ao Swing
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 233
Componentes Principais e Layout
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 234
Objectivos
Aprender a criar interfaces grficas com o utilizador
usando Java e Swing
Conhecer a hierarquia de componentes grficos do Java
Aprender o modelo de eventos do Java
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 235
A GUI mais simples!
javax.swing.JOptionPane
No muito boa
No muito poderosa (apenas simples caixas de dilogo)
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 236
JOptionPane
Um conjunto de caixas de dilogo para simples entrada/sada
de dados
public static void showMessageDialog(Component parent, Object message)
Mostra uma mensagem numa caixa de dilogo com um boto OK.
public static void showConfirmDialog(Component parent, Object message)
Mostra uma mensagem e uma lista de opes Yes No Cancel
public static String showInputDialog(Component parent, Object message)
Mostra uma mensagem e um campo de texto, e retorna o valor introduzido
como uma String.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 237
Elementos Principais
Components: coisas desenhadas no cran.
Exemplos: boto, caixa de texto, etiqueta.
Containers: grupos lgicos de components.
Exemplo: painel.
Top-level containers: elementos principais do desktop.
Exemplos: frame, caixas de dilogo.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 238
Java GUI: AWT e Swing
Ideia inicial da Sun (JDK 1.0, 1.1)
Criar um conjunto de classes/mtodos para desenvolver GUIs
multi-plataforma (Abstract Windowing Toolkit, or AWT).
Problema AWT: no suficientemente poderosa; limitada.
Segunda edio (JDK v1.2): Swing
Uma nova biblioteca escrita bottom-up que permita o
desenvolvimento de grficos e GUIs mais poderosas.
Swing e AWT
Ambas existem no Java actual
So fceis de misturar; por vezes ainda se tm que usar ambas.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 239
Swing: hierarquia de componentes
java.lang.Object
+--java.awt.Component
+--java.awt.Container
+--javax.swing.JComponent
| +--javax.swing.JButton
| +--javax.swing.JLabel
| +--javax.swing.JMenuBar
| +--javax.swing.JOptionPane
| +--javax.swing.JPanel
| +--javax.swing.JTextField
|
+--java.awt.Window
+--java.awt.Frame
+--javax.swing.JFrame
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 240
Componentes Swing: mtodos comuns
get/setPreferredSize
get/setSize
get/setLocation
getLength/Width
repaint
setBackground(Color)
setFont(Font)
isEnabled / setEnabled(boolean)
isVisible / setVisible(boolean)
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 241
JFrame
Uma frame uma janela grfica que pode ser usada para
conter outros componentes
public void setTitle(String title)
define o ttulo da barra da janela.
public void setDefaultCloseOperation(int op)
Define a aco a executar quando fechar.
Valor comum: JFrame.EXIT_ON_CLOSE
public Container getContentPane()
Retorna a rea central da janela onde os componentes podem ser
adicionados.
public void pack()
Redimensiona a frame para que os componentes caibam.
public void show()
Mostra a frame no cran.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 242
JButton
O componente mais comum
Uma regio de cran que o utilizador pressiona para invocar a
execuo de um comando.
public JButton(String text)
Cria um novo boto com o texto dado.
public String getText()
Retorna o texto mostrado no boto.
public void setText(String text)
Define o texto do boto.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 243
JLabel
Uma etiqueta de texto uma simples string de texto
visualizada no cran de forma grfica para fornecer
informao sobre outros componentes.
public JLabel(String text)
Cria uma nova etiqueta com o texto dado.
public String getText()
Retorna o texto actual da etiqueta.
public void setText(String text)
Define o texto da etiqueta.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 244
JTextField
Um campo de texto como uma etiqueta, mas o texto
pode ser editado pelo utilizador.
public JTextField(int columns)
Cria um novo campo de texto com um dado nmero de colunas.
public String getText()
Retorna o texto actualmente armazenado no campo.
public void setText(String text)
Define o texto do campo.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 245
Como posicionar e dimensionar?
Como que o programador pode especificar onde cada
componente deve ser posicionado, e qual o tamanho que
deve assumir quando a janela movida e o seu tamanho
alterado (minimizar, maximizar, etc)?
Posicionamento absoluto (C++, C#, etc) especificam as
coordenadas exactas para cada componente.
Layout managers (Java) so objectos especiais que
decidem onde posicionar os componentes com base em
critrios bem definidos.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 246
Layout Management!
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 247
Container
Um contentor um objecto que agrega outros componentes; faz
a gesto do seu posicionamento, tamanhos e critrios de
redimensionamento.
public void add(Component comp)
public void add(Component comp, Object info)
Adiciona um componente ao contentor, eventualmente dando informao
sobre onde o posicionar.
public void remove(Component comp)
public void setLayout(LayoutManager mgr)
Define o layout manager a utilizar para posicionar os componentes no
contentor.
public void validate()
Informa o layout manager que deve re-posicionar os objectos no contentor.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 248
JPanel
Um painel o contentor mais usado.
public JPanel()
Constri um novo JPanel com um flow layout manager por omisso.
public JPanel(LayoutManager mgr)
Constri um novo JPanel com um dado layout manager.
public void paintComponent(Graphics g)
Desenha o painel no cran.
public void revalidate()
Permite invocar o reposicionamento dos componentes no painel.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 249
BorderLayout
Divide o contentor em cinco regies: NORTH, SOUTH,
WEST, EAST, CENTER.
NORTH e SOUTH expandem para preencher a regio na
horizontal e utilizam a dimenso vertical preferida.
WEST e EAST expandem para preencher a regio na
vertical e utilizam a dimenso horizontal preferida.
CENTER utiliza todo o espao no ocupado pelos restantes
componentes.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 250
FlowLayout
Trata o contentor como uma pgina ou pargrafo
preenchido da esquerda para a direita ou de cima para
baixo.
Os componentes assumem as dimenses verticais e
horizontais preferidas.
Os componentes so posicionados pela ordem que so
adicionados.
Quando necessrio, os componentes passam para a linha
seguinte.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 251
GridLayout
Trata o contentor como uma grelha de linhas e colunas de
tamanhos iguais.
Os componentes so dimensionados igualmente
(horizontal/verticalmente), independentemente das suas
dimenses preferidas.
Pode-se especificar 0 linhas/colunas para indicar a
expanso numa direco desejada.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 252
BoxLayout
Alinha os componentes no contentor numa nica linha ou
coluna.
Os componentes usam as suas dimenses preferidas e
so alinhados de acordo com o seu alinhamento preferido.
A forma preferida de construir um contentor com um box
layout :
Box.createHorizontalBox()
ou Box.createVerticalBox().
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 253
Outros Layouts
CardLayout: camadas de cartas empilhadas; apenas
uma visvel em cada instante.
GridBagLayout: algo complicado, mas bastante poderoso
se usado convenientemente.
Custom / null layout: permite definir posies absolutas
utilizando setSize e setLocation.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 254
Problemas com Layout Managers
Como criar uma janela complexa como esta utilizando os
layout managers apresentados?
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 255
Soluo: Composite Layout
Criar pineis dentro de pineis.
Cada pinel pode usar um layout diferente e ao combinar
com outros layouts, consegue-se obter layouts mais
complexos e poderosos.
Exemplo
Quantos pineis?
Qual o layout usado em cada um deles?
Pattern: Composite pattern
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 256
Composite Layout Code Example
Container north = new JPanel(new FlowLayout());
north.add(new JButton("Button 1"));
north.add(new JButton("Button 2"));
Container south = new JPanel(new BorderLayout());
south.add(new JLabel("Southwest"), BorderLayout.WEST);
south.add(new JLabel("Southeast"), BorderLayout.EAST);
Container cp = getContentPane();
cp.add(north, BorderLayout.NORTH);
cp.add(new JButton("Center Button"), BorderLayout.CENTER);
cp.add(south, BorderLayout.SOUTH);
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 257
Look and Feel
Sendo o Java Swing uma biblioteca multi-platforma para
GUIs, ele pode assumir diferentes aspectos (look & feel).
Look & feel por omisso: Metal
try {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) { }
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 258
Referncias
The Java Tutorial: Visual Index to the Swing Components.
http://java.sun.com/docs/books/tutorial/
uiswing/components/components.html
The Java Tutorial: Laying Out Components Within a
Container.
http://java.sun.com/docs/books/tutorial/uiswing/
layout/index.html
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 259
Mecanismo de eventos
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 260
Programao baseada emeventos
A execuo do programa indeterminada.
Os componentes grficos originam eventos atravs de
aces do utilizador sempre que so premidos ou usados.
Os eventos so recebidos e tratados por programas com
base em critrios pr-definidos de encaminhamento dos
eventos.
O programa responde aos eventos (programa event-
driven).
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 261
Java Event Hierarchy
java.lang.Object
+--java.util.EventObject
+--java.awt.AWTEvent
+--java.awt.event.ActionEvent
+--java.awt.event.TextEvent
+--java.awt.event.ComponentEvent
+--java.awt.event.FocusEvent
+--java.awt.event.WindowEvent
+--java.awt.event.InputEvent
+--java.awt.event.KeyEvent
+--java.awt.event.MouseEvent
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 262
Aces de eventos (ActionEvent)
Tipo de eventos mais comum no Swing.
Representam uma aco que ocorreu num componente
GUI.
So criadas por:
Cliques em botes
Activar e desactivar Check boxs
Cliques em menus
Ao pressionar [Enter] em campos de texto
etc.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 263
Auscultar Eventos (event listeners)
Adicionar um listener aos componentes.
O mtodo apropriado do listener serinvocado quando o
evento ocorre (p.e. quando o boto premido).
Para eventos de aco, utiliza-se ActionListeners.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 264
Exemplo de um ActionListener
// part of Java; you dont write this
public interface ActionListener {
void actionPerformed(ActionEvent event);
}
// Prints a message when the button is clicked.
public class MyActionListener implements ActionListener
{
public void actionPerformed(ActionEvent event) {
System.out.println(Event occurred!);
}
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 265
Adicionar um ActionListener
JButton button = new JButton(button 1);
MyActionListener listener = new MyActionListener();
button.addActionListener(listener);
// now button will print Event occurred! when clicked
// addActionListener method is in many components
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 266
Propriedades objectos ActionEvent
public Object getSource()
Retorna o objecto que originou o evento.
public String getActionCommand()
Retorna uma string que representa este evento.
Questo: onde colocar a classe listener?
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 267
ActionListener como Inner Class
public class Outer {
private class Inner implements ActionListener {
public void actionPerformed(ActionEvent event) {
...
}
}
public Outer() {
JButton myButton = new JButton();
myButton.addActionListener(new Inner());
}
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 268
ActionListener como Anonymous Inner
public class Outer {
public Outer() {
JButton myButton = new JButton();
myButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
...
}
}
);
}
}
// Anonymous inner classes are good for something!
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 269
ActionListener numa JFrame
public class Outer extends JFrame
implements ActionListener
{
public Outer() {
JButton myButton = new JButton();
myButton.addActionListener(this);
}
public void actionPerformed(ActionEvent event) {
...
}
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 270
Exerccio: uma GUI simples
Problema Soluo
Uma frame com dois botes
Cada boto, uma aco Criar um ActionListener para
cada aco.
Vrios ActionListeners Encapsular as aces em classes
(Command pattern) para conseguir usar um ActionListener
genrico.
Como parametrizar o ActionListener genrico? Criar um
ficheiro de configurao com os nomes das aces e dos
Commands respectivos que por Reflection permite
carregar dinmicamente as classes respectivas.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 271
Referncias
The Java Tutorial: How to Write Action Listeners.
http://java.sun.com/docs/books/tutorial/
uiswing/events/actionlistener.html
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 272
Applets
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 273
O que uma Applet?
um programa Java que pode ser inserido numa pgina
web e executado ao carregar essa pgina num browser
Permite dar mais vida a pginas web, adicionando contedos
interactivos, multimdia, jogos, etc.
As applets foram a feature do Java responsvel pela sua
popularidade inicial
Implementao: um contentor principal, como JFrame
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 274
Interaco com o Browser
As applets correm numa Java Virtual Machine
dentro do browser.
Problema: muitos browsers web (MS IE, Netscape
4, etc.) apenas disponibilizam uma JVM v1.1.8
Soluo 1: usar apenas classes/features do Java
que j existem desde v1.1.8.
Soluo 2: utilizar o Java Plug-in para dar ao
browser a capacidade de utilizar as novas
features do Java.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 275
Applet Inheritance Hierarchy
java.lang.Object
java.awt.Component
java.awt.Container
java.awt.Panel
java.awt.Applet
javax.swing.J Applet
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 276
javax.swing.JApplet
Diferenas entre JApplet and JFrame:
No necessrio o mtodo main
No necessrio invocar show() ( automtico!)
No necessrio definir a setDefaultCloseOperation(...)
No necessrio setSize(...) / pack(); o tamanho determinado
pela pgina web
No necessrio setTitle(String); o ttulo dado pela pgina web
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 277
JApplet: restries
No se consegue abrir ficheiros do disco do utilizador.
No se consegue estabelecer ligaes em rede com outros
computadores para alm do servidor da pgina da applet.
No possvel executar programas.
No se consegue saber muita informao sobre o sistema
cliente.
Qualquer janela aberta por uma applet ter um aviso no
fundo.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 278
JApplet: mtodos de controlo
public void init()
Invocado pelo browser quando a applet descarregada a primeira
vez.
public void start()
Invocado pelo browser sempre que o utilizador visita a pgina web
public void stop()
Invocado pelo browser sempre que o utilizador abandona a pgina
web da applet.
public void destroy()
Invocado pelo browser quando este termina.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 279
Pgina web com uma Applet JDK 1.1
Exemplo de pgina web:
<HTML>
<HEAD><TITLE>Marty's Applet Page</TITLE></HEAD>
<BODY>
<APPLET code="mypackage/MyApplet.class"
width=400 height=300> </APPLET>
</BODY>
</HTML>
Problema: no usa Java Plug-in; limitado ao JDK 1.1
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 280
Pgina web com uma JApplet JDK 1.3
<HTML>
<HEAD><TITLE>Exemplo</TITLE></HEAD>
<BODY>
<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" width=400 height=300
codebase="http://java.sun.com/products/plugin/1.3.0_02/jinstall-130_02-
in32.cab#Version=1,3,0,2">
<PARAM name="code" value="mypackage/MyApplet.class">
<PARAM name="type" value="application/x-java-applet;version=1.3">
<COMMENT>
<EMBED type="application/x-java-applet;version=1.3" code=" mypackage/MyApplet.class"
width="400" height="400" scriptable=false pluginspage="http://java.sun.com/products/plugin/
1.3.0_02/plugin-install.html">
<NOEMBED> </NOEMBED>
</EMBED>
</COMMENT>
</OBJECT>
</BODY></HTML>
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 281
Java HTML Converter
http://java.sun.com/products/plugin/1.3/converter.html
Converte uma pgina HTML para usar as novas tags que
provocam a invocao Java Plug-in, possibilitando as novas
features v1.3+, tais como o Swing.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 282
JApplet Workarounds
No se pode usar: Toolkit's getImage(String)
Usar antes: JApplet's getImage(URL) ou
getImage(URL, String) mtodos (depois de colocar
imagem na web)
No se pode usar: FileInputStream para ler um
ficheiro
Usar antes: new URL(file).openStream();
(depois de colocar ficheiro na web)
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 283
Referncias
The Java Tutorial: Writing Applets.
http://java.sun.com/docs/books/tutorial/applet/
Java HTML Converter download.
http://java.sun.com/products/plugin/1.3/converter.html
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 284
Exerccios...
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 285
Model-View-Controller
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 286
Arquitectura MVC
Arquitectura para construo de aplicaes OO em que se
separam trs dimenses
Modelo: mantm dados usando os algoritmos apropriados e fornece
mtodos de acesso
Vista: constroi uma representao visual de parte ou todos os
dados do modelo
Controlador: trata os eventos
Quando o modelo altera os seus dados, gera eventos que
fazem com que a vista actualize a sua representao,
segundo as ordens do controlador
Podem existir vrias vistas e controladores para o mesmo
modelo, o qual pode permancer inalterado quando este
evolui.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 287
Comunicao MVC
Uma alterao no modelo
provoca um evento de
alterao que difundido
para todos os objectos que
esto escuta desse evento e
desencadeia as alteraes
Facilita manter o sincronismo
entre vistas diferentes de um
mesmo modelo
Actuar numa vista pode provocar
alteraes no modelo que so
reflectidas nas outras vistas
Modelo
Vista 2 Vista 1
Controlador
Evento
altera
actualiza
v dados
altera
altera
v dados
actualiza
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 288
Arquitectura MVC em Swing
Um componente Swing leve inclui os seguintes objectos:
Um modelo que mantm os dados ( modelo da MVC bsica)
- fornece mtodos de acesso
- notifica os listeners quando alterado
Um delegado da IU que uma vista ( vista) com listeners (
controladores)
- combina as duas funes colocando os listeners junto dos objectos
controlados
- listeners so habitualmente implementados por classes internas
Um componente que estende JComponent
- um componente fornece uma API para o programador
- transfere a construo de interfaces para os delegados; passa-lhes os
eventos
- torna o modelo transparente para o programador; atravessado pelos
mtodos
Suporta a troca do look & feel: Macintosh, Windows, Motif.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 289
Comunicao MVC em Swing
Componente
Faz alteraes ao modelo e faz
seguir para o modelo alteraes
que venham da interface
Escutam o modelo para
passarem os eventos para os
seus listeners
Listeners do delegado IU
Tanto escutam o modelo como o
componente
Pedem informao ao modelo
Alteram o prprio delegado
Modelo
Delegado IU
Listeners
Componente
Evento
actualiza
v dados
altera
altera
actualiza
actualiza
alter
a
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 290
Exerccios...
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 291
Parte 4
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 292
Acesso a Bases de Dados por JDBC
java.sql.*
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 293
Tpicos
Introduo ao JDBC e JDBC Drivers
Seis Passos para usar JDBC
Exemplo 1: Definir tabelas por JDBC
Exemplo 2: Inserir dados por JDBC
Exemplo 3: Interrogaes por JDBC
Tratamento de Excepes em JDBC
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 294
Introduo ao JDBC
JDBC uma API simples para acesso a mltiplas bases de
dados a partir de aplicaes Java.
Permite uma integrao simples entre o mundo das bases
de dados e o mundo das aplicaes Java.
A ideia a de uma API para acesso universal a bases de
dados, inspirada no Open Database Connectivity (ODBC)
desenvolvido para criar um standard para o acesso a
bases de dados em Windows.
A JDBC API (java.sql.* e javax.sql.*) pretende ser o mais
simples possvel e simultaneamente oferecer a mxima
flexibilidade aos programadores.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 295
JDBC Drivers
Para ligar a uma base de
dados necessrio primeiro
ter um driver JDBC.
JDBC Driver: conjunto de
classes que fazem interface
com um motor especfico de
bases de dados.
Existem drivers JDBC para a
maioria das bases de dados:
Oracle, SQL Server, Sybase,
and MySQL.
Java Application
JDBC Driver Manager
JDBC-
ODBC
Bridge
Vendor
Specific
JDBC Driver
Vendor
Specific
ODBC Driver
Database
Database
Diagram Source: Marty Hall,
Core Web Programming
(Prentice Hall.)
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 296
Instalar o driver MySQL
Para MySQL, existe por exemplo o MySQL Connector/J,
open source.
http://www.mysql.com/downloads/api-jdbc.html.
Para usar o driver MySQL Connector/J, necessrio
descarregar a distribuio completa.
Adicionar o respectivo JAR CLASSPATH:
mysql-connector-java-3.0.11-stable-bin.jar
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 297
Seis Passos para usar JDBC
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 298
Seis Passos para Usar JDBC
1. Carregar o driver JDBC
2. Estabelecer a ligao base de dados (Connection)
3. Criar um objecto Statement
4. Executar uma Query
5. Processar os Resultados
6. Fechar a ligao
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 299
1. Carregar o Driver JDBC
Para usar um driver JDBC, necessrio carregar o driver
atravs do mtodo Class.forName() (reflection).
Em geral, o cdigo algo como:
Cl ass. f or Name( "j dbc. Dr i ver XYZ") ;
Em que jbdc.DriverXYZ o driver JDBC que se pretende carregar.
Se usarmos um driver JDBC-ODBC, o cdigo ser algo
como:
Cl ass. f or Name( "sun. j dbc. odbc. J dbcOdbcDr i ver ") ;
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 300
Carregar o Driver JDBC
Se usarmos o MM MySQL Driver, o cdigo ser algo como:
t r y {
Cl ass. f or Name( " com. mysql . j dbc. Dr i ver " ) ;
} cat ch( j ava. l ang. Cl assNot FoundExcept i on e) {
Syst em. er r . pr i nt ( " Cl assNot FoundExcept i on: " ) ;
Syst em. er r . pr i nt l n( e. get Message( ) ) ;
}
Cl ass. f or Name( ) origina uma
Cl assNot FoundExcept i on se a CLASSPATH no
estiver correctamente definida.
Deve-se portanto colocar um try/catch em volta de
f or Name( ) .
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 301
2. Estabelecer a Ligao (Connection)
Depois de carregado o driver JDBC, pode-se estabelecer a
ligao base de dados.
Connect i on con = Dr i ver Manager . get Connect i on( ur l ,
"myLogi n", "myPasswor d") ;
A nica dificuldade especificar o URL correcto.
O URL tem normalmente o seguinte formato:
jdbc:subprotocol:subname.
jdbc indica que uma JDBC Connection
O subprotocol identifica o driver que se pretende usar.
O subname identifica o nome da base de dados e sua localizao.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 302
URL: Exemplo para ODBC
As linhas seguintes usam uma bridge JDBC-ODBC para
ligar base de dados FEUP local:
St r i ng ur l = "j dbc: odbc: FEUP";
Connect i on con = Dr i ver Manager . get Connect i on( ur l ,
aagui ar ", "passwor d") ;
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 303
URL: Exemplo para MySQL
Para ligar a MySQL:
St r i ng ur l = " j dbc: mysql : / / l ocal host / f eup" ;
Connect i on con =
Dr i ver Manager . get Connect i on( ur l ) ;
Neste caso, est-se a usar um driver MySQL JDBC
Driver para ligar base de dados feup, na
mquina localhost.
Se este cdigo executar correctamente teremos
um objecto Connection para comunicar
directamente com a base de dados.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 304
3. Criar um objecto Statement
O objecto JDBC St at ement envia comandos SQL para a
base de dados.
Os objectos Statement so criados a partir de objectos
Connect i on activos.
Por exemplo:
St at ement st mt = con. cr eat eSt at ement ( ) ;
Com um objecto Statement, pode-se enviar chamadas SQL
directamente base de dados.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 305
4. Executar uma Query
execut eQuer y( )
Executa uma query SQL e retorna os dados numa tabela (ResultSet)
A tabela resultante pode estar vazia mas nunca null.
Resul t Set r esul t s = st mt . execut eQuer y( " SELECT a, b FROM
t abl e" ) ;
execut eUpdat e( )
Utilizado para executar instrues SQL INSERT, UPDATE, ou DELETE.
O resultado o nmero de linhas que foram afectadas na base de
dados.
Suporta instrues Data Definition Language (DDL) tipo:
- CREATE TABLE
- DROP TABLE
- ALTER TABLE
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 306
Statement: Mtodos teis
getMaxRows/setMaxRows
Determina o nmero de linhas que um Resul t Set pode conter
Por omisso, o nmero de linhas ilimitado (return 0)
getQueryTimeout/setQueryTimeout
Especifica o tempo que um driver deve esperar pela execuo de
um STATEMENT antes de lanar a excepo SQLExcept i on
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 307
5. Processar os Resultados
A Resul t Set contm os resultados da query SQL.
Mtodos teis
Todos os mtodos podem lanar uma SQLExcept i on
close
- Liberta os recursos alocados pelo JDBC
- O conjunto de resultados automaticamente fechado sempre que o
St at ement associado executa uma nova query.
getMetaDataObject
- Retorna um objecto Resul t Set Met aDat a que contm informao
sobre as colunas do Resul t Set
next
- Tenta mover para prxima linha do ResultSet
- Se bem sucedido devolvido true; seno, false
- A primeira invocao de next posiciona o cursor na primeira
linha
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 308
ResultSet: mais mtodos
Mtodos teis (cont.)
findColumn
- Retorna o valor inteiro correspondente coluna especificada por nome
- Os nmeros das colunas nos resultados no mapeiam necessariamente
para as mesmas colunas na base de dados.
getXxx
- Retorna o valor da coluna especificada pelo nome ou ndice como um
tipo Xxx do Java
- Retorna 0 ou null, se o valor SQL for NULL
- Tipos usados em getXxx so:
doubl e byt e i nt
Dat e St r i ng f l oat
shor t l ong Ti me
Obj ect
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 309
6. Fechar a ligao
Para fechar a ligao:
st mt . cl ose( ) ;
connect i on. cl ose( ) ;
Nota: alguns servidores aplicacionais mantm um conjunto
de ligaes base de dados.
Isto muito mais eficiente, uma vez que as aplicaes no tm o
custo associado a constantemente abrir e fechar ligaes com a
base de dados.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 310
Exemplo 1:
Criar Tabelas por JDBC
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 311
As tabelas do exemplo
Instrues SQL:
CREATE TABLE COFFEES
(COF_NAME VARCHAR(32),
SUP_ID INTEGER,
PRICE FLOAT,
SALES INTEGER,
TOTAL INTEGER);
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 312
A tabela Coffee
Pode-se criar uma tabela directamente na base de dados
(MySQL), mas pode-se tambm criar por JDBC.
Observaes sobre a tabela:
A coluna SUP_ID contm um valor inteiro para indicar o ID do
fornecedor (Supplier ID).
- Os fornecedores sero guardados numa tabela separada.
- SUP_ID uma foreign key.
A coluna SALES armazena valores do tipo SQL INTEGER e indica o
total em euros de caf vendido durante a semana corrente.
A coluna TOTAL contm um SQL INTEGER que indica o total em
euros de caf vendido desde sempre.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 313
import java.sql.*;
public class CreateCoffees {
public static void main(String args[]) {
String url = "jdbc:mysql://localhost/feup";
Connection con;
String createString;
createString = "create table COFFEES " +
"(COF_NAME VARCHAR(32), " +
"SUP_ID INTEGER, " +
"PRICE FLOAT, " +
"SALES INTEGER, " +
"TOTAL INTEGER)";
Statement stmt;
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 314
try {
Class.forName("com.mysql.jdbc.Driver");
} catch(java.lang.ClassNotFoundException e) {
System.err.print("ClassNotFoundException: ");
System.err.println(e.getMessage());
}
try {
con = DriverManager.getConnection(url);
stmt = con.createStatement();
stmt.executeUpdate(createString);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println("SQLException: " + ex.getMessage());
}
}
}
1
2
3
4
6
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 315
Exemplo 2:
Inserir dados por JDBC
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 316
import java.sql.*;
public class InsertCoffees {
public static void main(String args[]) throws SQLException {
System.out.println ("Adding Coffee Data");
ResultSet rs = null;
PreparedStatement ps = null;
String url = "jdbc:mysql://localhost/feup";
Connection con;
Statement stmt;
try {
Class.forName("org.gjt.mm.mysql.Driver");
} catch(java.lang.ClassNotFoundException e) {
System.err.print("ClassNotFoundException: ");
System.err.println(e.getMessage());
}
1
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 317
try {
con = DriverManager.getConnection(url);
stmt = con.createStatement();
stmt.executeUpdate ("INSERT INTO COFFEES" +
"VALUES(SoJorge', 49, 9.99, 0, 0)");
stmt.executeUpdate ("INSERT INTO COFFEES" +
"VALUES(Arbicas', 49, 9.99, 0, 0)");
stmt.executeUpdate ("INSERT INTO COFFEES" +
"VALUES(SICAL', 49, 10.99, 0, 0)");
stmt.executeUpdate ("INSERT INTO COFFEES" +
"VALUES(SICAL decaffe', 49, 10.99, 0, 0)");
stmt.close();
con.close();
System.out.println ("Done");
} catch(SQLException ex) {
System.err.println("-----SQLException-----");
System.err.println("SQLState: " + ex.getSQLState());
System.err.println("Message: " + ex.getMessage());
System.err.println("Vendor: " + ex.getErrorCode());
}
}
}
2
3
4
6
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 318
Exemplo 3:
Interrogaes por JDBC
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 319
import java.sql.*;
public class SelectCoffees {
public static void main(String args[]) throws SQLException {
ResultSet rs = null;
PreparedStatement ps = null;
String url = "jdbc:mysql://localhost/feup";
Connection con;
Statement stmt;
try {
Class.forName("org.gjt.mm.mysql.Driver");
} catch(java.lang.ClassNotFoundException e) {
System.err.print("ClassNotFoundException: ");
System.err.println(e.getMessage());
}
try {
con = DriverManager.getConnection(url);
stmt = con.createStatement();
1
2
3
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 320
ResultSet uprs = stmt.executeQuery("SELECT * FROM COFFEES");
System.out.println("Table COFFEES:");
while (uprs.next()) {
String name = uprs.getString("COF_NAME");
int id = uprs.getInt("SUP_ID");
float price = uprs.getFloat("PRICE");
int sales = uprs.getInt("SALES");
int total = uprs.getInt("TOTAL");
System.out.print(name + " " + id + " " + price);
System.out.println(" " + sales+ " " + total);
}
uprs.close();
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println("-----SQLException-----");
System.err.println("SQLState: " + ex.getSQLState());
System.err.println("Message: " + ex.getMessage());
System.err.println("Vendor: " + ex.getErrorCode());
}
}
}
4
5
6
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 321
Tratamento de Excepes JDBC
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 322
Excepes SQL
Quase todos os mtodos JDBC podem originar uma
SQLExcept i on em resposta a um erro de acesso a dados
Se mais do que um erro ocorrer, eles so encadeados.
As excepes SQL contm:
Descrio do erro, get Message
O SQLState (Open Group SQL specification) identificado a excepo,
get SQLSt at e
Um cdigo de erro especfico do vendedor da base de dados,
get Er r or Code
Uma referncia para a prxima SQLExcept i on, get Next Except i on
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 323
SQLException: Exemplo
t r y {
. . . / / J DBC st at ement .
} cat ch ( SQLExcept i on sql e) {
whi l e ( sql e ! = nul l ) {
Syst em. out . pr i nt l n( " Message: " + sql e. get Message( ) ) ;
Syst em. out . pr i nt l n( " SQLSt at e: " + sql e. get SQLSt at e( ) ) ;
Syst em. out . pr i nt l n( " Vendor Er r or : " +
sql e. get Er r or Code( ) ) ;
sql e. pr i nt St r ackTr ace( Syst em. out ) ;
sql e = sql e. get Next Except i on( ) ;
}
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 324
Resumo
Um Driver JDBC liga uma aplicao Java a uma base de
dados especfica.
Seis passos para usar JDBC:
Carregar o Driver
Estabelecer uma Connection
Criar um objecto Statement
Executar uma Query
Processar o Result Set
Fechar a Connection
Garantir que as chamadas JDBC so guardadas por blocos
try/catch.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 325
Referncias
Sun JDBC Tutorial
http://java.sun.com/docs/books/tutorial/ jdbc/TOC.html
George Reese, Database Programming with JDBC and
Java (OReilly & Associates.)
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 326
Exerccios...
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 327
Java Networking, java.net.*
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 328
Package java.net
Java dispe de diversas classes para manipular e
processar informao em rede
So suportados dois mecanismos bsicos:
Sockets - troca de pacotes de informao
URL - mecanismo alto-nvel para troca de informao
Estas classes possibilitam comunicaes baseadas em
sockets:
permitem manipular I/O de rede como I/O de ficheiros
os sockets so tratados como streams alto-nvel o que possibilita a
leitura/escrita de/para sockets como se fosse para ficheiros
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 329
Package java.net
O package contm as seguintes classes:
URL encapsula um endereo WWW
URLconnection uma ligao WWW
InetAddress um endereo IP com nome de host
Socket lado do cliente, liga a um porto, utiliza TCP
ServerSocket ausculta um determinado porto por ligaes de
clientes (a ligao implica TCP)
DatagramSocket um socket UDP, para clientes e servidores
DatagramPacket empacota informao num pacote UDP com
informao de encaminhamento IP
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 330
Sockets
Um socket um mecanismo que permite que programas
troquem pacotes de bytes entre si.
A implementao Java baseada na da BSD Unix.
Quando um socket envia um pacote, este acompanhado
por duas componentes de informao:
Um endereo de rede que especifica o destinatrio do pacote
Um nmero de porto que indica ao destinatrio qual o socket usar
para enviar informao
Os sockets normalmente funcionam em pares: um cliente
e um servidor
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 331
Sockets e Protocolos
Protocolos Connection-Oriented
O socket cliente estabelece uma ligao para o socket servidor,
assim que criado
Os pacotes so trocados de forma fivel
Protocolos Connectionless
Melhor performance, mas menos fiabilidade
Exemplos de utilizao: envio de um pacote, audio em tempo-real
Comparao
TCP/IP utiliza sete pacotes para enviar apenas um (1/7).
UDP utiliza apenas um pacote (1/1).
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 332
Sockets/Protocolos em Java
DatagramSocket DatagramSocket
Connectionless Protocol
ServerSocket Socket
Connection-oriented Protocol
Servidor Cliente
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 333
Sockets em Protocolos Connection-Oriented
Pseudo-cdigo tpico para um servidor:
Criar um objecto ServerSocket para aceitar ligaes
Quando um ServerSocket aceita uma ligao, cria um objecto
Socket que encapsula a ligao
O Socket deve criar objectos InputStream e OutputStream para ler e
escrever bytes para e da ligao
O ServerSocket pode opcionalmente criar um novo thread para
cada ligao, por forma a que o servidor possa aceitar novas
ligaes enquanto comunica com os clientes
Pseudo-cdigo tpico para um cliente
Criar um objecto Socket que abre a ligao com o servidor, e utiliza-
o para comunicar com o servidor
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 334
Exemplo: Servidor de Ficheiros
publ i c cl ass Fi l eSer ver ext ends Thr ead {
publ i c st at i c voi d mai n( St r i ng[ ] ar gv) {
Ser ver Socket s;
t r y {
s = new Ser ver Socket ( 1234, 10) ;
}cat ch ( I OExcept i on e) {
Syst em. er r . pr i nt l n( " Unabl e t o cr eat e socket " ) ;
e. pr i nt St ackTr ace( ) ;
r et ur n;
}
t r y {
whi l e ( t r ue) {
new Fi l eSer ver ( s. accept ( ) ) ;
}
}cat ch ( I OExcept i on e) {
}
}
pr i vat e Socket socket ;
Fi l eSer ver ( Socket s) {
socket = s;
st ar t ( ) ;
}
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 335
Exemplo: Servidor de Ficheiros...
publ i c voi d r un( ) {
I nput St r eami n;
St r i ng f i l eName = " " ;
Pr i nt St r eamout = nul l ;
Fi l eI nput St r eamf ;
t r y {
i n = socket . get I nput St r eam( ) ;
out = new Pr i nt St r eam( socket . get Out put St r eam( ) ) ;
f i l eName = new Dat aI nput St r eam( i n) . r eadLi ne( ) ;
f = new Fi l eI nput St r eam( f i l eName) ;
}cat ch ( I OExcept i on e) {
i f ( out ! = nul l )
out . pr i nt ( " Bad: " +f i l eName+" \ n" ) ;
out . cl ose( ) ;
t r y {
socket . cl ose( ) ;
}cat ch ( I OExcept i on i e) {
}
r et ur n;
}
out . pr i nt ( " Good: \ n" ) ;
/ / send cont ent s of f i l e t o cl i ent .
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 336
publ i c cl ass Fi l eCl i ent {
pr i vat e st at i c bool ean usageOk( St r i ng[ ] ar gv) {
i f ( ar gv. l engt h ! = 2) {
St r i ng msg = " usage i s: " +
" Fi l eCl i ent ser ver - name f i l e- name" ;
Syst em. out . pr i nt l n( msg) ;
r et ur n f al se;
}
r et ur n t r ue;
}
publ i c st at i c voi d mai n( St r i ng[ ] ar gv) {
i nt exi t Code = 0;
i f ( ! usageOk( ar gv) )
r et ur n;
Socket s = nul l ;
t r y {
s = new Socket ( ar gv[ 0] , 1234) ;
}cat ch ( I OExcept i on e) {
/ / . . .
}
I nput St r eami n = nul l ;
/ / . . .
}
}
Exemplo: Servidor de Ficheiros...
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 337
Sockets em Protocolos Connectionless
Pseudo-cdigo tpico para um servidor:
Criar um objecto DatagramSocket associado a um determinado
porto
Criar um objecto DatagramPacket e pedir ao DatagramSocket para
colocar o prximo bloco de dados que recebe no DatagramPacket
Pseudo-cdigo tpico para um cliente
Criar um objecto DatagramPacket associado a um bloco de dados,
um endereo de destino, e um porto
Pedir a um DatagramSocket para enviar o bloco de dados associado
ao DatagramPacket para o destino associado ao DatagramSocket
Exemplo: TimeServer
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 338
Objectos URL
A classe URL fornece um acesso a dados a um mais alto-
nvel do que os sockets
Um objecto URL encapsula um Uniform Resource Locator
(URL) que uma vez criado pode ser usado para aceder a
dados de um endereo especificado pelo URL
O acesso aos dados no necessita de se preocupar com o
protocolo utilizado
Para alguns tipos de dados, um objecto URL sabe devolver
os contedos. Por exemplo, dados JPEG num objecto
ImageProducer, ou texto numa String
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 339
Criao de objectos URL
URLs absolutos
t r y {
URL j s = new URL( " ht t p: / / www. j avasof t . com/ i ndex. ht ml " ) ;
} cat ch ( Mal f or medURLExcept i on e) {
r et ur n;
}
URLs relativos
t r y {
URL j dk = new
URL( j s, " j ava. sun. com/ pr oduct s/ J DK/ i ndex. ht ml " ) ;
}cat ch ( Mal f or medURLExcept i on e) {
r et ur n;
}
Mtodos de acesso
getProtocol(), getHost(), getFile(), getPort(), getRef(), sameFile(URL),
getContent(), openStream()
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 340
Exerccios...
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 341
Reflection
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 342
Analisar Objectos com Reflection
Reflection: mecanismo para descoberta de informao
sobre, ou manipulao, de objectos e classes em tempo
de execuo.
Utilizaes possveis de reflection:
Visualizar informao sobre um objecto.
Criar uma instncia de uma classe cujo nome apenas conhecido
em tempo de execuo.
Invocar um mtodo arbitrrio atravs do seu nome.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 343
Reflection emJava: a classe Class
Um objecto da classe java.lang.Class uma representao
de um tipo Java.
Com um objecto Class, pode-se:
Saber informao sobre a classe
Conhecer os campos e mtodos dessa classe
Criar instncias (objectos) dessa classe
Descobrir as superclasses, subclasses, interfaces que implementa,
etc, relativas a essa classe.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 344
Mtodos da classe Class
public static Class forName(String className)
Retorna um objecto Class object que representa a classe com o
nome dado.
public String getName()
Retorna o nome completo da classe deste objecto, p.e.
java.awt.Rectangle.
public int getModifiers()
Retorna um conjunto de flags com informao sobre a classe, como
por exemplo, se abstract, se uma interface, etc.
public Object newInstance()
Retorna uma nova instncia do tipo representado pelo objecto
Class. Assume um constructor sem argumentos.
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 345
Mais mtodos da classe Class
public Class[] getClasses()
public Constructor getConstructor(Class[] params)
public Constructor[] getConstructors()
public Field getField(String name)
public Field[] getFields()
public Method getMethod(String name, Class[] params)
public Method[] getMethods()
public Package getPackage()
public Class getSuperClass()
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 346
Programao com Class
Num mtodo toString:
publ i c St r i ng t oSt r i ng( ) {
r et ur n My t ype i s + get Cl ass( ) . get Name( ) ;
}
Para imprimir os nomes de todos os mtodos de uma classe:
publ i c voi d pr i nt Met hods( ) {
Cl ass cl az = get Cl ass( ) ;
Met hod[ ] met hods = cl az. get Met hods( ) ;
f or ( i nt i i = 0; i i < met hods. l engt h; i i ++)
Syst em. out . pr i nt l n( met hods[ i i ] ) ;
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 347
Outras Classes de Reflection
Package java.lang.reflect
Field
publ i c Obj ect get ( Obj ect obj )
publ i c <t ype> get <t ype>( Obj ect obj )
publ i c voi d set ( Obj ect obj , Obj ect val ue)
publ i c voi d set <t ype>( Obj ect obj , <t ype> val ue)
Constructor
publ i c Obj ect newI nst ance( Obj ect [ ] ar gs)
Method
publ i c Obj ect i nvoke( Obj ect obj , Obj ect [ ] ar gs)
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 348
Obter a Cl ass Pretendida
Todas as classes tm um objecto Class acessvel por:
Nome da classe seguido por .class (e.g. Vector.class)
Invocando .getClass() numa instncia dum tipo (e.g. new
Vect or ( ) . get Cl ass( ) )
Invocando Cl ass. f or Name( cl assName) com o nome do tipo
como String (e.g. Cl ass. f or Name( j ava. ut i l . Vect or ) )
Carregar uma classe a partir de um ficheiro .class usando um
objecto ClassLoader:
Cl assLoader l oader =
Cl assLoader . get Syst emCl assLoader ( ) ;
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 349
Exemplo
Cl ass cl = Cl ass. f or Name( j ava. awt . Rect angl e) ;
Cl ass[ ] par amTypes = new Cl ass[ ] {
I nt eger . TYPE, I nt eger . TYPE};
Const r uct or ct or = cl . get Const r uct or ( par amTypes) ;
Obj ect [ ] ct Ar gs = new Obj ect [ ] {
new I nt eger ( 20) , new I nt eger ( 40) };
Obj ect r ect = ct or . newI nst ance( ct Ar gs) ;
Met hod met h = cl . get Met hod( get Wi dt h, nul l ) ;
Obj ect wi dt h = met h. i nvoke( r ect , nul l ) ;
Syst em. out . pr i nt l n( Obj ect i s + r ect ) ;
Syst em. out . pr i nt l n( Wi dt h i s + wi dt h) ;
Resul t ado:
Obj ect i s j ava. awt . Rect angl e[ x=0, y=0, wi dt h=20, hei ght =40]
Wi dt h i s 20. 0
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 350
Reflection e Factory
public static Shape getFactoryShape (String s)
{
Shape temp = null;
if (s.equals (Circle))
temp = new Circle ();
else
if (s.equals (Square))
temp = new Square ();
else
if (s.equals (Triangle)
temp = new Triangle ();
else
//
// continues for each kind of shape
return temp;
}
public static Shape getFactoryShape (String s)
{
Shape temp = null;
try
{
temp = (Shape) Class.forName (s).newInstance ();
}
( )
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 351
Reflection e ActionListener
publ i c voi d act i onPer f or med( Act i onEvent e) {
St r i ng command = event . get Act i onCommand( ) ;
i f ( command. equal s( pl ay) )
pl ay( ) ;
el se i f ( command. equal s( save) )
save( ) ;
el se . . .
publ i c voi d act i onPer f or med( Act i onEvent e) {
St r i ng command = event . get Act i onCommand( ) ;
Met hod met h = get Cl ass( ) . get Met hod( command, nul l ) ;
met h. i nvoke( t hi s, nul l ) ;
}
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 352
Outras utilizaes de Reflection
JavaBeans (componentes GUI dinmicos)
Bases de dados JDBC
JavaMail
Jini
Carregar / usar classes enviadas pela rede
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 353
Referncias
Java Tutorial: Reflection API.
http://java.sun.com/docs/books/tutorial/reflect/
OReilly Java Reflection Tutorial.
http://www.oreilly.com/
FEUP Ademar Aguiar Java: linguagem, APIs, boas prticas e Eclipse 354
Exerccios...

Você também pode gostar