Vous êtes sur la page 1sur 16

APOSTILA JAVA E ORIENTAO A OBJETOS

CAPTULO 15

Pacote java.io
"A benevolncia sobretudo um vcio do orgulho e no uma virtude da alma." Doantien Alphonse Franois (Marqus de Sade) Ao trmino desse captulo, voc ser capaz de: ler e escrever bytes, caracteres e Strings de/para a entrada e sada padro; ler e escrever bytes, caracteres e Strings de/para arquivos; utilizar buffers para agilizar a leitura e escrita atravs de fluxos; usar Scanner e PrintStream.

15.1 - CONHECENDO UMA API


Vamos passar a conhecer APIs do Java. j a v a . i oe j a v a . u t i lpossuem as classes que voc mais comumente vai usar, no importando se seu aplicativo desktop, web, ou mesmo para celulares. Apesar de ser importante conhecer nomes e mtodos das classes mais utilizadas, o interessante aqui que voc enxergue que todos os conceitos previamente estudados so aplicados a toda hora nas classes da biblioteca padro. No se preocupe em decorar nomes. Atenha-se em entender como essas classes esto relacionadas e como elas esto tirando proveito do uso de interfaces, polimorfismo, classes abstratas e encapsulamento. Lembre-se de estar com a documentao (javadoc) aberta durante o contato com esses pacotes. Veremos tambm threads e sockets em captulos posteriores, que ajudaro a condensar nosso conhecimento, tendo em vista que no exerccio de sockets utilizaremos todos conceitos aprendidos, juntamente com as vrias APIs.

15.2 - ORIENTAO A OBJETOS NO JAVA .IO


Assim como todo o resto das bibliotecas em Java, a parte de controle de entrada e sada de dados (conhecido como io) orientada a objetos e usa os principais conceitos mostrados at agora: interfaces, classes abstratas e polimorfismo. A ideia atrs do polimorfismo no pacote j a v a . i o de utilizar fluxos de entrada (I n p u t S t r e a m ) e de sada (O u t p u t S t r e a m ) para toda e qualquer operao, seja ela relativa a um arquivo, a um campo blob do banco de dados, a uma conexo remota via sockets, ou at mesmo s entrada e sada padro de um programa (normalmente o teclado e o console). As classes abstratas I n p u t S t r e a me O u t p u t S t r e a mdefinem, respectivamente, o comportamento padro dos fluxos em Java: em um fluxo de entrada, possvel ler bytes e, no fluxo de sada, escrever bytes. A grande vantagem dessa abstrao pode ser mostrada em um mtodo qualquer que utiliza um O u t p u t S t r e a mrecebido como argumento para escrever em um fluxo de sada. Para onde o mtodo est escrevendo? No se sabe e no importa: quando o sistema precisar escrever em um arquivo ou em uma socket, basta chamar o mesmo mtodo, j que ele aceita qualquer filha de O u t p u t S t r e a m !

Nova editora Casa do Cdigo com livros de uma forma diferente Editoras tradicionais pouco ligam para ebooks e novas tecnologias. No conhecem programao para revisar os livros tecnicamente a fundo. No tm anos de experincia em didticas com cursos. Conhea a Casa do Cdigo, uma editora diferente, com curadoria da Caelum e obsesso por livros de qualidade a preos justos. Casa do Cdigo, ebook com preo de ebook.

15.3 - INPUTSTREAM, INPUTSTREAMREADER E BUFFEREDREADER


Para ler um b y t ede um arquivo, vamos usar o leitor de arquivo, o F i l e I n p u t S t r e a m . Para um F i l e I n p u t S t r e a mconseguir ler um byte, ele precisa saber de onde ele dever ler. Essa informao to importante que quem escreveu

essa classe obriga voc a passar o nome do arquivo pelo construtor: sem isso o objeto no pode ser construdo.
1 c l a s sT e s t a E n t r a d a{ 2 3 4 5 6 }

