Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação...
Transcript of Tópicos Especiais de Programação Orientada a Objetos · Tópicos Especiais de Programação...
JAVATópicos Especiais de Programação
Orientada a Objetos
1
sexta-feira, 19 de outubro de 12
CONJUNTOS DE DADOSCOLEÇÕES
2
sexta-feira, 19 de outubro de 12
COLEÇÕES
O que são as coleções em Java?
3
sexta-feira, 19 de outubro de 12
COLEÇÕES
Coleção é um objeto onde podemos agrupar vários elementos. No dia-a-dia nos deparamos com várias situações onde as coleções estão presentes:
4
sexta-feira, 19 de outubro de 12
COLEÇÕES
Coleção é um objeto onde podemos agrupar vários elementos. No dia-a-dia nos deparamos com várias situações onde as coleções estão presentes:
4
Filas de bancos
sexta-feira, 19 de outubro de 12
COLEÇÕES
Coleção é um objeto onde podemos agrupar vários elementos. No dia-a-dia nos deparamos com várias situações onde as coleções estão presentes:
4
Filas de bancos
Listas de compras
sexta-feira, 19 de outubro de 12
COLEÇÕES
Coleção é um objeto onde podemos agrupar vários elementos. No dia-a-dia nos deparamos com várias situações onde as coleções estão presentes:
4
Filas de bancos
Listas de compras
Pilhas de Livros
sexta-feira, 19 de outubro de 12
COLEÇÕESPara agrupar estes vários elementos, a linguagem Java nos fornece algumas classe que facilitam nosso trabalho:
5
sexta-feira, 19 de outubro de 12
COLEÇÕESPara agrupar estes vários elementos, a linguagem Java nos fornece algumas classe que facilitam nosso trabalho:
5
sexta-feira, 19 de outubro de 12
COLEÇÕES
6
sexta-feira, 19 de outubro de 12
COLEÇÕES
6
O framework não possui implementação direta desta inferface, porém, ela está no topo da hierarquia definindo operações que são comuns a todas as coleções
Collection
sexta-feira, 19 de outubro de 12
COLEÇÕES
6
O framework não possui implementação direta desta inferface, porém, ela está no topo da hierarquia definindo operações que são comuns a todas as coleções
Collection
Está diretamente relacionada com a idéia de conjuntos. Assim como um conjunto, as classes que implementam esta interface não podem conter elementos repetidos. Usaremos implementações de SortedSet para situações onde desejarmos ordenar os elementos
Set
sexta-feira, 19 de outubro de 12
COLEÇÕES
6
O framework não possui implementação direta desta inferface, porém, ela está no topo da hierarquia definindo operações que são comuns a todas as coleções
Collection
Está diretamente relacionada com a idéia de conjuntos. Assim como um conjunto, as classes que implementam esta interface não podem conter elementos repetidos. Usaremos implementações de SortedSet para situações onde desejarmos ordenar os elementos
Set
Também chamada de seqüência. É uma coleção ordenada, que ao contrário da inferface Set, pode conter valores duplicados. Além disso, temos controle total sobre a posição onde se encontra cada elemento de nossa coleção, podendo acessar cada um deles pelo índice
List
sexta-feira, 19 de outubro de 12
COLEÇÕES
6
O framework não possui implementação direta desta inferface, porém, ela está no topo da hierarquia definindo operações que são comuns a todas as coleções
Collection
Está diretamente relacionada com a idéia de conjuntos. Assim como um conjunto, as classes que implementam esta interface não podem conter elementos repetidos. Usaremos implementações de SortedSet para situações onde desejarmos ordenar os elementos
Set
Também chamada de seqüência. É uma coleção ordenada, que ao contrário da inferface Set, pode conter valores duplicados. Além disso, temos controle total sobre a posição onde se encontra cada elemento de nossa coleção, podendo acessar cada um deles pelo índice
List
Normalmente utilizamos esta interface quando queremos uma coleção do tipo FIFO (First-In-First-Out), também conhecida como filaQueue
sexta-feira, 19 de outubro de 12
COLEÇÕES
6
O framework não possui implementação direta desta inferface, porém, ela está no topo da hierarquia definindo operações que são comuns a todas as coleções
Collection
Está diretamente relacionada com a idéia de conjuntos. Assim como um conjunto, as classes que implementam esta interface não podem conter elementos repetidos. Usaremos implementações de SortedSet para situações onde desejarmos ordenar os elementos
Set
Também chamada de seqüência. É uma coleção ordenada, que ao contrário da inferface Set, pode conter valores duplicados. Além disso, temos controle total sobre a posição onde se encontra cada elemento de nossa coleção, podendo acessar cada um deles pelo índice
List
Normalmente utilizamos esta interface quando queremos uma coleção do tipo FIFO (First-In-First-Out), também conhecida como filaQueue
Vamos utilizá-la quando desejarmos uma relação de chave-valor entre os elementos. Cada chave pode conter apenas um único valor associado. Usaremos SortedMap para situações onde desejarmos ordenar os elementos
Map
sexta-feira, 19 de outubro de 12
COLEÇÕES
7
List ArrayList
Um ArrayList se compara a uma matriz comum (array), porém por ser um objeto, possui uma série de facilidades que não encontramos em um array.
sexta-feira, 19 de outubro de 12
COLEÇÕES
7
List ArrayList
Um ArrayList se compara a uma matriz comum (array), porém por ser um objeto, possui uma série de facilidades que não encontramos em um array.
ArrayListx
array
sexta-feira, 19 de outubro de 12
COLEÇÕES
8
1 Um array tem que saber seu tamanho na hora em que é criado
2 Para inserir um objeto em um array, você tem que especificar o local
new String[2]
new ArrayList<String>( )
minhaLista[1] = b;
minhaLista.add(b);
sexta-feira, 19 de outubro de 12
COLEÇÕES
9
3Os arrays usam uma sintaxe própria que não é empregada em nenhum outro local em Java
4 Os objetos ArrayList são parametrizados (a partir do Java 5.0)
minhaLista[1]
ArrayList<String>
sexta-feira, 19 de outubro de 12
COLEÇÕES
10
ArrayList
add(Object elem) Adicionará o parâmetro de objeto à listaremove(int index) Removerá o objeto do parâmetro de índiceremove(Object elem) Removerá esse objeto (se ele estiver na ArrayList)contains(Object elem) Retornará ‘verdadeiro’ se houver uma coincidência com o parâmetro de objetoisEmpty( ) Retornará ‘verdadeiro’ se a lista não tiver elementosindexOf(Object element) Retornará o índice do parâmetro de objeto ou -1size( ) Retornará a quantidade de elementos existentes na lista atualmenteget(int index) Retornará o objeto que se encontra atualmente no parâmetro de índice
Exemplo de alguns dos métodos da classe ArrayList
sexta-feira, 19 de outubro de 12
COLEÇÕES
11
O que podemos fazer com um ArrayList:
1 Criar um objeto ArrayList
ArrayList<Ovo> minhaLista = new ArrayList<Ovo>();
2 Inserir algo nele
Ovo o = new Ovo();minhaLista.add(o);
3 Inserir mais alguma coisa nele
Ovo b = new Ovo();minhaLista.add(b);
sexta-feira, 19 de outubro de 12
COLEÇÕES
12
O que podemos fazer com um ArrayList:
4 Saber quantos itens existem nele
int tamanho = minhaLista.size();
5 Saber se ele contém algo
boolean contem = minhaLista.contains(o);
6 Saber onde está algo (isto é, seu índice)
int indice = minhaLista.indexOf(b);
sexta-feira, 19 de outubro de 12
COLEÇÕES
13
O que podemos fazer com um ArrayList:
7 Saber se ele está vazio
boolean vazio = minhaLista.isEmpty();
8 Remover algo dele
minhaLista.remove(o);
sexta-feira, 19 de outubro de 12
COLEÇÕES
14
Exemplo: Vamos criar uma Jukebox
sexta-feira, 19 de outubro de 12
COLEÇÕES
15
public class Jukebox {
ArrayList<String> listaMusicas = new ArrayList<String>(); public static void main(String[] args) { new Jukebox().go(); } public void go() { getMusicas(); System.out.println(listaMusicas); } void getMusicas() { try { File arquivoTexto = new File("ListaMusicas.txt"); BufferedReader reader = new BufferedReader(new FileReader(arquivoTexto)); String linha = null; while ((linha = reader.readLine()) != null) { addMusica(linha); } } catch (Exception ex) { ex.printStackTrace(); } } void addMusica(String linhaParaDividir) { String[] partes = linhaParaDividir.split("/"); listaMusicas.add(partes[0]); }}
sexta-feira, 19 de outubro de 12
COLEÇÕES
16
sexta-feira, 19 de outubro de 12
COLEÇÕES
17
Mas ArrayList não é a única classe da família Collections.
sexta-feira, 19 de outubro de 12
COLEÇÕES
18
Mas ArrayList não é a única classe da família Collections.
Classe Descrição
TreeSet Mantém os elementos classificados e não permite duplicatas.
HashMap Permitirá que você armazene e acesse os elementos como pares nome/valor
LinkedListProjetada para fornecer um desempenho melhor quando você inserir ou
excluir elementos do meio do conjunto. (Na prática, geralmente ainda estaremos querendo uma ArrayList)
HashSet Não permite duplicatas no conjunto e, fornecido um elemento, consegue encontrá-lo rapidamente.
LinkedHashMap
Como a classe HashMap, exceto por conseguir lembrar a ordem em que os elementos (pares nome/valor), foram inseridos ou por poder ser
configurada para lembrar a ordem em que os elementos foram acessados na última vez.
sexta-feira, 19 de outubro de 12
COLEÇÕES
19
Resumindo:
QUANDO A SEQUÊNCIA É IMPORTANTE (SABER A POSIÇÃO DO OBJETO)Set
QUANDO A EXLCUSIVIDADE É IMPORTANTE (NÃO PERMITIR DUPLICATAS)List
QUANDO ENCONTRAR ALGO PELA CHAVE É IMPORTANTE (USAR PARES CHAVE-VALOR)Map
sexta-feira, 19 de outubro de 12
COLEÇÕES
20
Exemplo de uso da classe HashSet:
import java.util.HashSet;
public class ExemploSet {
public static void main(String[] args) {
HashSet<String> set = new HashSet<String>(); set.add("Dinardo"); set.add("Rosa"); set.add("Dinardo"); set.add("Rafael"); set.add("Luís"); set.add("Rafael"); set.add("Jobson"); set.add("Anderson"); set.add("Rosa"); System.out.println(set);
set.remove("Dinardo"); System.out.println(set); }
}
sexta-feira, 19 de outubro de 12
COLEÇÕES
21
Exemplo de uso da classe HashMap:import java.util.HashMap;
public class ExemploMap {
public static void main(String[] args) { HashMap<String, Integer> placar = new HashMap<String, Integer>(); placar.put("Daniel", 42); placar.put("Leonardo", 343); placar.put("Victor", 420); System.out.println(placar); System.out.println(placar.get("Leonardo")); }
}
sexta-feira, 19 de outubro de 12
THREADS
22
sexta-feira, 19 de outubro de 12
THREADS
23
Em várias situações, precisamos “rodar duas coisas ao mesmo tempo”. Imagine um programa que gera um relatório muito grande em PDF. É um processo demorado e, para dar alguma satisfação para o usuário, queremos mostrar uma barra de progresso. Queremos então gerar o PDF e ao mesmo tempo atualizar a barra.
sexta-feira, 19 de outubro de 12
THREADS
24
A necessidade de se fazer várias coisas simultaneamente, ao mesmo tempo, paralelamente, aparece frequentemente na computação. Para vários programas distintos, normalmente o próprio sistema operacional gerencia isso através de vários processos em paralelo.Em um programa só (um processo só), se queremos executar coisas em paralelo, normalmente falamos de Threads.
sexta-feira, 19 de outubro de 12
THREADS
25
Threads são uma maneira de se programar aplicações com processamento paralelo, ou seja, várias subprocessos executando ao mesmo tempo.As diversas threads que criamos em nossos programas Java podem estar, a qualquer momento, em algum dos estados do ciclo de vida de uma Thread.
sexta-feira, 19 de outubro de 12
THREADS
26
Para a verificação do estado de uma Thread deve-se utilizar o método Thread.getState que retorna, os possíveis estados:
•New•Runnable•Blocked•Waiting•Timed Waiting•Terminated
Além do mais, pode-se chamar isAlive():
TRUE significa que o thread está no estado Runnable ou no estado Non-Runnable.
sexta-feira, 19 de outubro de 12
THREADS
27
Para uma classe ser executada em paralelismo, ela deve estender a classe java.lang.Thread ou implementar a classe java.lang.Runnable (utilizar a inteface Runnable). Neste caso é possível utilizar a herança para outros métodos, é esta a principal diferença entre os dois métodos.
Toda Thread deve implementar o método public void run( ), que é o inicio da execução dela.
A ordem de execução das threads é totalmente imprevisível, a decisão final de qual thread será executada é realizada pelo sistema operacional. A imprevisibilidade é maior ainda em processadores com múltiplos núcleos.
Thread
Quando uma Thread entra no estado dead, ela não pode ser mais usada e deve ser descartada.
sexta-feira, 19 de outubro de 12
THREADS
28
Detalhes de cada estado de uma Thread:
Pronta - Quando criamos uma nova thread e chamamos seu método start() ela entra no estado pronta, ou seja, seu método run() pode ser executado a qualquer momento. É importante observar que chamar start() não faz com que a thread seja executada imediatamente. O que este método faz é deixá-la pronta para execução. Vai depender do gerenciador de threads o momento no qual o método run() da thread recém-criada será executado.
Executando - Quando o método run() de uma thread é finalmente chamado ela entra no estado "executando". Uma thread em execução pode voltar ao estado "pronta" se o seu tempo de CPU expirar ou seu método yield() for chamado. Lembre-se de que chamar Thread.yield() na thread atual faz com que ela gentilmente ceda seu tempo restante de CPU para que as demais threads sejam executadas.
sexta-feira, 19 de outubro de 12
THREADS
29
Bloqueada - Uma thread pode entrar no estado "bloqueada", ou seja, se tornar inativa, por várias razões. Ela, ou quaisquer outras threads, pode ter chamado os métodos join(), sleep(), wait() or lock(). Uma thread pode também estar bloqueada aguardando alguma operação de entrada/saída (I/O) ser finalizada. Quando a situação que colocou a thread como bloqueada for revertida ou seu tempo de sleep expirar, ela será reativada e entrará no estado "pronta". Novamente caberá ao gerenciador de threads colocá-la no estado "executando".
Finalizada - Quando todas as instruções contidas no método run() da thread forem concluídas, a thread terá terminado sua tarefa e será finalizada. Uma thread finalizada está "morta". Não há como chamar seu método start() novamente sem criarmos uma nova instância da mesma.
Note que o método run() de uma thread pode ser finalizado em resposta a uma condição de erro ou exceção. Esta situação
também provoca a "morte" de um thread.
sexta-feira, 19 de outubro de 12
THREADS
30
public class MinhaThread extends Thread {
public void run() { int i=0; while (true) { i++; System.out.println("Minha Thread:" + i); try { Thread.sleep(1000); } catch (Exception ex) { ex.printStackTrace(); } } }}
sexta-feira, 19 de outubro de 12
THREADS
31
public class ExecutarThread { public static void main(String[] args) {
MinhaThread th = new MinhaThread(); th.start(); int i=0; while(true) { i++;
try { Thread.sleep(1000); } catch (Exception ex) { ex.printStackTrace(); } System.out.println("Programa principal:" + i); if (th != null) { System.out.println("Estado da Thread:" + th.getState()); } else { System.out.println("Estado da Thread: ENCERRADA"); } if (i==14) { th = null; } } }}
sexta-feira, 19 de outubro de 12
THREADS
32
sexta-feira, 19 de outubro de 12
THREADS
33
public class MinhaRunnable {
public void run() { int i=0; while (true) { i++; System.out.println("Minha Runnable:" + i); try { Thread.sleep(1000); } catch (Exception ex) { ex.printStackTrace(); } } }}
sexta-feira, 19 de outubro de 12
THREADS
34
public class ExecutarRunnable { public static void main(String[] args) {
MinhaRunnable ru = new MinhaRunnable(); Thread t = new Thread(ru); t.start(); int i=0; while(true) { i++; try { Thread.sleep(1000); } catch (Exception ex) { ex.printStackTrace(); } System.out.println("Programa principal:" + i); if (t != null) { System.out.println("Estado da Thread:" + t.getState()); } else { System.out.println("Estado da Thread: ENCERRADA"); } if (i==14) { t = null; } } }}
sexta-feira, 19 de outubro de 12
THREADS
35
sexta-feira, 19 de outubro de 12
THREADS
36
Thread-safe: é um trecho do código que mantém seu estado válido, mesmo sendo percorrido por múltiplas linhas de execução. Mantém a integridade da classe.
Imaginemos um controle de contas bancárias.
Supondo que em uma conta haviam 100 reais de saldo.Uma thread tenta fazer um saque de 60 reais e uma outra de 80 reais.A primeira thread executa e calcula o saldo restante que será de 40 reais. O processador então decide trocar de thread e passa a execução para a segunda thread. A segunda thread executa e calcula o saldo restante de 20 reais, pois como a primeira thread ainda não atualizou o saldo, para a segunda thread o saldo atual ainda são os 100 reais iniciais.O processador então retorna para primeira thread que atualiza o saldo para 40 reais. Logo, o cliente que tinha 100 reais na conta, sacou 140 e ainda ficou com saldo de 40 reais.Isto é uma violação do estado da classe, logo não é thread-safe.
sexta-feira, 19 de outubro de 12
THREADS
37
public class Conta {
private float saldo; public void saque(float quantia) { float saldoRestante = saldo - quantia; if (saldoRestante < 0) { throw new IllegalArgumentException("Sem saldo"); } saldo = saldoRestante; }}
sexta-feira, 19 de outubro de 12
THREADS
38
Para solucionar este tipo de problema, é necessário implementar mecanismos de thread-safe para garantir a integridade da classe.Uma das maneiras é o uso de métodos e atributos estáticos ou então utilizar o modificador synchronized.No exemplo, a segunda thread, caso fosse utilizado o modificador synchronized, ela esperaria a execução da primeira thread antes de atualizar o saldo.
public class Conta {
private float saldo; public synchronized void saque(float quantia) { float saldoRestante = saldo - quantia; if (saldoRestante < 0) { throw new IllegalArgumentException("Sem saldo"); } saldo = saldoRestante; }}
sexta-feira, 19 de outubro de 12
BIBLIOGRAFIA
39
•Introdução ao Java, Daniel Destro do Carmo•Use a Cabeça Java, Kathy Sierra e Bert Bates•Certificação Sun para Programador Java 6, Kathy Sierra e Bert Bates
sexta-feira, 19 de outubro de 12
OBRIGADO
40
PROF. EMILIO PARMEGIANI
DOWNLOAD DO MATERIAL
sexta-feira, 19 de outubro de 12