p u b l i cs t a t i cv o i dm a i n ( S t r i n g [ ]a r g s )t h r o w sI O E x c e p t i o n{ I n p u t S t r e a mi s=n e wF i l e I n p u t S t r e a m ( " a r q u i v o . t x t " ) ; i n tb=i s . r e a d ( ) ; }

A classe I n p u t S t r e a m abstrata e F i l e I n p u t S t r e a muma de suas filhas concretas. F i l e I n p u t S t r e a mvai procurar o arquivo no diretrio em que a JVM fora invocada (no caso do Eclipse, vai ser a partir de dentro do diretrio do projeto). Alternativamente voc pode usar um caminho absoluto. Quando trabalhamos com j a v a . i o , diversos mtodos lanam I O E x c e p t i o n , que uma exception do tipo checked - o que nos obriga a trat-la ou declar-la. Nos exemplos aqui, estamos declarando I O E x c e p t i o natravs da clausula t h r o w sdo m a i napenas para facilitar o exemplo. Caso a exception ocorra, a JVM vai parar, mostrando a stacktrace. Esta no uma boa prtica em uma aplicao real: trate suas exceptions para sua aplicao poder abortar elegantemente. I n p u t S t r e a mtem diversas outras filhas, como O b j e c t I n p u t S t r e a m , A u d i o I n p u t S t r e a m ,B y t e A r r a y I n p u t S t r e a m , entre outras. Para recuperar um caractere, precisamos traduzir os bytes com o encoding dado para o respectivo cdigo unicode, isso pode usar um ou mais bytes. Escrever esse decodificador muito complicado, quem faz isso por voc a classe I n p u t S t r e a m R e a d e r .
1 c l a s sT e s t a E n t r a d a{ 2 3 4 5 6 7 }

p u b l i cs t a t i cv o i dm a i n ( S t r i n g [ ]a r g s )t h r o w sI O E x c e p t i o n{ I n p u t S t r e a mi s=n e wF i l e I n p u t S t r e a m ( " a r q u i v o . t x t " ) ; I n p u t S t r e a m R e a d e ri s r=n e wI n p u t S t r e a m R e a d e r ( i s ) ; i n tc=i s r . r e a d ( ) ; }

O construtor de I n p u t S t r e a m R e a d e rpode receber o encoding a ser utilizado como parmetro, se desejado, tal como U T F 8ou I S O 8 8 5 9 1 .

Encodings Devido a grande quantidade de aplicativos internacionalizados de hoje em dia, imprescindvel que um bom programador entenda bem o que so os

character encodings e o Unicode. O blog da Caelum possui um bom artigo a respeito: http://blog.caelum.com.br/2006/10/22/entendendo-unicode-e-oscharacter-encodings/

I n p u t S t r e a m R e a d e r filha da classe abstrata R e a d e r , que possui diversas outras filhas - so classes que manipulam chars. Apesar da classe abstrata R e a d e rj ajudar no trabalho de manipulao de caracteres, ainda seria difcil pegar uma S t r i n g . A classe B u f f e r e d R e a d e r um R e a d e rque recebe outro R e a d e rpelo construtor e concatena os diversos chars para formar uma S t r i n gatravs do mtodo r e a d L i n e :
1 c l a s sT e s t a E n t r a d a{ 2 3 4 5 6 7 8 }

p u b l i cs t a t i cv o i dm a i n ( S t r i n g [ ]a r g s )t h r o w sI O E x c e p t i o n{ I n p u t S t r e a mi s=n e wF i l e I n p u t S t r e a m ( " a r q u i v o . t x t " ) ; I n p u t S t r e a m R e a d e ri s r=n e wI n p u t S t r e a m R e a d e r ( i s ) ; B u f f e r e d R e a d e rb r=n e wB u f f e r e d R e a d e r ( i s r ) ; S t r i n gs=b r . r e a d L i n e ( ) ; }

Como o prprio nome diz, essa classe l do R e a d e rpor pedaos (usando o buffer) para evitar realizar muitas chamadas ao sistema operacional. Voc pode at configurar o tamanho do buffer pelo construtor. essa a composio de classes que est acontecendo:

Esse padro de composio bastante utilizado e conhecido. o Decorator Pattern . Aqui, lemos apenas a primeira linha do arquivo. O mtodo r e a d L i n edevolve a linha que foi lida e muda o cursor para a prxima linha. Caso ele chegue ao fim do R e a d e r(no nosso caso, fim do arquivo), ele vai devolver n u l l . Ento, com um simples lao, podemos ler o arquivo por inteiro:
1 c l a s sT e s t a E n t r a d a{

2 3 4 5 6 7 8 9

p u b l i cs t a t i cv o i dm a i n ( S t r i n g [ ]a r g s )t h r o w sI O E x c e p t i o n{ I n p u t S t r e a mi s=n e wF i l e I n p u t S t r e a m ( " a r q u i v o . t x t " ) ; I n p u t S t r e a m R e a d e ri s r=n e wI n p u t S t r e a m R e a d e r ( i s ) ; B u f f e r e d R e a d e rb r=n e wB u f f e r e d R e a d e r ( i s r ) ; S t r i n gs=b r . r e a d L i n e ( ) ;/ /p r i m e i r al i n h a w h i l e( s! =n u l l ){ S y s t e m . o u t . p r i n t l n ( s ) ; s=b r . r e a d L i n e ( ) ; }

1 0 1 1 1 2 1 3 1 4 b r . c l o s e ( ) ; 1 5 } 1 6 }

15.4 - LENDO STRINGS DO TECLADO


Com um passe de mgica, passamos a ler do teclado em vez de um arquivo, utilizando o S y s t e m . i n , que uma referncia a um I n p u t S t r e a mo qual, por sua vez, l da entrada padro.
1 c l a s sT e s t a E n t r a d a{ 2 3 4 5 6 7 8

p u b l i cs t a t i cv o i dm a i n ( S t r i n g [ ]a r g s )t h r o w sI O E x c e p t i o n{ I n p u t S t r e a mi s=S y s t e m . i n ; I n p u t S t r e a m R e a d e ri s r=n e wI n p u t S t r e a m R e a d e r ( i s ) ; B u f f e r e d R e a d e rb r=n e wB u f f e r e d R e a d e r ( i s r ) ; S t r i n gs=b r . r e a d L i n e ( ) ; w h i l e( s! =n u l l ){ S y s t e m . o u t . p r i n t l n ( s ) ; s=b r . r e a d L i n e ( ) ; }

9 1 0 1 1 1 2 } 1 3 }

Apenas modificamos a quem a varivel i sest se referindo. Podemos receber argumentos do tipo I n p u t S t r e a me ter esse tipo de abstrao: no importa exatamente de onde estamos lendo esse punhado de bytes, desde que a gente receba a informao que estamos querendo. Como na figura:

Repare que a ponta da direita poderia ser qualquer I n p u t S t r e a m , seja O b j e c t I n p u t S t r e a m ,A u d i o I n p u t S t r e a m ,B y t e A r r a y I n p u t S t r e a m , ou a nossa F i l e I n p u t S t r e a m . Polimorfismo! Ou voc mesmo pode criar uma filha de I n p u t S t r e a m , se desejar. Por isso muito comum mtodos receberem e retornarem I n p u t S t r e a m , em vez de suas filhas especficas. Com isso, elas desacoplam as informaes e escondem a implementao, facilitando a mudana e manuteno do cdigo. Repare que isso vai ao encontro de tudo o que aprendemos durante os captulos que apresentaram classes abstratas, interfaces, polimorfismo e encapsulamento.

15.5 - A ANALOGIA PARA A ESCRITA : OUTPUTSTREAM


Como voc pode imaginar, escrever em um arquivo o mesmo processo:

1 c l a s sT e s t a S a i d a{ 2 p u b l i cs t a t i cv o i dm a i n ( S t r i n g [ ]a r g s )t h r o w sI O E x c e p t i o n{ 3 O u t p u t S t r e a mo s=n e wF i l e O u t p u t S t r e a m ( " s a i d a . t x t " ) ; 4 5

O u t p u t S t r e a m W r i t e ro s w=n e wO u t p u t S t r e a m W r i t e r ( o s ) ; B u f f e r e d W r i t e rb w=n e wB u f f e r e d W r i t e r ( o s w ) ;

6 7 b w . w r i t e ( " c a e l u m " ) ; 8 9 b w . c l o s e ( ) ; 1 0 } 1 1 }

Lembre-se de dar refresh (clique da direita no nome do projeto, refresh) no seu projeto do Eclipse para que o arquivo criado aparea. O F i l e O u t p u t S t r e a mpode

receber um booleano como segundo parmetro, para indicar se voc quer reescrever o arquivo ou manter o que j estava escrito (a p p e n d ). O mtodo w r i t edo B u f f e r e d W r i t e rno insere o(s) caractere(s) de quebra de linha. Para isso, voc pode chamar o mtodo n e w L i n e .

Fechando o arquivo com o finally e o try-with-resources importante sempre fechar o arquivo. Voc pode fazer isso chamando diretamente o mtodo c l o s edo F i l e I n p u t S t r e a m /O u t p u t S t r e a m , ou ainda chamando o c l o s edo B u f f e r e d R e a d e r /W r i t e r . Nesse ltimo caso, o c l o s e ser cascateado para os objetos os quais o B u f f e r e d R e a d e r /W r i t e rutiliza para realizar a leitura/escrita, alm dele fazer o flush dos buffers no caso da escrita. comum e fundamental que o c l o s eesteja dentro de um bloco f i n a l l y . Se um arquivo for esquecido aberto e a referncia para ele for perdida, pode ser que ele seja fechado pelo garbage collector, que veremos mais a frente, por causa do f i n a l i z e . Mas no bom voc se prender a isso. Se voc esquecer de fechar o arquivo, no caso de um programa minsculo como esse, o programa vai terminar antes que o tal do garbage collector te ajude, resultando em um arquivo no escrito (os bytes ficaram no buffer do B u f f e r e d W r i t e r ). Problemas similares podem acontecer com leitores que no forem fechados. No Java 7 h a estrutura try-with-resources, que j far o f i n a l l ycuidar dos recursos declarados dentro do t r y ( ) , invocando c l o s e . Pra isso, os recursos devem implementar a interface j a v a . l a n g . A u t o C l o s e a b l e , que o caso dos Readers, Writers e Streams estudados aqui:
t r y( B u f f e r e d R e a d e rb r=n e wB u f f e r e d R e a d e r ( n e wF i l e ( " a r q u i v o . t x t " ) ) ){ / /c o me x c e oo un o ,oc l o s e ( )d ob rs e r ai n v o c a d o }

J conhece os cursos online Alura? A Alura oferece dezenas de cursos online em sua plataforma exclusiva de ensino que favorece o aprendizado com a qualidade reconhecida da Caelum. Voc pode escolher um curso nas reas de Java, Ruby, Web, Mobile, .NET e outros, ou fazer a assinatura semestral que d acesso a todos os cursos.

Conhea os cursos online da Caelum.

15.6 - UMA MANEIRA MAIS FCIL: SCANNER E PRINTSTREAM


A partir do Java 5, temos a classe j a v a . u t i l . S c a n n e r , que facilita bastante o trabalho de ler de um I n p u t S t r e a m . Alm disso, a classe P r i n t S t r e a mpossui um construtor que j recebe o nome de um arquivo como argumento. Dessa forma, a leitura do teclado com sada para um arquivo ficou muito simples:
S c a n n e rs=n e wS c a n n e r ( S y s t e m . i n ) ; P r i n t S t r e a mp s=n e wP r i n t S t r e a m ( " a r q u i v o . t x t " ) ; w h i l e( s . h a s N e x t L i n e ( ) ){ p s . p r i n t l n ( s . n e x t L i n e ( ) ) ; }

Nenhum dos mtodos lana I O E x c e p t i o n :P r i n t S t r e a mlana F i l e N o t F o u n d E x c e p t i o nse voc o construir passando uma S t r i n g . Essa exceo filha de I O E x c e p t i o ne indica que o arquivo no foi encontrado. O S c a n n e r considerar que chegou ao fim se uma I O E x c e p t i o nfor lanada, mas o P r i n t S t r e a msimplesmente engole exceptions desse tipo. Ambos possuem mtodos para voc verificar se algum problema ocorreu. A classe S c a n n e r do pacote j a v a . u t i l . Ela possui mtodos muito teis para trabalhar com Strings, em especial, diversos mtodos j preparados para pegar nmeros e palavras j formatadas atravs de expresses regulares. Fica fcil parsear um arquivo com qualquer formato dado.

System.out Como vimos no captulo passado, o atributo o u tda classe S y s t e m do tipo P r i n t S t r e a m(e, portanto, um O u t p u t S t r e a m ).

15.7 - UM POUCO MAIS...


Existem duas classes chamadas j a v a . i o . F i l e R e a d e re j a v a . i o . F i l e W r i t e r . Elas so atalhos para a leitura e escrita de arquivos. Od o{. .}w h i l e ( c o n d i c a o ) ; uma alternativa para se construir um lao.

Pesquise-o e utilize-o no cdigo para ler um arquivo, ele vai ficar mais sucinto (voc no precisar ler a primeira linha fora do lao).

15.8 - EXERCCIOS: JAVA I/O


1. Crie um projeto novo chamado t e s t e i o . Crie um programa (simplesmente uma classe com um m a i n ) que leia da entrada padro. Para isso, voc vai precisar de um B u f f e r e d R e a d e rque leia do S y s t e m . i n da mesma forma como fizemos. No digite esses nomes de classes complicados! Use o ctrl+espao para te auxiliar, porque alm de te ajudar com o nome, ele colocar o import no devido lugar. Cuidado que existe mais de uma classe chamada I n p u t S t r e a m : queremos a do pacote j a v a . i o .
1 p u b l i cc l a s sT e s t a E n t r a d a{ 2 3 / /e s t f a l t a n d oot h r o w sI O E x c e p t i o n ! !P e aa u x l i op a r aoE c l i p s e ! 4 5 p u b l i cs t a t i cv o i dm a i n ( S t r i n g [ ]a r g s ){ 6 I n p u t S t r e a mi s=S y s t e m . i n ; 7 I n p u t S t r e a m R e a d e ri s r=n e wI n p u t S t r e a m R e a d e r ( i s ) ; 8 B u f f e r e d R e a d e rb r=n e wB u f f e r e d R e a d e r ( i s r ) ; 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 } 1 7 }

S t r i n gl i n h a=b r . r e a d L i n e ( ) ;/ /p r i m e i r al i n h a w h i l e( l i n h a! =n u l l ){ S y s t e m . o u t . p r i n t l n ( l i n h a ) ; l i n h a=b r . r e a d L i n e ( ) ; }

O compilador vai reclamar que voc no est tratando algumas excees (como j a v a . i o . I O E x c e p t i o n ). Utilize a clusula t h r o w spara deixar "escapar" a exceo pelo seu m a i n , ou use os devidos t r y /c a t c h . Utilize o quick fix do Eclipse para isso (Ctrl + 1). Deixar todas as exceptions passarem desapercebidas no uma boa prtica! Voc pode usar aqui, pois estamos focando apenas no aprendizado da utilizao do j a v a . i o . Rode sua aplicao. Atravs da View Console voc pode digitar algumas linhas para que seu programa as capture.

EOF Quando rodar sua aplicao, para encerrar a entrada de dados do teclado, necessrio enviarmos um sinal de fim de stream. o famoso EOF, End Of File. No Linux/Mac/Solaris/Unix voc faz isso com o C O N T R O L + D . No Windows, use o C O N T R O L + Z .

2. Vamos ler de um arquivo, em vez do teclado. Antes, vamos criar o arquivo que ser lido pelo programa: a. Clique com o boto direito em cima do seu projeto e selecione New -> File:

b. Nesta tela, digite o nome do arquivo no lugar indicado:

c. Troque na classe T e s t a E n t r a d ao S y s t e m . i npor um n e wF i l e I n p u t S t r e a m :


I n p u t S t r e a mi s=n e wF i l e I n p u t S t r e a m ( " a r q u i v o . t x t " ) ;

3. (conceitual) Seu programa l todas as linhas desse arquivo. Repare na utilizao do polimorfismo. Como ambos so I n p u t S t r e a m , isso faz com que eles se encaixem no I n p u t S t r e a m R e a d e r . 4. Repare que, no final, s usamos mesmo o B u f f e r e d R e a d e r . As referncias para I n p u t S t r e a me para I n p u t S t r e a m R e a d e rso apenas utilizadas temporariamente. Portanto, comum encontrarmos o seguinte cdigo nesses casos:
B u f f e r e d R e a d e rb r=n e wB u f f e r e d R e a d e r ( n e wI n p u t S t r e a m R e a d e r ( n e wF i l e I n p u t S t r e a m ( " a r q u i v o . t x t " ) ) ) ; S t r i n gl i n h a=b r . r e a d L i n e ( ) ;/ /p r i m e i r al i n h a

Claro que devemos evitar um cdigo mais sucinto em vez de sacrificar legibilidade,

mas este cdigo em particular bem comum e aceitvel. Faa a alterao no seu programa! 5. Utilize a classe S c a n n e rdo Java 5 para ler de um arquivo e colocar na tela. O cdigo vai ficar incrivelmente pequeno.
1 c l a s sE n t r a d a D e U m A r q u i v o{ 2 p u b l i cs t a t i cv o i dm a i n ( S t r i n g [ ]a r g s )t h r o w sI O E x c e p t i o n{ 3 4 5 6

I n p u t S t r e a mi s=n e wF i l e I n p u t S t r e a m ( " a r q u i v o . t x t " ) ; S c a n n e re n t r a d a=n e wS c a n n e r ( i s ) ; w h i l e( e n t r a d a . h a s N e x t L i n e ( ) ){ S y s t e m . o u t . p r i n t l n ( e n t r a d a . n e x t L i n e ( ) ) ; }

7 8 9 1 0 i s . c l o s e ( ) ; 1 1 } 1 2 }

Depois troque a varivel i spara que ela se refira ao S y s t e m . i n . Agora voc est lendo do teclado! 6. (opcional) Altere seu programa para que ele leia do arquivo e, em vez de jogar na tela, jogue em um outro arquivo. Voc vai precisar, alm do cdigo anterior para ler de um arquivo, do cdigo para escrever em um arquivo. Para isso, voc pode usar o B u f f e r e d W r i t e rou o P r i n t S t r e a m , sendo este ltimo de mais fcil manipulao. Se for usar o B u f f e r e d W r i t e r , fazemos assim parar abri-lo:
O u t p u t S t r e a mo s=n e wF i l e O u t p u t S t r e a m ( " s a i d a . t x t " ) ; O u t p u t S t r e a m W r i t e ro s w=n e wO u t p u t S t r e a m W r i t e r ( o s ) ; B u f f e r e d W r i t e rb w=n e wB u f f e r e d W r i t e r ( o s w ) ;

Dentro do loop de leitura do teclado, voc deve usar b w . w r i t e ( x ) , onde x a linha que voc leu. Use b w . n e w L i n e ( )para pular de linha. No se esquea de, no trmino do loop, dar um b w . c l o s e ( ) . Voc pode seguir o modelo:
w h i l e( e n t r a d a . h a s N e x t L i n e ( ) ){ S t r i n gl i n h a=e n t r a d a . n e x t L i n e ( ) ; b w . w r i t e ( l i n h a ) ; b w . n e w L i n e ( ) ; } b w . c l o s e ( ) ;

Aps rodar seu programa, d um refresh no seu projeto (clique da direita no nome do projeto, refresh) e veja que ele criou um arquivo s a i d a . t x tno diretrio. 7. (opcional) Altere novamente o programa para ele virar um pequeno editor: l do

teclado e escreve em arquivo. Repare que a mudana a ser feita mnima! 8. (opcional) A classe S c a n n e r muito poderosa! Consulte seu javadoc para saber sobre o d e l i m i t e re os outros mtodos n e x t .

Voc no est nessa pgina a toa Voc chegou aqui porque a Caelum referncia nacional em cursos de Java, Ruby, Agile, Mobile, Web e .NET. Faa curso com quem escreveu essa apostila. Consulte as vantagens do curso Java e Orientao a Objetos.

15.9 - DISCUSSO EM AULA : DESIGN PATTERNS E O TEMPLATE METHOD


Aplicar bem os conceitos de orientao a objetos sempre uma grande dvida. Sempre queremos encapsular direito, favorecer a flexibilidade, desacoplar classes, escrever cdigo elegante e de fcil manuteno. E ouvimos falar que a Orientao a Objetos ajuda em tudo isso. Mas, onde usar herana de forma saudvel? Como usar interfaces? Onde o polimorfismo me ajuda? Como encapsular direito? Classes abstratas so usadas em que situaes? Muitos anos atrs, grandes nomes do mundo da orientao a objetos perceberam que criar bons designs orientados a objetos era um grande desafio para muitas pessoas. Perceberam que muitos problemas de OO apareciam recorrentemente em vrios projetos; e que as pessoas j tinham certas solues para esses problemas clssicos (nem sempre muito elegantes). O que fizeram foi criar solues padres para problemas comuns na orientao a objetos, e chamaram isso de Design Patterns, ou Padres de Projeto. O conceito vinha da arquitetura onde era muito comum ter esse tipo de soluo. E, em 1994, ganhou grande popularidade na computao com o livro Design Patterns: Elements of Reusable Object-Oriented Software, um catlogo com vrias dessas solues escrito por Erich Gamma, Ralph Johnson, Richard Helm e John Vlissides (a Gangue dos Quatro, GoF). Design Patterns tornou-se referncia absoluta no bom uso da orientao a

objetos. Outros padres surgiram depois, em outras literaturas igualmente consagradas. O conhecimento dessas tcnicas imprescindvel para o bom programador. Discuta com o instrutor como Design Patterns ajudam a resolver problemas de modelagem em sistemas orientados a objetos. Veja como Design Patterns so aplicados em muitos lugares do prprio Java. O instrutor comentar do T e m p l a t eM e t h o de mostrar o cdigo fonte do mtodo read() da classe j a v a . i o . I n p u t S t r e a m :
1 p u b l i ci n tr e a d ( b y t eb [ ] ,i n to f f ,i n tl e n )t h r o w sI O E x c e p t i o n{ 2 i f( b= =n u l l ){ 3 t h r o wn e wN u l l P o i n t e r E x c e p t i o n ( ) ; 4 }e l s ei f( o f f<0| |l e n<0| |l e n>b . l e n g t h-o f f ){ 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9

t h r o wn e wI n d e x O u t O f B o u n d s E x c e p t i o n ( ) ; }e l s ei f( l e n= =0 ){ r e t u r n0 ; } i n tc=r e a d ( ) ; i f( c= =1 ){ r e t u r n1 ; } b [ o f f ]=( b y t e )c ; i n ti=1 ; t r y{ f o r( ;i<l e n;i + + ){ c=r e a d ( ) ; i f( c= =1 ){ b r e a k ; } b [ o f f+i ]=( b y t e ) c ; } }c a t c h( I O E x c e p t i o ne e ){ } r e t u r ni ; }

Discuta em aula como esse mtodo aplica conceitos importantes da orientao a objetos e promove flexibilidade e extensibilidade.

CAPTULO ANTERIOR:

O pacote java.lang

PRXIMO CAPTULO:

Collections framework

Voc encontra a Caelum tambm em:

Blog Caelum

Cursos Online

Facebook

Newsletter

Casa do Cdigo

Twitter

Vous aimerez peut-être aussi