Escolar Documentos
Profissional Documentos
Cultura Documentos
br/apostila-java-orientacao-objetos/
*e voc! %osta $e estu$ar essa apostila aberta $a Caelum# certamente vai %ostar $os novos cursos online que lan,amos na plataforma Alura. 4oc! estu$a a qualquer momento com a qualidade
O que Java
"Computa$ores s(o in6teis# eles apenas $(o respostas" Che%ou a hora $e respon$er as per%untas mais b&sicas sobre .ava. 5o t)rmino $esse captulo# voc! ser& capaz $e: respon$er o que ) .ava? mostrar as vanta%ens e $esvanta%ens $o .ava? enten$er bem o conceito $e m&quina virtual? compilar e e ecutar um pro%rama simples.
2.1 - Java
/nten$er um pouco $a hist+ria $a plataforma .ava ) essencial para en er%ar os motivos que a levaram ao sucesso. @uais eram os seus maiores problemas quan$o pro%ramava na $)ca$a $e 1AABC ponteirosC %erenciamento $e mem+riaC or%aniza,(oC falta $e bibliotecasC ter $e reescrever parte $o c+$i%o ao mu$ar $e sistema operacionalC custo financeiro $e usar a tecnolo%iaC
5 lin%ua%em .ava resolve bem esses problemas# que at) ent(o apareciam com frequ!ncia nas outras lin%ua%ens. 5l%uns $esses problemas foram particularmente ataca$os porque uma $as %ran$es motiva,-es para a cria,(o $a plataforma .ava era $e que essa lin%ua%em fosse usa$a em pequenos $ispositivos# como tvs# vi$eocassetes# aspira$ores# liqui$ifica$ores e outros. 5pesar $isso a
lin%ua%em teve seu lan,amento foca$o no uso em clientes web 9browsers: para ro$ar pequenas aplica,-es 9applets:. >oje em $ia esse n(o ) o %ran$e merca$o $o .ava: apesar $e ter si$o i$ealiza$o com um prop+sito e lan,a$o com outro# o .ava %anhou $estaque no la$o $o servi$or. 1 .ava foi cria$o pela anti%a *un "icrosDstems e manti$a atrav)s $e um comit! 9http://www.jcp.or%:. *eu site principal era o java.sun.com# e java.com um site mais institucional# volta$o ao consumi$or $e pro$utos e usu&rios lei%os# n(o $esenvolve$ores. Com a compra $a *un pela 1racle em =BBA# muitas 8EFs e nomes tem si$o troca$os para refletir a marca $a 1racle. 5 p&%ina principal $o .ava ): http://www.oracle.com/technetworG/java/ 0o Brasil# $iversos %rupos $e usu&rios se formaram para tentar $isseminar o conhecimento $a lin%ua%em. 8m $eles ) o ()J 9http://www.%uj.com.br:# uma comuni$a$e virtual com arti%os# tutoriais e f+rum para tirar $6vi$as# o maior em ln%ua portu%uesa com mais $e cem mil usu&rios e 1 milh(o $e mensa%ens. /ncorajamos to$os os alunos a usar muito os f+runs $o mesmo# pois ) uma $as melhores maneiras para achar solu,-es para pequenos problemas que acontecem com %ran$e frequ!ncia.
@ueren$o apren$er ain$a mais sobre .ava e boas pr&ticas $e orienta,(o a objetosC /sclarecer $6vi$as $os e ercciosC 1uvir e plica,-es $etalha$as com um instrutorC 5 Caelum oferece o curso /J-11 presencial nas ci$a$es $e *(o 2aulo# Eio $e .aneiro e Braslia# al)m $e turmas incompanD. Consulte as vanta%ens $o curso Java e Orientao a Objetos.
1 c+$i%o fonte ) compila$o para c+$i%o $e m&quina especfico $e uma plataforma e sistema operacional. "uitas vezes o pr+prio c+$i%o fonte ) $esenvolvi$o visan$o uma 6nica plataformaO /sse c+$i%o e ecut&vel 9bin&rio: resultante ser& e ecuta$o pelo sistema operacional e# por esse motivo# ele $eve saber conversar com o sistema operacional em quest(o.
'sto )# temos um c+$i%o e ecut&vel para ca$a sistema operacional. L necess&rio compilar uma vez para Pin$ows# outra para o Finu # e assim por $iante# caso a %ente queira que esse nosso software possa ser utiliza$o em v&rias plataformas. /sse ) o caso $e aplicativos como o 1pen1ffice# ;irefo e outros. Como foi $ito anteriormente# na maioria $as vezes# a sua aplica,(o se utiliza $as bibliotecas $o sistema operacional# como# por e emplo# a $e interface %r&fica para $esenhar as "telas". 5 biblioteca $e interface %r&fica $o Pin$ows ) bem $iferente $as $o Finu : como criar ent(o uma aplica,(o que ro$e $e forma pareci$a nos $ois sistemas operacionaisC 2recisamos reescrever um mesmo pe$a,o $a aplica,(o para $iferentes sistemas operacionais# j& que eles n(o s(o compatveis. .& o .ava utiliza $o conceito $e m1quina virtual# on$e e iste# entre o sistema operacional e a aplica,(o# uma cama$a e tra respons&vel por "tra$uzir" - mas n(o apenas isso - o que sua aplica,(o $eseja fazer para as respectivas chama$as $o sistema operacional on$e ela est& ro$an$o no momento:
3essa forma# a maneira com a qual voc! abre uma janela no Finu ou no Pin$ows ) a mesma: voc! %anha in$epen$!ncia $e sistema operacional. 1u# melhor ain$a# in$epen$!ncia $e plataforma em %eral: n(o ) preciso se preocupar em qual sistema operacional sua aplica,(o est& ro$an$o# nem em que tipo $e m&quina# confi%ura,-es# etc. Eepare que uma m&quina virtual ) um conceito bem mais amplo que o $e um interpreta$or. Como o pr+prio nome $iz# uma m&quina virtual ) como um "computa$or $e mentira": tem tu$o que um computa$or tem. /m outras palavras# ela ) respons&vel por %erenciar mem+ria# threa$s# a pilha $e e ecu,(o# etc. *ua aplica,(o ro$a sem nenhum envolvimento com o sistema operacionalO *empre conversan$o apenas com a Java +irtual 0ac$ine 9.4":. /ssa caracterstica ) interessante: como tu$o passa pela .4"# ela po$e tirar m)tricas# $eci$ir on$e ) melhor alocar a mem+ria# entre outros. 8ma .4" isola totalmente a aplica,(o $o sistema operacional. *e uma .4" termina abruptamente# s+ as aplica,-es que estavam ro$an$o nela ir(o terminar: isso n(o afetar& outras .4"s que estejam ro$an$o no mesmo computa$or# nem afetar& o sistema operacional. /ssa cama$a $e isolamento tamb)m ) interessante quan$o pensamos em um servi$or que n(o po$e se sujeitar a ro$ar c+$i%o que possa interferir na boa e ecu,(o $e outras aplica,-es. /ssa cama$a# a m&quina virtual# n(o enten$e c+$i%o java# ela enten$e um c+$i%o $e m&quina especfico. /sse c+$i%o $e m&quina ) %era$o por um compila$or java# como o javac# e ) conheci$o por "b2tecode"# pois e istem menos $e =JQ c+$i%os $e opera,(o $essa lin%ua%em# e ca$a "opco$e" %asta um bDte. 1 compila$or .ava %era esse bDteco$e que# $iferente $as lin%ua%ens sem m&quina virtual# vai servir para $iferentes sistemas operacionais# j& que ele vai ser "tra$uzi$o" pela .4". 3rite once4 run an25$ere /sse era um slo%an que a *un usava para o .ava# j& que voc! n(o precisa reescrever partes $a sua aplica,(o to$a vez que quiser mu$ar $e sistema operacional.
$etermina$o c+$i%o n(o est& com performance a$equa$a e otimizar mais um pouco aquele trecho# ou ain$a mu$ar a estrat)%ia $e otimiza,(o. L por esse motivo que as .4"s mais recentes 9como a $o .ava N: em al%uns casos che%am a %anhar $e c+$i%os C compila$os com o 7CC R. .
Conhe,a a Casa do C*di#o# uma e$itora $iferente# com cura$oria $a Caelum e obsess(o por livros $e quali$a$e a pre,os justos. Casa $o C+$i%o# ebooG com pre,o $e ebooG.
"as esse c+$i%o n(o ser& aceito pelo compila$or java. 1 .ava ) uma lin%ua%em bastante
burocr&tica# e precisa $e mais $o que isso para iniciar uma e ecu,(o. 4eremos os $etalhes e os porqu!s $urante os pr+ imos captulos. 1 mnimo que precisaramos escrever ) al%o como:
class MeuPro rama ! pu"lic static voi# main(Strin $% ar s) ! System.out.println("Minha primeira aplicao Java!"); & &
Botao Ho$os os c+$i%os apresenta$os na apostila est(o formata$os com recursos visuais para au iliar a leitura e compreens(o $os mesmos. @uan$o for $i%itar os c+$i%os no computa$or# trate os c+$i%os como te to simples. 5 numera,(o $as linhas no faz parte $o c+$i%o e n(o $eve ser $i%ita$a? ) apenas um recurso $i$&tico. 1 .ava ) case sensitive: tome cui$a$o com mai6sculas e min6sculas. 5p+s $i%itar o c+$i%o acima# %rave-o como 0euEro#rama.java em al%um $iret+rio. 2ara compilar# voc! $eve pe$ir para que o compila$or $e .ava $a 1racle# chama$o 'avac# %ere o bDteco$e correspon$ente ao seu c+$i%o .ava.
3epois $e compilar# o b2tecode foi %era$o. @uan$o o sistema operacional listar os arquivos conti$os no $iret+rio atual# voc! po$er& ver que um arquivo .class foi %era$o# com o mesmo nome $a sua classe .ava. Assustado com o c*di#o? 2ara quem j& tem uma e peri!ncia com .ava# esse primeiro c+$i%o ) muito simples. "as# se ) seu primeiro c+$i%o em .ava# po$e ser um pouco traumatizante. 0(o $ei e $e ler o pref&cio $o curso# que $ei ar& voc! mais tranquilo em rela,(o a curva $e apren$iza$o $a lin%ua%em# conhecen$o como o curso est& or%aniza$o. Ereciso sempre pro#ramar usando o Botepad ou similar? 0(o ) necess&rio $i%itar sempre seu pro%rama em um simples aplicativo como o 0otepa$. 4oc! po$e usar um e$itor que tenha s2nta! $i#$li#$tin# e outros benefcios. "as# no come,o# ) interessante voc! usar al%o que n(o possua ferramentas# para que voc! possa se acostumar com os erros $e compila,(o# sinta e e outros. 3epois $o captulo $e polimorfismo e heran,a su%erimos a utiliza,(o $o /clipse 9http://www.eclipse.or%:# a '3/ l$er no merca$o# e %ratuita. / iste um captulo a parte para o uso $o /clipse nesta apostila. 0o Finu # recomen$amos o uso $o %e$it ou $o Gate. 0o Pin$ows# voc! po$e usar o 0otepa$VV ou o He t2a$. 0o "ac# He tPran%ler ou He t"ate.
5o e ecutar# po$e ser que a acentua,(o resultante saia erra$a $evi$o a al%umas confi%ura,-es que $ei amos $e fazer. *em problemas. J1 con$ece os cursos online Alura?
1 miolo $o pro%rama ) o que ser& e ecuta$o quan$o chamamos a m&quina virtual. 2or enquanto# to$as as linhas anteriores# on$e h& a $eclara,(o $e uma classe e a $e um m)to$o# n(o importam para n+s nesse momento. "as $evemos saber que to$a aplica,(o .ava come,a por um ponto $e entra$a# e este ponto $e entra$a ) o m)to$o main. 5in$a n(o sabemos o que ) m)to$o# mas veremos no captulo K. 5t) l&# n(o se preocupe com essas $eclara,-es. *empre que um e erccio for feito# o c+$i%o que nos importa sempre estar& nesse miolo. 0o caso $o nosso c+$i%o# a linha $o System.out.println faz com que o conte6$o entre aspas seja coloca$o na tela.
/ a sa$a:
MeuPro rama(); +o#e, -, aloa#./, invo0especial 6, return
+o#e, -, etstatic 17; ((8iel# 'ava(lan (System.out,9'ava(io(PrintStream; :, l#c 1:; ((Strin Minha primeira aplicao Java!! ;, invo0evirtual 16; ((Metho# 'ava(io(PrintStream.println, (9'ava(lan (Strin ;)5 <, return &
L o c+$i%o acima# que a .4" sabe ler. L o "c+$i%o $e m&quina"# $a m&quina virtual. 8m bDteco$e po$e ser reverti$o para o .java ori%inal 9com per$a $e coment&rios e nomes $e vari&veis locais:. Caso seu software v& virar um pro$uto $e prateleira# ) fun$amental usar um ofusca$or no seu c+$i%o# que vai embaralhar classes# m)to$os e um monte $e outros recursos 9in$icamos o http://pro%uar$.sf.net:.
/rro:
>.'ava,6, @;@ eApecte# & B / error
/sse ) o erro $e compila,(o mais comum: aquele on$e um ponto e vr%ula fora esqueci$o. Eepare que o compila$or ) e plcito em $izer que a linha 6 ) a com problemas. 1utros erros $e compila,(o po$em ocorrer se voc! escreveu palavras chaves 9as que colocamos em ne%rito: em mai6sculas# esqueceu $e abrir e fechar as !&# etc. 3urante a e ecu,(o# outros erros po$em aparecer: - *e voc! $eclarar a classe como M# compil&-la e $epois tentar us&-la como .ava te avisa:
CAception in threa# "main" 'ava.lan .Do+lassEef8oun#Crror,
min6sculo 9java :# o
> (wron
name, A)
- *e tentar acessar uma classe no $iret+rio ou classpath erra$o# ou se o nome estiver erra$o# ocorrer& o se%uinte erro:
CAception in threa# "main" 'ava.lan .Do+lassEef8oun#Crror, >
2or e emplo:
class > ! pu"lic voi# main (Strin $% ar s) ! System.out.println("8altou o staticF tente eAecutar!"); & &
2or e emplo:
class > ! static voi# main (Strin $% ar s) ! System.out.println("8altou o pu"lic"); & &
2or e emplo# ) possvel ter uma i#a#e que %uar$a um n6mero inteiro:
int i#a#e;
Com isso# voc! $eclara a vari&vel i#a#e# que passa a e istir a partir $aquela linha. /la ) $o tipo int# que %uar$a um n6mero inteiro. 5 partir $a# voc! po$e us&-la# primeiramente atribuin$o valores. 5 linha a se%uir ) a tra$u,(o $e: Gi#a#e deve valer quin.eG.
i#a#e G /;;
Coment1rios em Java 2ara fazer um coment&rio em java# voc! po$e usar o (( para comentar at) o final $a linha# ou ent(o usar o (H H( para comentar o que estiver entre eles.
(H comentIrio #a)uiF ate a)ui H( (( uma linha #e comentIrio so"re a i#a#e int i#a#e;
5l)m $e atribuir# voc! po$e utilizar esse valor. 1 c+$i%o a se%uir $eclara novamente a vari&vel i#a#e com valor 1J e imprime seu valor na sa$a pa$r(o atrav)s $a chama$a a System.out.println.
(( #eclara a i#a#e int i#a#e; i#a#e G /;; (( imprime a i#a#e System.out.println(i#a#e);
2or fim# po$emos utilizar o valor $e uma vari&vel para al%um outro prop+sito# como alterar ou $efinir uma se%un$a vari&vel. 1 c+$i%o a se%uir cria uma vari&vel chama$a i#a#eDoJnoKue5em com valor $e idade mais um.
(( calcula a i#a#e no ano se uinte int i#a#eDoJnoKue5em; i#a#eDoJnoKue5em G i#a#e L /;
0o mesmo momento que voc! $eclara uma vari&vel# tamb)m ) possvel inicializ&-la por pratici$a$e:
int i#a#e G /;;
4oc! po$e usar os opera$ores V# -# / e W para operar com n6meros# sen$o eles respons&veis pela a$i,(o# subtra,(o# $ivis(o e multiplica,(o# respectivamente. 5l)m $esses opera$ores b&sicos# h& o opera$or U 9m+$ulo: que na$a mais ) que o resto de uma diviso inteira. 4eja al%uns e emplos:
int )uatro G 7 L 7; int tres G ; * 7;
int oito G 6 H 7; int #eMesseis G N6 ( 6; int um G ; O 7; (( ; #ivi#i#o por 7 #I 7 e tem resto /; (( o opera#or O pe a o resto #a #iviso inteira
Como rodar esses c*di#os? 4oc! $eve colocar esses trechos $e c+$i%o $entro $o bloco main que vimos no captulo anterior. 'sto )# isso $eve ficar no miolo $o pro%rama. 8se bastante System.out.println# $essa forma voc! po$e ver al%um resulta$o# caso contr&rio# ao e ecutar a aplica,(o# na$a aparecer&. 2or e emplo# para imprimir a i#a#e e a i#a#eDoJnoKue5em po$emos escrever o se%uinte pro%rama $e e emplo:
class PestaQ#a#e ! pu"lic static voi# main(Strin $% ar s) ! (( imprime a i#a#e int i#a#e G 7-; System.out.println(i#a#e); (( era uma i#a#e no ano se uinte int i#a#eDoJnoKue5em; i#a#eDoJnoKue5em G i#a#e L /; (( imprime a i#a#e System.out.println(i#a#eDoJnoKue5em);
& &
Eepresentar n6meros inteiros ) f&cil# mas como %uar$ar valores reais# tais como fra,-es $e n6meros inteiros e outrosC 1utro tipo $e vari&vel muito utiliza$o ) o #ou"le# que armazena um n6mero com ponto flutuante 9e que tamb)m po$e armazenar um n6mero inteiro:.
#ou"le pi G :./6; #ou"le A G ; H /-;
1 tipo boolean armazena um valor ver$a$eiro ou falso# e s+: na$a $e n6meros# palavras ou en$ere,os# como em al%umas outras lin%ua%ens.
"oolean ver#a#e G true;
true e false s(o palavras reserva$as $o .ava. L comum que um "oolean seja $etermina$o atrav)s $e uma e!presso booleana# isto )# um trecho $e c+$i%o que retorna um booleano# como o e emplo:
int i#a#e G :-; "oolean menorEeQ#a#e G i#a#e 3 /<;
1 tipo char %uar$a um# e apenas um# caractere. /sse caractere $eve estar entre aspas simples. 0(o se esque,a $essas $uas caractersticas $e uma vari&vel $o tipo charO 2or e emplo# ela n(o po$e %uar$ar um c+$i%o como @@ pois o vazio n(o ) um caractereO
char letra G @a@; System.out.println(letra);
4ari&veis $o tipo char s(o pouco usa$as no $ia a $ia. 4eremos mais a frente o uso $as Strin s#
que usamos constantemente# por)m estas n(o s(o $efini$as por um tipo primitivo.
5qui# i fica com o valor $e Q. "as e 'C 0a se%un$a linha# ' est& valen$o J. @uan$o i passa a valer Q# ser& que ' tamb)m mu$a $e valorC 0(o# pois o valor $e um tipo primitivo sempre ) copia$o. 5pesar $a linha = fazer ' G i# a partir $esse momento essas vari&veis n(o tem rela,(o nenhuma: o que acontece com uma# n(o reflete em na$a com a outra. Outros tipos primitivos 4imos aqui os tipos primitivos que mais aparecem. 1 .ava tem outros# que s(o o "yte# short# lon e float. Ca$a tipo possui caractersticas especiais que# para um pro%rama$or avan,a$o# po$em fazer muita $iferen,a.
J. 'mprima a vari&vel astosPrimestre. =. 5$icione c+$i%o 9sem alterar as linhas que j& e istem: na classe anterior para imprimir a m)$ia mensal $e %asto# crian$o uma vari&vel me#iaMensal junto com uma mensa%em. 2ara isso# concatene a Strin com o valor# usan$o "5alor #a mT#ia mensal G " L me#iaMensal.
5pesar $e J ser um bom valor para um int# o compila$or n(o tem como saber que valor estar& $entro $esse #ou"le no momento $a e ecu,(o. /sse valor po$e ter si$o $i%ita$o pelo usu&rio# e nin%u)m vai %arantir que essa convers(o ocorra sem per$a $e valores. .& no caso a se%uir# ) o contr&rio:
int i G ;; #ou"le #7 G i;
1 c+$i%o acima compila sem problemas# j& que um #ou"le po$e %uar$ar um n6mero com ou sem ponto flutuante. Ho$os os inteiros representa$os por uma vari&vel $o tipo int po$em ser %uar$a$os em uma vari&vel $ouble# ent(o n(o e istem problemas no c+$i%o acima. Xs vezes# precisamos que um n6mero quebra$o seja arre$on$a$o e armazena$o num n6mero inteiro. 2ara fazer isso sem que haja o erro $e compila,(o# ) preciso or$enar que o n6mero quebra$o seja moldado HcastedI como um n6mero inteiro. /sse processo recebe o nome $e castin#.
#ou"le #: G :./6; int i G (int) #:;
1 castin% foi feito para mol$ar a vari&vel #: como um int. 1 valor $e i a%ora ) R. 1 mesmo ocorre entre valores int e lon .
lon A G /----; int i G A; (( no compilaF pois po#e estar per#en#o informao
int i G (int) A;
1 c+$i%o acima n(o compila pois to$os os literais com ponto flutuante s(o consi$era$os #ou"le pelo .ava. / float n(o po$e receber um #ou"le sem per$a $e informa,(o# para fazer isso funcionar po$emos escrever o se%uinte:
float A G -.-f;
5 letra f# que po$e ser mai6scula ou min6scula# in$ica que aquele literal $eve ser trata$o como float. 1utro caso# que ) mais comum:
#ou"le # G ;; float f G :; float A G f L (float) #;
4oc! precisa $o castin% porque o .ava faz as contas e vai armazenan$o sempre no maior tipo que apareceu $urante as opera,-es# no caso o #ou"le. /# uma observa,(o: no mnimo# o .ava armazena o resulta$o em um int# na hora $e fazer as contas. 5t) castin% com vari&veis $o tipo char po$em ocorrer. 1 6nico tipo primitivo que n(o po$e ser atribu$o a nenhum outro tipo ) o "oolean. Castin#s poss"veis 5bai o est(o relaciona$os to$os os casts possveis na lin%ua%em .ava# mostran$o a convers(o de um valor para outro. 5 in$ica,(o 8mpl. quer $izer que aquele cast ) implcito e autom&tico# ou seja# voc! n(o precisa in$icar o cast e plicitamente 9lembran$o que o tipo boolean n(o po$e ser converti$o para nenhum outro tipo:.
&aman$o dos tipos 0a tabela abai o# est(o os tamanhos $e ca$a tipo primitivo $o .ava.
%.< - O i- e o else
5 sinta e $o if no .ava ) a se%uinte:
if (con#icaoSooleana) ! co#i o; &
8ma condio booleana ) qualquer e press(o que retorne true ou false. 2ara isso# voc! po$e usar os opera$ores 3# 4# 3G# 4G e outros. 8m e emplo:
int i#a#e G /;; if (i#a#e 3 /<) ! System.out.println("Do po#e entrar"); &
5l)m $isso# voc! po$e usar a cl&usula else para in$icar o comportamento que $eve ser e ecuta$o no caso $a e press(o booleana ser falsa:
int i#a#e G /;; if (i#a#e 3 /<) ! System.out.println("Do po#e entrar"); & else ! System.out.println("Po#e entrar"); &
4oc! po$e concatenar e press-es booleanas atrav)s $os opera$ores l+%icos G=G e GO)G. 1 G=G ) representa$o pelo VV e o GO)G ) representa$o pelo WW. 8m e emplo seria verificar se ele tem menos $e 1Y anos e se ele n(o ) ami%o $o $ono:
int i#a#e G /;; "oolean ami oEoEono G true; if (i#a#e 3 /< VV ami oEoEono GG false) ! System.out.println("Do po#e entrar"); & else ! System.out.println("Po#e entrar"); &
/sse c+$i%o po$eria ficar ain$a mais le%vel# utilizan$o-se o opera$or $e ne%a,(o# o !. /sse opera$or transforma o resulta$o $e uma e press(o booleana $e false para true e vice versa.
int i#a#e G /;; "oolean ami oEoEono G true; if (i#a#e 3 /< VV !ami oEoEono) ! System.out.println("Do po#e entrar"); & else ! System.out.println("Po#e entrar"); &
Eepare na linha R que o trecho ami oEoEono GG false virou !ami oEoEono. =les t,m o mesmo valor. 2ara comparar se uma vari&vel tem o mesmo valor que outra vari&vel ou valor# utilizamos o opera$or GG. Eepare que utilizar o opera$or G $entro $e um if vai retornar um erro $e compila,(o# j& que o opera$or G ) o $e atribui,(o.
%.@ - O 3$ile
1 while ) um coman$o usa$o para fazer um lao HloopI# isto )# repetir um trecho $e c+$i%o al%umas vezes. 5 i$eia ) que esse trecho $e c+$i%o seja repeti$o enquanto uma $etermina$a con$i,(o permanecer ver$a$eira.
int i#a#e G /;; while (i#a#e 3 /<) ! System.out.println(i#a#e); i#a#e G i#a#e L /; &
1 trecho $entro $o bloco $o while ser& e ecuta$o at) o momento em que a con$i,(o i#a#e 3 /< passe a ser falsa. / isso ocorrer& e atamente no momento em que i#a#e GG /<# o que n(o o far& imprimir /<.
int i G -; while (i 3 /-) ! System.out.println(i); i G i L /; &
%.A - O /or
1utro coman$o $e loop e tremamente utiliza$o ) o for. 5 i$eia ) a mesma $o while: fazer um trecho $e c+$i%o ser repeti$o enquanto uma con$i,(o continuar ver$a$eira. "as al)m $isso# o for isola tamb)m um espa,o para inicializa,(o $e vari&veis e o mo$ifica$or $essas vari&veis. 'sso faz com que fiquem mais le%veis# as vari&veis que s(o relaciona$as ao loop:
for (inicialiMacao; con#icao; incremento) ! co#i o; &
8m e emplo ) o a se%uir:
for (int i G -; i 3 /-; i G i L /) ! System.out.println("olI!"); &
2or)m# o c+$i%o $o for in$ica claramente que a vari&vel i serve# em especial# para controlar a quanti$a$e $e la,os e ecuta$os. @uan$o usar o forC @uan$o usar o whileC 3epen$e $o %osto e $a ocasi(o.
E*s incremento JJ i G i L / po$e realmente ser substitu$o por iLL quan$o isola$o# por)m# em al%uns casos# temos essa instru,(o envolvi$a em# por e emplo# uma atribui,(o:
int i G ;; int A G iLL;
@ual ) o valor $e AC 1 $e i# ap+s essa linha# ) Q. 1 opera$or LL# quan$o vem ap+s a vari&vel# retorna o valor anti%o# e incrementa 9p+s incremento:# fazen$o A valer J. *e voc! tivesse usa$o o LL antes $a vari&vel 9pr) incremento:# o resulta$o seria Q:
int i G ;; int A G LLi; (( a)ui A valera N
1 c+$i%o acima vai percorrer os n6meros $e a D e parar quan$o encontrar um n6mero $ivisvel por 1A# uma vez que foi utiliza$a a palavra chave "rea0. 3a mesma maneira# ) possvel obri%ar o loop a e ecutar o pr+ imo la,o. 2ara isso usamos a palavra chave continue.
for (int i G -; i 3 /--; iLL) ! if (i 4 ;- VV i 3 N-) ! continue; & System.out.println(i); &
1 escopo da vari1vel ) o nome $a$o ao trecho $e c+$i%o em que aquela vari&vel e iste e on$e ) possvel acess&-la.
@uan$o abrimos um novo bloco com as chaves# as vari&veis $eclara$as ali $entro s* valem at o -im daquele bloco.
(( a)ui a variIvel i no eAiste int i G ;; (( a partir #a)ui ela eAiste while (con#icao) ! (( o i ain#a vale a)ui int ' G Z; (( o ' passa a eAistir & (( a)ui o ' no eAiste maisF mas o i continua #entro #o escopo
0o bloco acima# a vari&vel ' p&ra $e e istir quan$o termina o bloco on$e ela foi $eclara$a. *e voc! tentar acessar uma vari&vel fora $e seu escopo# ocorrer& um erro $e compila,(o.
5qui a vari&vel i n(o e iste fora $o if e $o elseO *e voc! $eclarar a vari&vel antes $o if# vai haver outro erro $e compila,(o: $entro $o if e $o else a vari&vel est& sen$o re$eclara$aO /nt(o o c+$i%o para compilar e fazer senti$o fica:
int i; if (al umSooleano) ! i G ;; & else ! i G /-; & System.out.println(i);
0este for# a vari&vel i morre ao seu t)rmino# n(o po$en$o ser acessa$a $e fora $o for# %eran$o um erro $e compila,(o. *e voc! realmente quer acessar o conta$or $epois $o loop terminar# precisa $e al%o como:
int i; for (i G -; i 3 /-; iLL) ! System.out.println("olI!"); & System.out.println(i);
Bova editora Casa do C*di#o com livros de uma -orma di-erente /$itoras tra$icionais pouco li%am para ebooGs e novas tecnolo%ias. 0(o conhecem pro%rama,(o para revisar os livros tecnicamente a fun$o. 0(o t!m anos $e e peri!ncia em $i$&ticas com cursos. Conhe,a a Casa do C*di#o# uma e$itora $iferente# com cura$oria $a Caelum e obsess(o por livros $e quali$a$e a pre,os justos. Casa $o C+$i%o# ebooG com pre,o $e ebooG.
0(o copie e cole $e um e erccio j& e istenteO 5proveite para praticar. 1. 'mprima to$os os n6meros $e 1JB a RBB. =. 'mprima a soma $e 1 at) 1BBB. R. 'mprima to$os os m6ltiplos $e R# entre 1 e 1BB. K. 'mprima os fatoriais $e 1 a 1B. 1 fatorial $e um n6mero n ) n W n-1 W n-= ... at) n S 1. Fembre-se $e utilizar os par!nteses. 1 fatorial $e B ) 1 1 fatorial $e 1 ) 9BO: W 1 S 1 1 fatorial $e = ) 91O: W = S = 1 fatorial $e R ) 9=O: W R S Q 1 fatorial $e K ) 9RO: W K S =K ;a,a um for que inicie uma vari&vel n 9n6mero: como 1 e fatorial 9resulta$o: como 1 e varia n $e 1 at) 1B:
int fatorial G /; for (int n G /; n 3G /-; nLL) ! &
J. 0o c+$i%o $o e erccio anterior# aumente a quanti$a$e $e n6meros que ter(o os fatoriais impressos# at) =B# RB# KB. /m um $etermina$o momento# al)m $esse c&lculo $emorar# vai come,ar a mostrar respostas completamente erra$as. 2or qu!C "u$e $e int para lon para ver al%uma mu$an,a. Q. 9opcional: 'mprima os primeiros n6meros $a s)rie $e ;ibonacci at) passar $e 1BB. 5 s)rie $e ;ibonacci ) a se%uinte: B# 1# 1# =# R# J# Y# 1R# =1# etc... 2ara calcul&-la# o primeiro elemento vale B# o se%un$o vale 1# $a por $iante# o n-)simo elemento vale o 9n-1:-)simo elemento soma$o ao 9n-=:-)simo elemento 9e : Y S J V R:. N. 9opcional: /screva um pro%rama que# $a$a uma vari&vel A com al%um valor inteiro# temos um novo A $e acor$o com a se%uinte re%ra: se A ) par# A G A ( 7 se A ) impar# A G : H A L / imprime A 1 pro%rama $eve parar quan$o A tiver o valor final $e 1. 2or e emplo# para A G /:# a sa$a ser&:KB -Z =B -Z 1B -Z J -Z 1Q -Z Y -Z K -Z = -Z 1 8mprimindo sem pular lin$a 8m $etalhe importante ) que uma quebra $e linha ) impressa to$a vez que chamamos println. 2ara n(o pular uma linha# usamos o c+$i%o a se%uir:
System.out.print(variavel);
5l%u)m te obri%a a sempre vali$ar esse C2;C 4oc! po$e# in6meras vezes# esquecer $e chamar esse vali$a$or. "ais: consi$ere que voc! tem JB formul&rios e precise vali$ar em to$os eles o C2;. *e sua equipe tem R pro%rama$ores trabalhan$o nesses formul&rios# quem fica respons&vel por essa vali$a,(oC Ho$osO 5 situa,(o po$e piorar: na entra$a $e um novo $esenvolve$or# precisaramos avis&-lo que sempre $evemos vali$ar o cpf $e um formul&rio. L nesse momento que nascem aqueles %uias $e pro%rama,(o para o $esenvolve$or que for entrar nesse projeto - <s vezes# ) um $ocumento enorme. /m outras palavras# todo $esenvolve$or precisa ficar saben$o $e uma quanti$a$e enorme $e informa,-es# que# na maioria $as vezes# n(o est& realmente relaciona$o < sua parte no sistema# mas ele precisa ler tu$o isso# resultan$o um entrave muito %ran$eO 1utra situa,(o on$e ficam claros os problemas $a pro%rama,(o proce$ural# ) quan$o nos encontramos na necessi$a$e $e ler o c+$i%o que foi escrito por outro $esenvolve$or e $escobrir como ele funciona internamente. 8m sistema bem encapsula$o n(o $everia %erar essa necessi$a$e. /m um sistema %ran$e# simplesmente n(o temos tempo $e ler to$o o c+$i%o e istente. Consi$eran$o que voc! n(o erre nesse ponto e que sua equipe tenha uma comunica,(o muito boa 9perceba que comunica,(o e cessiva po$e ser preju$icial e atrapalhar o an$amento:# ain$a temos outro problema: ima%ine que# em to$o formul&rio# voc! tamb)m quer que a i$a$e $o cliente seja vali$a$a - o cliente precisa ter mais $e 1Y anos. 4amos ter $e colocar um if... mas on$eC /spalha$o por to$o seu c+$i%o... "esmo que se crie outra fun,(o para vali$ar# precisaremos incluir isso nos nossos JB formul&rios j& e istentes. @ual ) a chance $e esquecermos em um $elesC L muito %ran$e. 5 responsabili$a$e $e verificar se o cliente tem ou n(o tem 1Y anos ficou espalha$a por to$o o seu c+$i%o. *eria interessante po$er concentrar essa responsabili$a$e em um lu%ar s+# para n(o ter chances $e esquecer isso.
"elhor ain$a seria se conse%ussemos mu$ar essa vali$a,(o e os outros pro%rama$ores nem precisassem ficar saben$o $isso. /m outras palavras# eles criariam formul&rios e um 6nico pro%rama$or seria respons&vel pela vali$a,(o: os outros nem sabem $a e ist!ncia $esse trecho $e c+$i%o. 'mpossvelC 0(o# o para$i%ma $a orienta,(o a objetos facilita tu$o isso. 1 problema $o para$i%ma proce$ural ) que n(o e iste uma forma simples $e criar cone (o forte entre $a$os e funcionali$a$es. 0o para$i%ma orienta$o a objetos ) muito f&cil ter essa cone (o atrav)s $os recursos $a pr+pria lin%ua%em. Kuais as vanta#ens? 1rienta,(o a objetos vai te aju$ar em muito em se or%anizar e escrever menos# al)m $e concentrar as responsabili$a$es nos pontos certos# fle ibilizan$o sua aplica,(o# encapsulando a l+%ica $e ne%+cios. 1utra enorme vanta%em# on$e voc! realmente vai economizar montanhas $e c+$i%o# ) o polimor-ismo das re-er,ncias# que veremos em um posterior captulo. 0os pr+ imos captulos# conse%uiremos en er%ar to$a essa vanta%em# mas# primeiramente ) necess&rio conhecer um pouco mais $a sinta e e $a cria,(o $e tipos e refer!ncias em .ava.
1 que to$a conta faz e ) importante para n+sC 'sto )# o que %ostaramos $e "pe$ir < conta"C
Com isso# temos o projeto $e uma conta banc&ria. 2o$emos pe%ar esse projeto e acessar seu sal$oC 0(o. 1 que temos ain$a ) o projeto. 5ntes# precisamos construir uma conta# para po$er acessar o que ela tem# e pe$ir a ela que fa,a al%o.
Eepare na fi%ura: apesar $o papel $o la$o esquer$o especificar uma Conta# essa especifica,(o ) uma ContaC 0+s $epositamos e sacamos $inheiro $esse papelC 0(o. 8tilizamos a especifica,(o $a Conta para po$er criar inst[ncias que realmente s(o contas# on$e po$emos realizar as opera,-es que criamos. 5pesar $e $eclararmos que to$a conta tem um sal$o# um n6mero e uma a%!ncia no pe$a,o $e papel 9como < esquer$a na fi%ura:# s(o nas inst[ncias $esse projeto que realmente h& espa,o para armazenar esses valores.
5o projeto $a conta# isto )# a $efini,(o $a conta# $amos o nome $e classe. 5o que po$emos construir a partir $esse projeto# as contas $e ver$a$e# $amos o nome $e objetos. 5 palavra classe vem $a ta onomia $a biolo%ia. Ho$os os seres vivos $e uma mesma classe biol+%ica t!m uma s)rie $e atributos e comportamentos em comum# mas n(o s(o i%uais# po$em variar nos valores $esses atributos e como realizam esses comportamentos. 7omo apiens $efine um %rupo $e seres que possuem caractersticas em comum# por)m a $efini,(o 9a i$eia# o conceito: $e um 7omo apiens ) um ser humanoC 0(o. Hu$o est& especifica$o na classe >omo *apiens# mas se quisermos man$ar al%u)m correr# comer# pular# precisaremos $e uma inst[ncia $e 7omo apiens# ou ent(o $e um objeto $o tipo 7omo apiens. 8m outro e emplo: uma receita $e bolo. 5 per%unta ) certeira: voc! come uma receita $e boloC 0(o. 2recisamos instanci1-la# criar um objeto bolo a partir $essa especifica,(o 9a classe: para utiliz&-la. 2o$emos criar centenas $e bolos a partir $essa classe 9a receita# no caso:# eles po$em ser bem semelhantes# al%uns at) i$!nticos# mas s(o objetos $iferentes. 2o$emos fazer milhares $e analo%ias semelhantes. 5 planta $e uma casa ) uma casaC 3efinitivamente n(o. 0(o po$emos morar $entro $a planta $e uma casa# nem po$emos abrir sua porta ou pintar suas pare$es. 2recisamos# antes# construir inst[ncias a partir $essa planta. /ssas inst[ncias# sim# po$emos pintar# $ecorar ou morar $entro. 2o$e parecer +bvio# mas a $ificul$a$e inicial $o para$i%ma $a orienta,(o a objetos ) justo saber $istin%uir o que ) classe e o que ) objeto. L comum o iniciante utilizar# obviamente $e forma erra$a# essas $uas palavras como sinInimos.
trin# *trin% ) uma classe em .ava. /la %uar$a uma ca$eia $e caracteres# uma frase completa. Como estamos ain$a apren$en$o o que ) uma classe# enten$eremos com $etalhes a classe Strin apenas em captulos posteriores. 2or enquanto# $eclaramos o que to$a conta $eve ter. /stes s(o os atributos que to$a conta# quan$o cria$a# vai ter. Eepare que essas vari&veis foram $eclara$as fora $e um bloco# $iferente $o que fazamos quan$o tinha aquele main. @uan$o uma vari&vel ) $eclara$a $iretamente $entro $o escopo $a classe# ) chama$a $e vari&vel $e objeto# ou atributo.
Bem# o c+$i%o acima cria um objeto $o tipo +onta# mas como acessar esse objeto que foi cria$oC 2recisamos ter al%uma forma $e nos referenciarmos a esse objeto. 2recisamos $e uma vari&vel:
class Pro rama ! pu"lic static voi# main(Strin $% ar s) ! +onta minha+onta; minha+onta G new +onta(); & &
2o$e parecer estranho escrevermos $uas vezes +onta: uma vez na $eclara,(o $a vari&vel e outra vez no uso $o new. "as h& um motivo# que em breve enten$eremos. 5trav)s $a vari&vel minha+onta# po$emos acessar o objeto rec)m cria$o para alterar seu #ono# seu sal#o# etc:
class Pro rama ! pu"lic static voi# main(Strin $% ar s) ! +onta minha+onta; minha+onta G new +onta(); minha+onta.#ono G "Eu0e"; minha+onta.sal#o G /---.-; System.out.println("Sal#o atual, " L minha+onta.sal#o); & &
L importante fi ar que o ponto foi utiliza$o para acessar al%o em minha+onta. 5 minha+onta pertence ao 3uGe# e tem sal$o $e mil reais.
6.9 - 0todos
3entro $a classe# tamb)m $eclararemos o que ca$a conta faz e como isto ) feito - os comportamentos que ca$a classe tem# isto )# o que ela faz. 2or e emplo# $e que maneira que uma Conta saca $inheiroC /specificaremos isso $entro $a pr+pria classe +onta# e n(o em um local $esatrela$o $as informa,-es $a pr+pria Conta. L por isso que essas "fun,-es" s(o chama$as $e mtodos. 2ois ) a maneira $e fazer uma opera,(o com um objeto. @ueremos criar um m)to$o que saca uma $etermina$a quantidade e n(o $evolve nen$uma in-ormao para quem acionar esse m)to$o:
class +onta ! #ou"le salario; (( ... outros atri"utos ...
voi# saca(#ou"le )uanti#a#e) ! #ou"le novoSal#o G this.sal#o * )uanti#a#e; this.sal#o G novoSal#o; & &
5 palavra chave voi# $iz que# quan$o voc! pe$ir para a conta sacar uma quantia# nenhuma informa,(o ser& envia$a $e volta a quem pe$iu. @uan$o al%u)m pe$ir para sacar# ele tamb)m vai $izer quanto quer sacar. 2or isso precisamos $eclarar o m)to$o com al%o $entro $os par!nteses - o que vai a $entro ) chama$o $e ar#umento $o m)to$o 9ou parLmetro:. /ssa vari&vel ) uma vari&vel comum# chama$a tamb)m $e tempor&ria ou local# pois# ao final $a e ecu,(o $esse m)to$o# ela $ei a $e e istir. 3entro $o m)to$o# estamos $eclaran$o uma nova vari&vel. /ssa vari&vel# assim como o ar%umento# vai morrer no fim $o m)to$o# pois este ) seu escopo. 0o momento que vamos acessar nosso atributo# usamos a palavra chave this para mostrar que esse ) um atributo# e n(o uma simples vari&vel. 9veremos $epois que ) opcional: Eepare que# nesse caso# a conta po$e estourar o limite fi a$o pelo banco. "ais para frente# evitaremos essa situa,(o# e $e uma maneira muito ele%ante. 3a mesma forma# temos o m)to$o para $epositar al%uma quantia:
class +onta ! (( ... outros atri"utos e mTto#os ... voi# #eposita(#ou"le )uanti#a#e) ! this.sal#o LG )uanti#a#e; & &
1bserve que n(o usamos uma vari&vel au iliar e# al)m $isso# usamos a abrevia,(o LG para $ei ar o m)to$o bem simples. 1 LG soma quanti$a$e ao valor anti%o $o sal$o e %uar$a no pr+prio sal$o# o valor resultante. 2ara man$ar uma mensa%em ao objeto e pe$ir que ele e ecute um m)to$o# tamb)m usamos o ponto. 1 termo usa$o para isso ) invocao de mtodo. 1 c+$i%o a se%uir saca $inheiro e $epois $eposita outra quantia na nossa conta:
class PestaJl unsMeto#os ! pu"lic static voi# main(Strin $% ar s) ! (( crian#o a conta +onta minha+onta; minha+onta G new +onta(); (( alteran#o os valores #e minha+onta minha+onta.#ono G "Eu0e"; minha+onta.sal#o G /---; (( saca 7-- reais minha+onta.saca(7--); (( #eposita ;-- reais minha+onta.#eposita(;--); System.out.println(minha+onta.sal#o); & &
8ma vez que seu sal$o inicial ) 1BBB reais# se sacarmos =BB reais# $epositarmos JBB reais e imprimirmos o valor $o sal$o# o que ser& impressoC eus livros de tecnolo#ia parecem do sculo passado? Conhe,a a Casa do C*di#o# uma nova e$itora# com autores $e $estaque no merca$o# foco em ebooMs 923;# epub# mobi:# pre,os imbat"veis e assuntos atuais. Com a cura$oria $a Caelum e e celentes autores# ) uma abor$a%em di-erente para livros $e tecnolo%ia no Brasil. Conhe,a os ttulos e a nova proposta# voc! vai %ostar. Casa $o C+$i%o# livros para o pro%rama$or.
&
5 $eclara,(o $o m)to$o mu$ouO 1 m)to$o saca n(o tem voi# na frente. 'sto quer $izer que# quan$o ) acessa$o# ele $evolve al%um tipo $e informa,(o. 0o caso# um "oolean. 5 palavra chave return in$ica que o m)to$o vai terminar ali# retornan$o tal informa,(o.
/ emplo $e uso:
minha+onta.sal#o G /---; "oolean conse ui G minha+onta.saca(7---); if (conse ui) ! System.out.println("+onse ui sacar"); & else ! System.out.println("Do conse ui sacar"); &
"ais a$iante# veremos que al%umas vezes ) mais interessante lan,ar uma e ce,(o 9e#ception: nesses casos. "eu pro%rama po$e manter na mem+ria n(o apenas uma conta# como mais $e uma:
class PestaEuas+ontas ! pu"lic static voi# main(Strin $% ar s) ! +onta minha+onta; minha+onta G new +onta(); minha+onta.sal#o G /---; +onta meuSonho; meuSonho G new +onta(); meuSonho.sal#o G /;-----; & &
1 correto aqui# ) $izer que c/ se refere a um objeto. Bo correto $izer que c/ ) um objeto# pois c/ ) uma vari&vel refer!ncia# apesar $e# $epois $e um tempo# os pro%rama$ores .ava falarem "Henho um objeto c $o tipo Conta"# mas apenas para encurtar a frase "Henho uma re-er,ncia c a um objeto $o tipo Conta". Basta lembrar que# em .ava# uma vari1vel nunca um objeto. 0(o h&# no .ava# uma maneira $e criarmos o que ) conheci$o como "objeto pilha" ou "objeto local"# pois to$o objeto em .ava# sem e ce,(o# ) acessa$o por uma vari&vel refer!ncia. /sse c+$i%o nos $ei a na se%uinte situa,(o:
+onta c/; c/ G new +onta(); +onta c7; c7 G new +onta();
'nternamente# c/ e c7 v(o %uar$ar um n6mero que i$entifica em que posi,(o $a mem+ria aquela +onta se encontra. 3essa maneira# ao utilizarmos o "." para nave%ar# o .ava vai acessar a +onta que se encontra naquela posi,(o $e mem+ria# e n(o uma outra. 2ara quem conhece# ) pareci$o com um ponteiro# por)m voc! n(o po$e manipul&-lo como um n6mero e nem utiliz&-lo para aritm)tica# ela ) tipa$a. 8m outro e emplo:
class Pesta[eferencias ! pu"lic static voi# main(Strin +onta c/ G new +onta(); c/.#eposita(/--); ar s$%) !
@ual ) o resulta$o $o c+$i%o acimaC 1 que aparece ao ro$arC 1 que acontece aquiC 1 opera$or G copia o valor $e uma vari&vel. "as qual ) o valor $a vari&vel c/C L o objetoC 0(o. 0a ver$a$e# o valor %uar$a$o ) a refer!ncia 9endereo: $e on$e o objeto se encontra na mem+ria principal. 0a mem+ria# o que acontece nesse caso:
+onta c/ G new +onta(); +onta c7 G c/;
@uan$o fizemos c7 G c/# c7 passa a fazer refer!ncia para o mesmo objeto que c/ referencia nesse instante. /nt(o# nesse c+$i%o em especfico# quan$o utilizamos c/ ou c7 estamos nos referin$o e atamente ao mesmo objetoO /las s(o $uas refer!ncias $istintas# por)m apontam para o mesmo objetoO Compar&-las com "GG" vai nos retornar true# pois o valor que elas carre%am ) o mesmoO
1utra forma $e perceber# ) que $emos apenas um new# ent(o s+ po$e haver um objeto +onta na mem+ria. AtenoF n(o estamos $iscutin$o aqui a utili$a$e $e fazer uma refer!ncia apontar pro mesmo objeto que outra. /ssa utili$a$e ficar& mais clara quan$o passarmos vari&veis $o tipo refer!ncia como ar%umento para m)to$os. ne5 1 que e atamente faz o newC 1 new e ecuta uma s)rie $e tarefas# que veremos mais a$iante. "as# para melhor enten$er as refer!ncias no .ava# saiba que o new# $epois $e alocar a mem+ria para esse objeto# $evolve uma "flecha"# isto )# um valor $e refer!ncia. @uan$o voc! atribui isso a uma vari&vel# essa vari&vel passa a se referir para esse mesmo objeto. 2o$emos ent(o ver outra situa,(o:
pu"lic static voi# main(Strin +onta c/ G new +onta(); c/.#ono G "Eu0e"; c/.sal#o G 77Z; +onta c7 G new +onta(); c7.#ono G "Eu0e"; c7.sal#o G 77Z; if (c/ GG c7) ! System.out.println("+ontas i uais"); & ar s$%) !
&
1 opera$or GG compara o conte6$o $as vari&veis# mas essas vari&veis n(o %uar$am o objeto# e sim o en$ere,o em que ele se encontra. Como em ca$a uma $essas vari&veis %uar$amos $uas contas cria$as $iferentemente# elas est(o em espa,os $iferentes $a mem+ria# o que faz o teste no if valer false. 5s contas po$em ser equivalentes no nosso crit)rio $e i%ual$a$e# por)m elas n(o s(o o mesmo objeto. @uan$o se trata $e objetos# po$e ficar mais f&cil pensar que o GG compara se os objetos 9refer!ncias# na ver$a$e: s(o o mesmo# e n(o se s(o i%uais.
2ara saber se $ois objetos t!m o mesmo conte6$o# voc! precisa comparar atributo por atributo. 4eremos uma solu,(o mais ele%ante para isso tamb)m.
&
voi# transfere(+onta #estinoF #ou"le valor) ! this.sal#o G this.sal#o * valor; #estino.sal#o G #estino.sal#o L valor; &
2ara $ei ar o c+$i%o mais robusto# po$eramos verificar se a conta possui a quanti$a$e a ser transferi$a $isponvel. 2ara ficar ain$a mais interessante# voc! po$e chamar os m)to$os #eposita e saca j& e istentes para fazer essa tarefa:
class +onta ! (( atri"utos e mTto#os... "oolean transfere(+onta #estinoF #ou"le valor) ! "oolean retirou G this.saca(valor); if (retirou GG false) ! (( no #eu pra sacar! return false; & else ! #estino.#eposita(valor); return true; & &
&
@uan$o passamos uma +onta como ar%umento# o que ser& que acontece na mem+riaC *er& que o objeto ) clonadoC 0o .ava# a passa%em $e par[metro funciona como uma simples atribui,(o como no uso $o "S". /nt(o# esse par[metro vai copiar o valor $a vari&vel $o tipo +onta que for passa$o como ar%umento. / qual ) o valor $e uma vari&vel $essasC *eu valor ) um en$ere,o# uma refer!ncia# nunca um objeto. 2or isso n(o h& c+pia $e objetos aqui. /sse 6ltimo c+$i%o po$eria ser escrito com uma sinta e muito mais sucinta. ComoC &rans-ere Eara 2erceba que o nome $este m)to$o po$eria ser transferePara ao inv)s $e s+ transfere. 5 chama$a $o m)to$o fica muito mais natural# ) possvel ler a frase em portu%u!s que ela tem um senti$o:
conta/.transferePara(conta7F ;-);
5 leitura $este c+$i%o seria "+onta/ transfere para conta7 JB reais". A#ora a mel$or $ora de aprender al#o novo
*e voc! %osta $e estu$ar essa apostila aberta $a Caelum# certamente vai %ostar $os novos cursos online que lan,amos na plataforma Alura. 4oc! estu$a a qualquer momento com a qualidade
0esse caso# quan$o voc! criar uma conta# seus atributos j& est(o "popula$os" com esses valores coloca$os. 'ma%ine que comecemos a aumentar nossa classe +onta e a$icionar nomeF so"renome e cpf $o cliente $ono $a conta. Come,aramos a ter muitos atributos... e# se voc! pensar $ireito# uma +onta n(o tem nome# nem so"renome nem cpf# quem tem esses atributos ) um +liente. /nt(o po$emos criar uma nova classe e fazer uma composi,(o *eus atributos tamb)m po$em ser refer!ncias para outras classes. *uponha a se%uinte classe +liente:
class +liente ! Strin nome; Strin so"renome; Strin cpf; & class +onta ! int numero; #ou"le sal#o; #ou"le limite; +liente titular; (( .. &
5qui# simplesmente houve uma atribui,(o. 1 valor $a vari&vel c ) copia$o para o atributo titular $o objeto ao qual minha+onta se refere. /m outras palavras# minha+onta tem uma refer!ncia ao mesmo +liente que c se refere# e po$e ser acessa$o atrav)s $e minha+onta.titular. 4oc! po$e realmente nave%ar sobre to$a essa estrutura $e informa,(o# sempre usan$o o ponto:
1u ain$a# po$e fazer isso $e uma forma mais $ireta e at) mais ele%ante:
minha+onta.titular.nome G "Eu0e";
8m sistema orienta$o a objetos ) um %ran$e conjunto $e classes que vai se comunicar# $ele%an$o responsabili$a$es para quem for mais apto a realizar $etermina$a tarefa. 5 classe Sanco usa a classe +onta que usa a classe +liente# que usa a classe Cn#ereco. 3izemos que esses objetos colaboram# trocan$o mensa%ens entre si. 2or isso acabamos ten$o muitas classes em nosso sistema# e elas costumam ter um tamanho relativamente curto. "as# e se $entro $o meu c+$i%o eu n(o $esse new em +liente e tentasse acess&-lo $iretamenteC
class Peste ! pu"lic static voi# main(Strin $% ar s) ! +onta minha+onta G new +onta(); minha+onta.titular.nome G "Manoel"; (( ...
& &
@uan$o $amos new em um objeto# ele o inicializa com seus valores $efault# B para n6meros# false para "oolean e null para refer!ncias. null ) uma palavra chave em java# que in$ica uma refer!ncia para nenhum objeto.
*e# em al%um caso# voc! tentar acessar um atributo ou m)to$o $e al%u)m que est& se referencian$o para null# voc! receber& um erro $urante a e ecu,(o 9DullPointerCAception# que veremos mais < frente:. 3a para perceber# ent(o# que o new n(o traz um efeito cascata# a menos que voc! $! um valor $efault 9ou use construtores# que tamb)m veremos mais a frente::
class +onta ! int numero; #ou"le sal#o; #ou"le limite; +liente titular G new +liente(); (( )uan#o chamarem new +ontaF ((havera um new +liente para ele. &
Com esse c+$i%o# to$a nova +onta cria$a j& ter& um novo +liente associa$o# sem necessi$a$e $e instanci&-lo lo%o em se%ui$a $a instancia,(o $e uma +onta. @ual alternativa voc! $eve usarC 3epen$e $o caso: para to$a nova +onta voc! precisa $e um novo +lienteC L essa per%unta que $eve ser respon$i$a. 0esse nosso caso a resposta ) n(o# mas $epen$e $o nosso problema. AtenoF para quem n(o est& acostuma$o com refer!ncias# po$e ser bastante confuso pensar sempre em como os objetos est(o na mem+ria para po$er tirar as conclus-es $e o que ocorrer& ao e ecutar $etermina$o c+$i%o# por mais simples que ele seja. Com tempo# voc! a$quire a habili$a$e $e rapi$amente saber o efeito $e atrelar as refer!ncias# sem ter $e %astar muito tempo para isso. L importante# nesse come,o# voc! estar sempre pensan$o no esta$o $a mem+ria. / realmente lembrar que# no .ava 'uma vari vel nunca carrega um objeto& e sim uma re"er(ncia para ele' facilita muito.
&
& &
Strin &
tipo;
class +arro ! Strin cor; Strin mo#elo; #ou"le veloci#a#eJtual; #ou"le veloci#a#eMaAima; Motor motor; (( .. &
2o$emos# criar $iversos Carros e me er com seus atributos e m)to$os# assim como fizemos no e emplo $o Sanco.
@ueren$o apren$er ain$a mais sobre .ava e boas pr&ticas $e orienta,(o a objetosC /sclarecer $6vi$as $os e ercciosC 1uvir e plica,-es $etalha$as com um instrutorC 5 Caelum oferece o curso /J-11 presencial nas ci$a$es $e *(o 2aulo# Eio $e .aneiro e Braslia# al)m $e turmas incompanD. Consulte as vanta%ens $o curso Java e Orientao a Objetos.
passa$o como ar%umento. Crie tamb)m um m)to$o calcula\anhoJnual# que n(o recebe par[metro al%um# $evolven$o o valor $o sal&rio multiplica$o por 1=.. 5 i$eia aqui ) apenas mo$elar# isto )# s+ i$entifique que informa,-es s(o importantes e o que um funcion&rio faz. 3esenhe no papel tu$o o que um 8uncionario tem e tu$o que ele faz. =. Hransforme o mo$elo acima em uma classe .ava. Heste-a# usan$o uma outra classe que tenha o main. 4oc! $eve criar a classe $o funcion&rio com o nome 8uncionario# mas po$e nomear como quiser a classe $e testes. 5 $e teste $eve possuir o m)to$o main. 8m esbo,o $a classe:
class 8uncionario ! #ou"le salario; (( seus outros atri"utos e mTto#os voi# rece"eJumento(#ou"le aumento) ! (( o )ue faMer a)ui #entro] & #ou"le calcula\anhoJnual() ! (( o )ue faMer a)ui #entro] &
&
4oc! po$e 9e $eve: compilar seu arquivo java sem que voc! ain$a tenha termina$o sua classe 8uncionario. 'sso evitar& que voc! receba $ezenas $e erros $e compila,(o $e uma vez s+. Crie a classe 8uncionario# coloque seus atributos e# antes $e colocar qualquer m)to$o# compile o arquivo java. 1 arquivo 8uncionario.class ser& %era$o# mas n(o po$emos "e ecut&-lo" j& que essa classe n(o tem um main. 3e qualquer forma# a vanta%em ) que assim verificamos que nossa classe 8uncionario j& est& toman$o forma e est& escrita em sinta e correta.
/sse ) um processo incremental. 2rocure $esenvolver assim seus e erccios# para n(o $escobrir s+ no fim $o caminho que al%o estava muito erra$o. 8m esbo,o $a classe que possui o main:
class Pesta8uncionario ! pu"lic static voi# main(Strin $% ar s) ! 8uncionario f/ G new 8uncionario(); f/.nome G "^u o"; f/.salario G /--; f/.rece"eJumento(;-); System.out.println("salario atual," L f/.salario); System.out.println(" anho anual," L f/.calcula\anhoJnual()); & &
'ncremente essa classe. ;a,a outros testes# imprima outros atributos e invoque os m)to$os que voc! criou a mais. Fembre-se $e se%uir a conven,(o java# isso ) importantssimo. 'sto )# preste aten,(o nas
mai6sculas e min6sculas# se%uin$o o se%uinte e emplo: nomeEeJtri"uto# nomeEeMeto#o# nomeEe5ariavel# DomeEe+lasse# etc... &odas as classes no mesmo arquivo? 4oc! at) po$e colocar to$as as classes no mesmo arquivo e apenas compilar esse arquivo. /le vai %erar um .class para ca$a classe presente nele. 2or)m# por uma quest(o $e or%aniza,(o# ) boa pr&tica criar um arquivo .'ava para ca$a classe. /m captulos posteriores# veremos tamb)m $etermina$os casos nos quais voc! ser& obri#ado a $eclarar ca$a classe em um arquivo separa$o. /ssa separa,(o n(o ) importante nesse momento $o apren$iza$o# mas se quiser ir pratican$o sem ter que compilar classe por classe# voc! po$e $izer para o 'avac compilar to$os os arquivos java $e uma vez:
'avac H.'ava
R. Crie um m)to$o mostra()# que n(o recebe nem $evolve par[metro al%um e simplesmente imprime to$os os atributos $o nosso funcion&rio. 3essa maneira# voc! n(o precisa ficar copian$o e colan$o um monte $e System.out.println() para ca$a mu$an,a e teste que fizer com ca$a um $e seus funcion&rios# voc! simplesmente vai fazer:
8uncionario f/ G new 8uncionario(); (( "rinca#eiras com f/.... f/.mostra();
4eremos mais a frente o m)to$o toStrin # que ) uma solu,(o muito mais ele%ante para mostrar a representa,(o $e um objeto como Strin # al)m $e n(o jo%ar tu$o pro System.out 9s+ se voc! $esejar:. 1 esqueleto $o m)to$o ficaria assim:
class 8uncionario ! (( seus outros atri"utos e mTto#os voi# mostra() ! System.out.println("Dome, " L this.nome); (( imprimir a)ui os outros atri"utos... (( tam"Tm po#e imprimir this.calcula\anhoJnual() & &
K. Construa $ois funcion&rios com o new e compare-os com o GG. / se eles tiverem os mesmos atributosC 2ara isso voc! vai precisar criar outra refer!ncia:
8uncionario f/ G new 8uncionario(); f/.nome G "Eanilo"; f/.salario G /--; 8uncionario f7 G new 8uncionario(); f7.nome G "Eanilo"; f7.salario G /--; if (f/ GG f7) ! System.out.println("i uais"); & else ! System.out.println("#iferentes"); &
J. Crie $uas refer!ncias para o mesmo funcion&rio# compare-os com o GG. Hire suas conclus-es. 2ara criar $uas refer!ncias pro mesmo funcion&rio:
8uncionario f/ G new 8uncionario(), f/.nome G "^u o"; f/.salario G /--; 8uncionario f7 G f/;
1 que acontece com o if $o e erccio anteriorC Q. 9opcional: /m vez $e utilizar uma Strin para representar a $ata# crie uma outra classe# chama$a Eata. /la possui R campos int# para $ia# m!s e ano. ;a,a com que seu funcion&rio passe a us&-la. 9) pareci$o com o 6ltimo e emplo# em que a +onta passou a ter refer!ncia para um +liente:.
class 8uncionario ! Eata #ataEeCntra#a; (( )ual T o valor #efault a)ui] (( seus outros atri"utos e mTto#os & class int int int & Eata ! #ia; mes; ano;
"o$ifique sua classe Pesta8uncionario para que voc! crie uma Eata e atribua ela ao 8uncionario:
8uncionario f/ G new 8uncionario(); ((... Eata #ata G new Eata(); (( li ao! f/.#ataEeCntra#a G #ata;
;a,a o $esenho $o esta$o $a mem+ria quan$o criarmos um 8uncionario. N. 9opcional: "o$ifique seu m)to$o mostra para que ele imprima o valor $a #ataEeCntra#a $aquele 8uncionario:
class 8uncionario ! (( seus outros atri"utos e mTto#os Eata #ataEeCntra#a; voi# mostra() ! System.out.println("Dome, " L this.nome); (( imprimir a)ui os outros atri"utos... System.out.println("Eia, " L this.#ataEeCntra#a.#ia); System.out.println("MXs, " L this.#ataEeCntra#a.mes); System.out.println("Jno, " L this.#ataEeCntra#a.ano); & &
Heste-o. 1 que acontece se chamarmos o m)to$o mostra antes $e atribuirmos uma $ata para este 8uncionarioC Y. 9opcional: 1 que acontece se voc! tentar acessar um atributo $iretamente na classeC Como# por e emplo:
8uncionario.salario G /7:6;
;az senti$o per%untar para o esquema $o ;uncionario seu valor anualC A. 9opcional-avan,a$o: Crie um m)to$o na classe Eata que $evolva o valor formata$o $a $ata# isto )# $evolva uma *trin% com "$ia/mes/ano". 'sso para que o m)to$o mostra $a classe 8uncionario possa ficar assim:
class 8uncionario ! (( atri"utos e meto#os voi# mostra() ! (( imprime outros atri"utos... System.out.println("Eata #e entra#a, " L this.#ataEeCntra#a.formata#a()); & &
6.1% - >esa-ios
1. 8m m)to$o po$e chamar ele mesmo. Chamamos isso $e recurso. 4oc! po$e resolver a s)rie $e ;ibonacci usan$o um m)to$o que chama ele mesmo. 1 objetivo ) voc! criar uma classe# que possa ser usa$a $a se%uinte maneira:
8i"onacci fi"onacci G new 8i"onacci(); for (int i G /; i 3G N; iLL) ! int resulta#o G fi"onacci.calcula8i"onacci(i); System.out.println(resulta#o); &
5qui imprimir& a sequ!ncia $e ;ibonacci at) a se ta posi,(o# isto ): 1# 1# =# R# J# Y. /ste m)to$o calcula8i"onacci n(o po$e ter nenhum la,o# s+ po$e chamar ele mesmo como m)to$o. 2ense nele como uma fun,(o# que usa a pr+pria fun,(o para calcular o resulta$o. =. 2or que o mo$o acima ) e tremamente mais lento para calcular a s)rie $o que o mo$o iterativo 9que se usa um la,o:C R. /screva o m)to$o recursivo novamente# usan$o apenas uma linha. 2ara isso# pesquise sobre o operador condicional tern1rio. 9ternarD operator:
Crie uma pessoa# coloque seu nome e i$a$e iniciais# fa,a al%uns anivers&rios 9aumentan$o a
Crie uma porta# abra e feche a mesma# pinte-a $e $iversas cores# altere suas $imens-es e use o m)to$o estaJ"erta para verificar se ela est& aberta. R. 2ro%rama R
+lasse, +asa Jtri"utos, corF porta/F porta7F porta: MTto#o, voi# pinta(Strin s)F int )uantasPortasCstaoJ"ertas()
Crie uma casa e pinte-a. Crie tr!s portas e coloque-as na casa? abra e feche as mesmas como $esejar. 8tilize o m)to$o )uantasPortasCstaoJ"ertas para imprimir o n6mero $e portas abertas. Captulo J
)m pouco de arra2s
"1 homem esquecer& antes a morte $o pai que a per$a $a proprie$a$e" 5o t)rmino $esse captulo# voc! ser& capaz $e: $eclarar e instanciar arraDs? popular e percorrer arraDs.
9.1 - O problema
3entro $e um bloco# po$emos $eclarar $iversas vari&veis e us&-las:
int int int int i#a#e/; i#a#e7; i#a#e:; i#a#e6;
'sso po$e se tornar um problema quan$o precisamos mu$ar a quanti$a$e $e vari&veis a serem $eclara$as $e acor$o com um par[metro. /sse par[metro po$e variar# como por e emplo# a quanti$a$e $e n6mero conti$os num bilhete $e loteria. 8m jo%o simples possui Q n6meros# mas po$emos comprar um bilhete mais caro# com N n6meros ou mais. 2ara facilitar esse tipo $e caso po$emos $eclarar um vetor Harra2I $e inteiros:
int$% i#a#es;
1 int$% ) um tipo. 8ma arraD ) sempre um objeto# portanto# a vari&vel i$a$es ) uma refer!ncia. 4amos precisar criar um objeto para po$er usar a arraD. Como criamos o objeto-arraDC
i#a#es G new int$/-%;
1 que fizemos foi criar uma arraD $e int $e 1B posi,-es e atribuir o en$ere,o no qual ela foi cria$a. 2o$emos ain$a acessar as posi,-es $o arraD:
i#a#es$;% G /-;
1 c+$i%o acima altera a se ta posi,(o $o arraD. 0o .ava# os n$ices $o arraD v(o $e B a n-1# on$e n ) o tamanho $a$o no momento em que voc! criou o arraD. *e voc! tentar acessar uma posi,(o fora $esse alcance# um erro ocorrer& $urante a e ecu,(o.
Arra2s - um problema no aprendi.ado de muitas lin#ua#ens 5pren$er a usar arraDs po$e ser um problema em qualquer lin%ua%em. 'sso porque envolve uma s)rie $e conceitos# sinta e e outros. 0o .ava# muitas vezes utilizamos outros recursos em vez $e arraDs# em especial os pacotes $e cole,-es $o .ava# que veremos no captulo 11. 2ortanto# fique tranquilo caso n(o consi%a $i%erir to$a sinta e $as arraDs num primeiro momento. 0o caso $o bilhete $e loteria# po$emos utilizar o mesmo recurso. "ais ain$a# a quanti$a$e $e n6meros $o nosso bilhete po$e ser $efini$o por uma vari&vel. Consi$ere que n in$ica quantos n6meros nosso bilhete ter&# po$emos ent(o fazer:
int numerosEoSilhete$% G new int$n%;
@uantas contas foram cria$as aquiC 0a ver$a$e# nen$uma. ;oram cria$os 1B espa,os que voc! po$e utilizar para %uar$ar uma refer!ncia a uma Conta. 2or enquanto# eles se referenciam para lu%ar nenhum 9null:. *e voc! tentar:
System.out.println(minhas+ontas$-%.sal#o);
8m erro $urante a e ecu,(o ocorrer&O 2ois# na primeira posi,(o $a arraD# n(o h& uma refer!ncia para uma conta# nem para lu%ar nenhum. 4oc! $eve popular sua arraD antes.
+onta contaDova G new +onta(); contaDova.sal#o G /---.-; minhas+ontas$-% G contaDova;
8ma arraD $e tipos primitivos %uar$a valores# uma arraD $e objetos %uar$a refer!ncias.
/$itoras tra$icionais pouco li%am para ebooGs e novas tecnolo%ias. 0(o conhecem pro%rama,(o para revisar os livros tecnicamente a fun$o. 0(o t!m anos $e e peri!ncia em $i$&ticas com cursos. Conhe,a a Casa do C*di#o# uma e$itora $iferente# com cura$oria $a Caelum e obsess(o por livros $e quali$a$e a pre,os justos. Casa $o C+$i%o# ebooG com pre,o $e ebooG.
5t) on$e o for $eve irC Ho$a arraD em .ava tem um atributo que se chama len th# e voc! po$e acess&-lo para saber o tamanho $o arraD ao qual voc! est& se referencian$o naquele momento:
voi# imprimeJrray(int$% array) ! for (int i G -; i 3 array.len th; iLL) ! System.out.println(array$i%); & &
Arra2s no podem mudar de taman$o 5 partir $o momento que uma arraD foi cria$a# ela no pode mu$ar $e tamanho. *e voc! precisar $e mais espa,o# ser& necess&rio criar uma nova arraD e# antes $e se referir ela# copie os elementos $a arraD velha.
int$% i#a#es G new int$/-%; for (int i G -; i 3 /-; iLL) ! i#a#es$i% G i H /-; & (( imprimin#o to#a a array for (int A , i#a#es) ! System.out.println(A); & & &
0(o precisamos mais $o len th para percorrer matrizes cujo tamanho n(o conhecemos:
class Jl uma+lasse ! voi# imprimeJrray(int$% array) ! for (int A , array) ! System.out.println(A); & & &
1 mesmo ) v&li$o para arraDs $e refer!ncias. /sse for na$a mais ) que um truque $e compila,(o para facilitar essa tarefa $e percorrer arraDs e torn&-la mais le%vel.
=. 5 Cmpresa $eve ter um m)to$o a#iciona# que recebe uma refer!ncia a 8uncionario como ar%umento e %uar$a esse funcion&rio. 5l%o como:
voi# a#iciona(8uncionario f) ! (( al o tipo, (( this.empre a#os$ ]]] % G f; (( mas )ue posio colocar] &
4oc! $eve inserir o 8uncionario em uma posi,(o $a arraD que esteja livre. / istem v&rias maneiras para voc! fazer isso: %uar$ar um conta$or para in$icar qual a pr+ ima posi,(o vazia ou procurar por uma posi,(o vazia to$a vez. 1 que seria mais interessanteC L importante reparar que o m)to$o a$iciona n(o recebe nome# r%# sal&rio# etc. /ssa seria uma maneira nem um pouco estrutura$a# muito menos orienta$a a objetos $e se trabalhar. 4oc! antes cria um 8uncionario e j& passa a refer!ncia $ele# que $entro $o objeto possui r%# sal&rio# etc. R. Crie uma classe PestaCmpresa que possuir& um m)to$o main. 3entro $ele crie al%umas inst[ncias $e 8uncionario e passe para a empresa pelo m)to$o a#iciona. Eepare que antes voc! vai precisar criar a arraD# pois inicialmente o atributo empre a#os $a classe Cmpresa n(o referencia lu%ar nenhum 9seu valor ) null::
1u voc! po$e construir a arraD $entro $a pr+pria $eclara,(o $a classe Cmpresa# fazen$o com que to$a vez que uma Cmpresa ) instancia$a# a arraD $e 8uncionario que ela necessita tamb)m ) cria$a. Crie al%uns funcion&rios e passe como ar%umento para o a#iciona $a empresa:
8uncionario f/ G new 8uncionario(); f/.salario G /---; empresa.a#iciona(f/); 8uncionario f7 G new 8uncionario(); f7.salario G /Z--; empresa.a#iciona(f7);
4oc! po$e criar esses funcion&rios $entro $e um loop e $ar a ca$a um $eles valores $iferentes $e sal&rios:
for (int i G -; i 3 ;; iLL) ! 8uncionario f G new 8uncionario(); f.salario G /--- L i H /--; empresa.a#iciona(f); &
Eepare que temos $e instanciar 8uncionario $entro $o la,o. *e a instancia,(o $e 8uncionario ficasse acima $o la,o# estaramos a$iciona$o cinco vezes a mesma inst[ncia $e 8uncionario nesta Cmpresa e apenas mu$an$o seu sal&rio a ca$a itera,(o# que nesse caso n(o ) o efeito $eseja$o. 1pcional: o m)to$o a#iciona po$e %erar uma mensa%em $e erro in$ican$o quan$o o arraD j& est& cheio. K. 2ercorra o atributo empre a#os $a sua inst[ncia $a Cmpresa e imprima os sal&rios $e to$os seus funcion&rios. 2ara fazer isso# voc! po$e criar um m)to$o chama$o mostraCmpre a#os $entro $a classe Cmpresa:
voi# mostraCmpre a#os() ! for (int i G -; i 3 this.empre a#os.len th; iLL) ! System.out.println("8uncionIrio na posio, " L i); (( preencher para mostrar outras informacoes #o funcionario & &
Cui$a$o ao preencher esse m)to$o: al%uns n$ices $o seu arraD po$em n(o conter refer!ncia para um 8uncionario constru$o# isto )# ain$a se referirem para null. *e preferir# use o for novo $o java J.B. 5# atrav)s $o seu main# $epois $e a$icionar al%uns funcion&rios# basta fazer:
empresa.mostraCmpre a#os();
J. 9opcional: /m vez $e mostrar apenas o sal&rio $e ca$a funcion&rio# voc! po$e chamar o m)to$o mostra() $e ca$a 8uncionario $a sua arraD. Q. 91pcional: Crie um m)to$o para verificar se um $etermina$o 8uncionario se encontra ou n(o como funcion&rio $esta empresa:
"oolean contem(8uncionario f) !
(( ... &
4oc! vai precisar fazer um for na sua arraD e verificar se a refer!ncia passa$a como ar%umento se encontra $entro $a arraD. /vite ao m& imo usar n6meros har$-co$e$# isto )# use o .len th ou o atributo livre. N. 91pcional: Caso a arraD j& esteja cheia no momento $e a$icionar um outro funcion&rio# criar uma nova maior e copiar os valores. 'sto )# fazer a realoca,(o j& que java n(o tem isso: uma arraD nasce e morre com o mesmo len%th. )sando o t$is para passar ar#umento 3entro $e um m)to$o# voc! po$e usar a palavra this para referenciar a si mesmo e po$e passar essa refer!ncia como ar%umento. J1 con$ece os cursos online Alura?
5 Alura oferece $ezenas $e cursos online em sua plataforma e clusiva $e ensino que favorece o apren$iza$o com a qualidade reconheci$a $a Caelum. 4oc! po$e escolher um curso nas &reas $e .ava# EubD# Peb# "obile# .0/H e outros# com uma assinatura que $& acesso a to$os os cursos. Conhe,a os cursos online 5lura.
/ nossa classe:
class Peste ! pu"lic static voi# main (Strin $% ar s) ! for(Strin ar umento, ar s) ! System.out.println(ar umento); & & &
'sso imprimir&:
ar umento/ outro
maisoutro
9.@ - >esa-ios
1. 0o captulo anterior# voc! $eve ter repara$o que a vers(o recursiva para o problema $e ;ibonacci ) lenta porque to$a hora estamos recalculan$o valores. ;a,a com que a vers(o recursiva seja t(o boa quanto a vers(o iterativa. 93ica: use arraDs para isso:
5 classe a se%uir mostra como ) possvel ultrapassar o limite usan$o o m)to$o saca:
class Pesta+ontaCstouro/ ! pu"lic static voi# main(Strin ar s$%) ! +onta minha+onta G new +onta(); minha+onta.sal#o G /---.-; minha+onta.limite G /---.-; minha+onta.saca(;----); (( sal#o L limite T sR 7---!! & &
2o$emos incluir um if $entro $o nosso m)to$o saca() para evitar a situa,(o que resultaria em uma conta em esta$o inconsistente# com seu sal$o abai o $o limite. ;izemos isso no captulo $e orienta,(o a objetos b&sica. 5pesar $e melhorar bastante# ain$a temos um problema mais %rave: nin%u)m %arante que o usu&rio $a classe vai sempre utilizar o m)to$o para alterar o sal$o $a conta. 1 c+$i%o a se%uir ultrapassa o limite $iretamente:
class Pesta+ontaCstouro7 ! pu"lic static voi# main(Strin ar s$%) ! +onta minha+onta G new +onta(); minha+onta.limite G /--; minha+onta.sal#o G *7--; ((sal#o estI a"aiAo #os /-- #e limite & &
Como evitar issoC 8ma i$eia simples seria testar se n(o estamos ultrapassan$o o limite to$a vez que formos alterar o sal$o:
class Pesta+ontaCstouro: ! pu"lic static voi# main(Strin ar s$%) ! (( a +onta +onta minha+onta G new +onta(); minha+onta.limite G /--; minha+onta.sal#o G /--; (( )uero mu#ar o sal#o para *7-#ou"le novoSal#o G *7--; (( testa se o novoSal#o ultrapassa o limite #a conta if (novoSal#o 3 *minha+onta.limite) ! (( System.out.println("Do posso mu#ar para esse sal#o"); & else ! minha+onta.sal#o G novoSal#o; &
& &
/sse c+$i%o iria se repetir ao lon%o $e to$a nossa aplica,(o e# pior# al%u)m po$e esquecer $e fazer essa compara,(o em al%um momento# $ei an$o a conta na situa,(o inconsistente. 5 melhor forma $e resolver isso seria for,ar quem usa a classe +onta a invocar o m)to$o saca e n(o permitir o acesso $ireto ao atributo. L o mesmo caso $a vali$a,(o $e C2;. 2ara fazer isso no .ava# basta $eclarar que os atributos n(o po$em ser acessa$os $e fora $a classe atrav)s $a palavra chave private:
class +onta ! private #ou"le sal#o; private #ou"le limite;
(( ... &
private ) um modi-icador de acesso 9tamb)m chama$o $e modi-icador de visibilidade:. "arcan$o um atributo como priva$o# fechamos o acesso ao mesmo em rela,(o a to$as as outras classes# fazen$o com que o se%uinte c+$i%o n(o compile:
class PestaJcessoEireto ! pu"lic static voi# main(Strin ar s$%) ! +onta minha+onta G new +onta(); ((no compila! vocX no po#e acessar o atri"uto priva#o #e outra classe minha+onta.sal#o G /---; & & PesteJcessoEireto.'ava,; sal#o has private access in +onta minha+onta.sal#o G /---; B / error
0a orienta,(o a objetos# ) pr&tica quase que obri%at+ria prote%er seus atributos com private. 9$iscutiremos outros mo$ifica$ores $e acesso em outros captulos:. Ca$a classe ) respons&vel por controlar seus atributos# portanto ela $eve jul%ar se aquele novo valor ) v&li$o ou n(oO /sta vali$a,(o n(o $eve ser controla$a por quem est& usan$o a classe e sim por ela mesma# centralizan$o essa responsabili$a$e e facilitan$o futuras mu$an,as no sistema. "uitas outras vezes nem mesmo queremos que outras classes saibam $a e ist!ncia $e $etermina$o atributo# escon$en$o-o por completo# j& que ele $iz respeito ao funcionamento interno $o objeto. Eepare que# quem invoca o m)to$o saca n(o faz a menor i$eia $e que e iste um limite que est& sen$o checa$o. 2ara quem for usar essa classe# basta saber o que o m)to$o faz e n(o como e atamente ele o faz 9o que um m)to$o faz ) sempre mais importante $o que como ele faz: mu$ar a implementa,(o ) f&cil# j& mu$ar a assinatura $e um m)to$o vai %erar problemas:. 5 palavra chave private tamb)m po$e ser usa$a para mo$ificar o acesso a um m)to$o. Hal funcionali$a$e ) utiliza$a em $iversos cen&rios: quan$o e iste um m)to$o que serve apenas para au iliar a pr+pria classe e quan$o h& c+$i%o repeti$o $entro $e $ois m)to$os $a classe s(o os mais comuns. *empre $evemos e pIr o mnimo possvel $e funcionali$a$es# para criar um bai o acoplamento entre as nossas classes. 3a mesma maneira que temos o private# temos o mo$ifica$or pu"lic# que permite a to$os acessarem um $etermina$o atributo ou m)to$o :
class +onta ! ((... pu"lic voi# saca(#ou"le )uanti#a#e) ! ((posso sacar atT sal#oLlimite if ()uanti#a#e 4 this.sal#o L this.limite)! System.out.println("Do posso sacar fora #o limite!"); & else ! this.sal#o G this.sal#o * )uanti#a#e; & & &
= quando no $1 modi-icador de acesso? 5t) a%ora# tnhamos $eclara$o vari&veis e m)to$os sem nenhum mo$ifica$or como private e
pu"lic. @uan$o isto acontece# o seu m)to$o ou atributo fica num esta$o $e visibili$a$e interme$i&rio entre o private e o pu"lic# que veremos mais pra frente# no captulo $e pacotes. L muito comum# e faz to$o senti$o# que seus atributos sejam private e quase to$os seus m)to$os sejam pu"lic 9n(o ) uma re%raO:. 3esta forma# to$a conversa $e um objeto com outro ) feita por troca $e mensa%ens# isto )# acessan$o seus m)to$os. 5l%o muito mais e$uca$o que me er $iretamente em um atributo que n(o ) seuO "elhor ain$aO 1 $ia em que precisarmos mu$ar como ) realiza$o um saque na nossa classe +onta# a$ivinhe on$e precisaramos mo$ificarC 5penas no m)to$o saca# o que faz pleno senti$o. Como e emplo# ima%ine cobrar C2"; $e ca$a saque: basta voc! mo$ificar ali# e nenhum outro c+$i%o# fora a classe +onta# precisar& ser recompila$o. "ais: as classes que usam esse m)to$o nem precisam ficar saben$o $e tal mo$ifica,(oO 4oc! precisa apenas recompilar aquela classe e substituir aquele arquivo .class. 7anhamos muito em escon$er o funcionamento $o nosso m)to$o na hora $e $ar manuten,(o e fazer mo$ifica,-es.
<.2 - =ncapsulamento
1 que come,amos a ver nesse captulo ) a i$eia $e encapsular# isto )# escon$er to$os os membros $e uma classe 9como vimos acima:# al)m $e escon$er como funcionam as rotinas 9no caso m)to$os: $o nosso sistema. /ncapsular ) -undamental para que seu sistema seja suscetvel a mu$an,as: n(o precisaremos mu$ar uma re%ra $e ne%+cio em v&rios lu%ares# mas sim em apenas um 6nico lu%ar# j& que essa re%ra est& encapsulada. 9veja o caso $o m)to$o saca:
1 conjunto $e m)to$os p6blicos $e uma classe ) tamb)m chama$o $e inter-ace da classe# pois esta ) a 6nica maneira a qual voc! se comunica com objetos $essa classe. Ero#ramando voltado para a inter-ace e no para a implementao L sempre bom pro%ramar pensan$o na interface $a sua classe# como seus usu&rios a estar(o utilizan$o# e n(o somente em como ela vai funcionar. 5 implementa,(o em si# o conte6$o $os m)to$os# n(o tem tanta import[ncia para o usu&rio $essa classe# uma vez que ele s+ precisa saber o que ca$a m)to$o preten$e fazer# e n(o como ele faz# pois isto po$e mu$ar com o tempo. /ssa frase vem $o livro 3esi%n 2atterns# $e /ric 7amma et al. 8m livro cultua$o no meio $a orienta,(o a objetos. *empre que vamos acessar um objeto# utilizamos sua interface. / istem $iversas analo%ias f&ceis no mun$o real: @uan$o voc! $iri%e um carro# o que te importa s(o os pe$ais e o volante 9interface: e n(o o motor que voc! est& usan$o 9implementa,(o:. L claro que um motor $iferente po$e te $ar melhores resulta$os# mas o que ele -a. ) o mesmo que um motor menos potente# a $iferen,a est& em como ele -a.. 2ara trocar um carro a &lcool para um a %asolina voc! n(o precisa reapren$er a $iri%irO 9trocar a implementa,(o $os m)to$os n(o precisa mu$ar a interface# fazen$o com que as outras classes continuem usan$o eles $a mesma maneira:. Ho$os os celulares fazem a mesma coisa 9interface:# eles possuem maneiras 9m)to$os: $e $iscar# li%ar# $esli%ar# aten$er# etc. 1 que mu$a ) como eles fazem 9implementa,(o:# mas repare que para o usu&rio comum pouco importa se o celular ) 7*" ou C3"5# isso fica encapsula$o na implementa,(o 9que aqui s(o os circuitos:.
.& temos conhecimentos suficientes para resolver aquele problema $a vali$a,(o $e C2;:
class +liente ! private Strin nome; private Strin en#ereco; private Strin cpf; private int i#a#e; pu"lic voi# mu#a+P8(Strin vali#a+P8(cpf); this.cpf G cpf; & cpf) !
private voi# vali#a+P8(Strin cpf) ! (( sTrie #e re ras a)uiF falha caso no se'a vIli#o & & (( ..
*e al%u)m tentar criar um +liente e n(o usar o mu#a+P8 para alterar um cpf $iretamente# vai receber um erro $e compila,(o# j& que o atributo +P8 ) privado. / o $ia que voc! n(o precisar verificar o C2; $e quem tem mais $e QB anosC *eu m)to$o fica o se%uinte:
pu"lic voi# mu#a+P8(Strin if (this.i#a#e 3G N-) ! vali#a+P8(cpf); & this.cpf G cpf; & cpf) !
1 controle sobre o +P8 est& centraliza$o: nin%u)m conse%ue acess&-lo sem passar por a# a classe +liente ) a 6nica respons&vel pelos seus pr+prios atributosO eus livros de tecnolo#ia parecem do sculo passado?
Conhe,a a Casa do C*di#o# uma nova e$itora# com autores $e $estaque no merca$o# foco em ebooMs 923;# epub# mobi:# pre,os imbat"veis e assuntos atuais. Com a cura$oria $a Caelum e e celentes autores# ) uma abor$a%em di-erente para livros $e tecnolo%ia no Brasil. Conhe,a os ttulos e a nova proposta# voc! vai %ostar. Casa $o C+$i%o# livros para o pro%rama$or.
(( outros atri"utos omiti#os private #ou"le pe aSal#o() ! return this.sal#o; & (( #eposita() saca() e transfere() omiti#os &
2ara permitir o acesso aos atributos 9j& que eles s(o private: $e uma maneira controla$a# a pr&tica mais comum ) criar $ois m)to$os# um que retorna o valor e outro que mu$a o valor. 5 conven,(o para esses m)to$os ) $e colocar a palavra et ou set antes $o nome $o atributo. 2or e emplo# a nossa conta com sal#o# limite e titular fica assim# no caso $a %ente $esejar $ar acesso a leitura e escrita a to$os os atributos:
pu"lic class +onta ! private #ou"le sal#o; private #ou"le limite; private +liente titular; pu"lic #ou"le etSal#o() ! return this.sal#o; & pu"lic voi# setSal#o(#ou"le sal#o) ! this.sal#o G sal#o; & pu"lic #ou"le et9imite() ! return this.limite; & pu"lic voi# set9imite(#ou"le limite) ! this.limite G limite; & pu"lic +liente etPitular() ! return this.titular; & pu"lic voi# setPitular(+liente titular) ! this.titular G titular; & &
L uma m& pr&tica criar uma classe e# lo%o em se%ui$a# criar %etters e setters para to$os seus atributos. 4oc! s+ $eve criar um %etter ou setter se tiver a real necessi$a$e. Eepare que nesse e emplo setSal#o n(o $everia ter si$o cria$o# j& que queremos que to$os usem #eposita() e saca().
1utro $etalhe importante# um m)to$o et> n(o necessariamente retorna o valor $e um atributo que chama > $o objeto em quest(o. 'sso ) interessante para o encapsulamento. 'ma%ine a situa,(o: queremos que o banco sempre mostre como sal#o o valor $o limite soma$o ao sal$o 9uma pr&tica comum $os bancos que costuma ilu$ir seus clientes:. 2o$eramos sempre chamar c. et9imite() L c. etSal#o()# mas isso po$eria %erar uma situa,(o $e "replace all" quan$o precis&ssemos mu$ar como o sal$o ) mostra$o. 2o$emos encapsular isso em um m)to$o e# porque n(o# $entro $o pr+prio etSal#oC Eepare:
pu"lic class +onta ! private #ou"le sal#o; private #ou"le limite; private +liente titular; pu"lic #ou"le etSal#o() ! return this.sal#o L this.limite; & (( #eposita() saca() e transfere() omiti#os pu"lic +liente etPitular() ! return this.titular; & pu"lic voi# setPitular(+liente titular) ! this.titular G titular; &
&
1 c+$i%o acima nem possibilita a chama$a $o m)to$o et9imite()# ele n(o e iste. / nem $eve e istir enquanto n(o houver essa necessi$a$e. 1 m)to$o etSal#o() n(o $evolve simplesmente o sal#o... e sim o que queremos que seja mostra$o como se fosse o sal#o. 8tilizar %etters e setters n(o s+ aju$a voc! a prote%er seus atributos# como tamb)m possibilita ter $e mu$ar al%o em um s+ lu%ar... chamamos isso $e encapsulamento# pois escon$e a maneira como os objetos %uar$am seus $a$os. L uma pr&tica muito importante. 0ossa classe est& totalmente prontaC 'sto )# e iste a chance $ela ficar com menos $inheiro $o que o limiteC 2o$e parecer que n(o# mas# e se $epositarmos um valor ne%ativo na contaC ;icaramos com menos $inheiro que o permiti$o# j& que n(o esper&vamos por isso. 2ara nos prote%er $isso basta mu$armos o m)to$o #eposita() para que ele verifique se o valor ) necessariamente positivo. 3epois $isso precisaramos mu$ar mais al%um outro c+$i%oC 5 resposta ) n(o# %ra,as ao encapsulamento $os nossos $a$os. Cuidado com os #etters e settersO Como j& $ito# n(o $evemos criar %etters e setters sem um motivo e plicito. 0o blo% $a Caelum h& um arti%o que ilustra bem esses casos: http://blo%.caelum.com.br/=BBQ/BA/1K/nao-apren$er-oo-%etters-e-setters/
<.6 - Construtores
@uan$o usamos a palavra chave new# estamos construin$o um objeto. *empre quan$o o new ) chama$o# ele e ecuta o construtor da classe. 1 construtor $a classe ) um bloco $eclara$o com o mesmo nome que a classe:
class +onta !
int numero; +liente titular; #ou"le sal#o; #ou"le limite; (( construtor +onta() ! System.out.println("+onstruin#o uma conta."); & (( .. &
5 mensa%em "construin$o uma conta" aparecer&. L como uma rotina $e inicializa,(o que ) chama$a sempre que um novo objeto ) cria$o. 8m construtor po$e parecer# mas no um m)to$o. O construtor de-ault 5t) a%ora# as nossas classes n(o possuam nenhum construtor. /nt(o como ) que era possvel $ar new# se to$o new chama um construtor obri#atoriamenteC @uan$o voc! n(o $eclara nenhum construtor na sua classe# o .ava cria um para voc!. /sse construtor ) o construtor de-ault# ele n(o recebe nenhum ar%umento e o corpo $ele ) vazio. 5 partir $o momento que voc! $eclara um construtor# o construtor $efault n(o ) mais forneci$o. 1 interessante ) que um construtor po$e receber um ar%umento# po$en$o assim inicializar al%um tipo $e informa,(o:
class +onta ! int numero; +liente titular; #ou"le sal#o; #ou"le limite; (( construtor +onta(+liente titular) ! this.titular G titular; & & (( ..
/sse construtor recebe o titular $a conta. 5ssim# quan$o criarmos uma conta# ela j& ter& um $etermina$o titular.
+liente carlos G new +liente(); carlos.nome G "+arlos"; +onta c G new +onta(carlos); System.out.println(c.titular.nome);
5 i$eia ) bem simples. *e to$a conta precisa $e um titular# como obri%ar to$os os objetos que forem cria$os a ter um valor $esse tipoC Basta criar um 6nico construtor que recebe essa *trin%O 1 construtor se resume a issoO 3ar possibili$a$es ou obri%ar o usu&rio $e uma classe a passar ar%umentos para o objeto $urante o processo $e cria,(o $o mesmo. 2or e emplo# n(o po$emos abrir um arquivo para leitura sem $izer qual ) o nome $o arquivo que $esejamos lerO 2ortanto# na$a mais natural que passar uma Strin representan$o o nome $e um arquivo na hora $e criar um objeto $o tipo $e leitura $e arquivo# e que isso seja obri%at+rio. 4oc! po$e ter mais $e um construtor na sua classe e# no momento $o new# o construtor apropria$o ser& escolhi$o. ConstrutorF um mtodo especial? 8m construtor n(o ) um m)to$o. 5l%umas pessoas o chamam $e um m)to$o especial# mas $efinitivamente n(o )# j& que n(o possui retorno e s+ ) chama$o $urante a constru,(o $o objeto. C$amando outro construtor 8m construtor s+ po$e ro$ar $urante a constru,(o $o objeto# isto )# voc! nunca conse%uir& chamar o construtor em um objeto j& constru$o. 2or)m# $urante a constru,(o $e um objeto# voc! po$e fazer com que um construtor chame outro# para n(o ter $e ficar copian$o e colan$o:
class +onta ! int numero; +liente titular; #ou"le sal#o; #ou"le limite; (( construtor +onta (+liente titular) ! (( faM mais uma sTrie #e inicialiMabes e confi urabes this.titular G titular; & +onta (int numeroF +liente titular) ! this(titular); (( chama o construtor )ue foi #eclara#o acima this.numero G numero; & & ((..
/ iste um outro motivo# o outro la$o $os construtores: facili$a$e. Xs vezes# criamos um construtor que recebe $iversos ar%umentos para n(o obri%ar o usu&rio $e uma classe a chamar $iversos m)to$os $o tipo @set@. 0o nosso e emplo $o C2;# po$emos for,ar que a classe +liente receba no mnimo o C2;# $essa maneira um +liente j& ser& constru$o e com um C2; v&li$o. Java Pean @uan$o criamos uma classe com to$os os atributos priva$os# seus %etters e setters e um construtor vazio 9pa$r(o:# na ver$a$e estamos crian$o um .ava Bean 9mas n(o confun$a com /.B# que ) /nterprise .ava Beans:.
*e voc! %osta $e estu$ar essa apostila aberta $a Caelum# certamente vai %ostar $os novos cursos online que lan,amos na plataforma Alura. 4oc! estu$a a qualquer momento com a qualidade Caelum. Conhe,a a 5lura.
5qui# voltamos em um problema pareci$o com o $a vali$a,(o $e C2;. /stamos espalhan$o um c+$i%o por to$a aplica,(o# e quem %arante que vamos conse%uir lembrar $e incrementar a vari&vel totalEe+ontas to$a vezC Hentamos ent(o# passar para a se%uinte proposta:
class +onta ! private int totalEe+ontas; ((... +onta() ! this.totalEe+ontas G this.totalEe+ontas L /; & &
@uan$o criarmos $uas contas# qual ser& o valor $o totalEe+ontas $e ca$a uma $elasC 4ai ser 1. 2ois ca$a uma tem essa vari&vel. O atributo de cada objeto. *eria interessante ent(o# que essa vari&vel fosse 'nica# compartilha$a por to$os os objetos $essa classe. 3essa maneira# quan$o mu$asse atrav)s $e um objeto# o outro en er%aria o mesmo valor. 2ara fazer isso em java# $eclaramos a vari&vel como static.
private static int totalEe+ontas;
@uan$o $eclaramos um atributo como static# ele passa a n(o ser mais um atributo $e ca$a objeto# e sim um atributo da classe# a informa,(o fica %uar$a$a pela classe# n(o ) mais in$ivi$ual para ca$a objeto. 2ara acessarmos um atributo est&tico# n(o usamos a palavra chave this# mas sim o nome $a classe:
class +onta ! private static int totalEe+ontas; ((... +onta() ! +onta.totalEe+ontas G +onta.totalEe+ontas L /; &
&
.& que o atributo ) priva$o# como po$emos acessar essa informa,(o a partir $e outra classeC
2recisamos criar uma conta antes $e chamar o m)to$oO 'sso n(o ) le%al# pois %ostaramos $e saber quantas contas e istem sem precisar ter acesso a um objeto conta. 5 i$eia aqui ) a mesma# transformar esse m)to$o que to$o objeto conta tem em um m)to$o $e to$a a classe. 8samos a palavra static $e novo# mu$an$o o m)to$o anterior.
pu"lic static int etPotalEe+ontas() ! return +onta.totalEe+ontas; &
Eepare que estamos chaman$o um m)to$o n(o com uma refer!ncia para uma +onta# e sim usan$o o nome $a classe. 0todos e atributos est1ticos ")to$os e atributos est&ticos s+ po$em acessar outros m)to$os e atributos est&ticos $a mesma classe# o que faz to$o senti$o j& que $entro $e um m)to$o est&tico n(o temos acesso < refer!ncia this# pois um m)to$o est&tico ) chama$o atrav)s $a classe# e n(o $e um objeto. 1 static realmente traz um "cheiro" proce$ural# por)m em muitas vezes ) necess&rio.
0(o copie e coleO 5proveite para praticar sinta e. Fo%o passaremos a usar o /clipse e a sim teremos proce$imentos mais simples para este tipo $e tarefa. Eepare que o m)to$o calcula\anhoJnual parece tamb)m um %etter. 5li&s# seria comum al%u)m nome&-lo $e et\anhoJnual. 7etters n(o precisam apenas retornar atributos. /les po$em trabalhar com esses $a$os. R. "o$ifique suas classes que acessam e mo$ificam atributos $e um 8uncionario para utilizar os %etters e setters rec)m cria$os. 2or e emplo# on$e voc! encontra:
f.salario G /--; System.out.println(f.salario);
passa para:
f.setSalario(/--); System.out.println(f. etSalario());
K. ;a,a com que sua classe 8uncionario possa receber# opcionalmente# o nome $o 8uncionario $urante a cria,(o $o objeto. 8tilize construtores para obter esse resulta$o. 3ica: utilize um construtor sem ar%umentos tamb)m# para o caso $e a pessoa n(o querer passar o nome $o 8uncionario. *eria al%o como:
class 8uncionario ! pu"lic 8uncionario() ! (( construtor sem ar umentos & pu"lic 8uncionario(Strin nome) ! (( construtor )ue rece"e o nome & &
2or que voc! precisa $o construtor sem ar%umentos para que a passa%em $o nome seja opcionalC
J. 9opcional: 5$icione um atributo na classe 8uncionario $e tipo int que se chama i$entifica$or. /sse i$entifica$or $eve ter um valor 6nico para ca$a inst[ncia $o tipo 8uncionario. 1 primeiro 8uncionario instancia$o tem i$entifica$or 1# o se%un$o =# e assim por $iante. 4oc! $eve utilizar os recursos apren$i$os aqui para resolver esse problema. Crie um %etter para o i$entifica$or. 3evemos ter um setterC Q. 9opcional: Crie os %etters e setters $a sua classe Cmpresa e coloque seus atributos como private. Fembre-se $e que n(o necessariamente to$os os atributos $evem ter %etters e setters. 2or e emplo# na classe Cmpresa# seria interessante ter um setter e %etter para a sua arraD $e funcion&riosC 0(o seria mais interessante ter um m)to$o como esteC
class Cmpresa ! (( ... pu"lic 8uncionario et8uncionario (int posicao) ! return this.empre a#os$posicao%; & &
N. 9opcional: 0a classe Cmpresa# em vez $e criar um arraD $e tamanho fi o# receba como par[metro no construtor o tamanho $o arraD $e 8uncionario. Com esse construtor# o que acontece se tentarmos $ar new Cmpresa() sem passar ar%umento al%umC 2or qu!C Y. 9opcional: Como %arantir que $atas como R1/=/=B1= n(o sejam aceitas pela sua classe EataC A. 9opcional: Crie a classe Pessoa8isica. @ueremos ter a %arantia $e que pessoa fsica al%uma tenha C2; invali$o# nem seja cria$a Pessoa8isica sem cpf inicial. 9voc! n(o precisa escrever o al%oritmo $e vali$a,(o $e cpf# basta passar o cpf por um m)to$o vali#a(Strin A)...: +oc, pode tambm -a.er o curso /J-11 dessa apostila na Caelum
@ueren$o apren$er ain$a mais sobre .ava e boas pr&ticas $e orienta,(o a objetosC /sclarecer $6vi$as $os e ercciosC 1uvir e plica,-es $etalha$as com um instrutorC 5 Caelum oferece o curso /J-11 presencial nas ci$a$es $e *(o 2aulo# Eio $e .aneiro e Braslia# al)m $e turmas incompanD. Consulte as vanta%ens $o curso Java e Orientao a Objetos.
<.C - >esa-ios
1. 2orque esse c+$i%o n(o compilaC
class Peste ! int A G :Z; pu"lic static voi# main(Strin System.out.println(A); & & $% ar s) !
=. 'ma%ine que tenha uma classe 8a"ricaEe+arro e quero %arantir que s+ e iste um objeto $esse tipo em to$a a mem+ria. 0(o e iste uma palavra chave especial para isto em .ava# ent(o teremos $e fazer nossa classe $e tal maneira que ela respeite essa nossa necessi$a$e. Como fazer issoC 9pesquise: sin%leton $esi%n pattern: Captulo N
5l)m $e um funcion&rio comum# h& tamb)m outros car%os# como os %erentes. 1s %erentes %uar$am a mesma informa,(o que um funcion&rio comum# mas possuem outras informa,-es# al)m $e ter funcionali$a$es um pouco $iferentes. 8m %erente no nosso banco possui tamb)m uma senha num)rica que permite o acesso ao sistema interno $o banco# al)m $o n6mero $e funcion&rios que ele %erencia:
class \erente ! Strin nome; Strin cpf; #ou"le salario; int senha; int numeroEe8uncionarios\erencia#os; pu"lic "oolean autentica(int senha) ! if (this.senha GG senha) ! System.out.println("Jcesso Permiti#o!"); return true; & else ! System.out.println("Jcesso De a#o!"); return false; & & (( outros mTto#os &
Erecisamos mesmo de outra classe? 2o$eramos ter $ei a$o a classe 8uncionario mais %en)rica# manten$o nela senha $e acesso# e o
n6mero $e funcion&rios %erencia$os. Caso o funcion&rio n(o fosse um %erente# $ei aramos estes atributos vazios. /ssa ) uma possibili$a$e# por)m po$emos come,ar a ter muito atributos opcionais# e a classe ficaria estranha. / em rela,(o aos m)to$osC 5 classe \erente tem o m)to$o autentica# que n(o faz senti$o e istir em um funcion&rio que n(o ) %erente. *e tiv)ssemos um outro tipo $e funcion&rio que tem caractersticas $iferentes $o funcion&rio comum# precisaramos criar uma outra classe e copiar o c+$i%o novamenteO 5l)m $isso# se um $ia precisarmos a$icionar uma nova informa,(o para to$os os funcion&rios# precisaremos passar por to$as as classes $e funcion&rio e a$icionar esse atributo. 1 problema acontece novamente por n(o centralizarmos as informa,-es principais $o funcion&rio em um 6nico lu%arO / iste um jeito# em .ava# $e relacionarmos uma classe $e tal maneira que uma $elas $erda tu$o que a outra tem. 'sto ) uma rela,(o $e classe m(e e classe filha. 0o nosso caso# %ostaramos $e fazer com que o \erente tivesse tu$o que um 8uncionario tem# %ostaramos que ela fosse uma e!tenso $e 8uncionario. ;azemos isto atrav)s $a palavra chave eAten#s.
class \erente eAten#s 8uncionario ! int senha; int numeroEe8uncionarios\erencia#os; pu"lic "oolean autentica(int senha) ! if (this.senha GG senha) ! System.out.println("Jcesso Permiti#o!"); return true; & else ! System.out.println("Jcesso De a#o!"); return false; & & & (( setter #a senha omiti#o
/m to$o momento que criarmos um objeto $o tipo \erente# este objeto possuir& tamb)m os atributos $efini$os na classe 8uncionario# pois um \erente um8uncionario:
class Pesta\erente ! pu"lic static voi# main(Strin $% ar s) ! \erente erente G new \erente(); (( po#emos chamar mTto#os #o 8uncionario, erente.setDome("Joo #a Silva"); (( e tam"Tm mTto#os #o \erente! erente.setSenha(67:/); & &
3izemos que a classe \erente$erda to$os os atributos e m)to$os $a classe m(e# no nosso caso# a 8uncionario. 2ara ser mais preciso# ela tamb)m her$a os atributos e m)to$os priva$os# por)m n(o conse%ue acess&-los $iretamente. 2ara acessar um membro priva$o na filha in$iretamente# seria necess&rio que a m(e e pusesse um outro m)to$o visvel que invocasse esse atributo ou m)to$o priva$o.
uper e ub classe 5 nomenclatura mais encontra$a ) que 8uncionario ) a superclasse $e \erente# e \erente ) a subclasse $e 8uncionario. 3izemos tamb)m que to$o \erente um8uncionIrio. 1utra forma ) $izer que 8uncionario ) classe me $e \erente e \erente ) classe -il$a $e 8uncionario. / se precisamos acessar os atributos que her$amosC 0(o %ostaramos $e $ei ar os atributos $e 8uncionario# pu"lic# pois $essa maneira qualquer um po$eria alterar os atributos $os objetos $este tipo. / iste um outro mo$ifica$or $e acesso# o protecte## que fica entre o private e o pu"lic. 8m atributo protecte# s+ po$e ser acessa$o 9visvel: pela pr+pria classe e por suas subclasses 9e mais al%umas outras classes# mas veremos isso em outro captulo:.
class 8uncionario ! protecte# Strin nome; protecte# Strin cpf; protecte# #ou"le salario; (( mTto#os #evem vir a)ui &
empre usar protected? /nt(o porque usar privateC 3epois $e um tempo pro%raman$o orienta$o a objetos# voc! vai come,ar a sentir que nem sempre ) uma boa i$eia $ei ar que a classe filha acesse os atributos $a classe m(e# pois isso quebra um pouco a i$eia $e que s+ aquela classe $everia manipular seus atributos. /ssa ) uma $iscuss(o um pouco mais avan,a$a. 5l)m $isso# n(o s+ as subclasses# mas tamb)m as outras classes# po$em acessar os atributos protecte## que veremos mais a frente 9mesmo pacote:. 4eja outras alternativas ao protecte# no e erccio $e $iscuss(o em sala $e aula juntamente com o instrutor. 3a mesma maneira# po$emos ter uma classe Eiretor que esten$a \erente e a classe Presi#ente po$e esten$er $iretamente $e 8uncionario. ;ique claro que essa ) uma $ecis(o $e ne%+cio. *e 3iretor vai esten$er $e 7erente ou n(o# vai $epen$er se# para voc!# 3iretor um 7erente. 8ma classe po$e ter v&rias filhas# mas po$e ter apenas uma m(e# ) a chama$a heran,a simples $o java.
&
*e $ei armos a classe \erente como ela est&# ela vai her$ar o m)to$o etSonificacao.
\erente erente G new \erente(); erente.setSalario(;---.-); System.out.println( erente. etSonificacao());
1 resulta$o aqui ser& JBB. 0(o queremos essa resposta# pois o %erente $everia ter NJB $e bInus nesse caso. 2ara consertar isso# uma $as op,-es seria criar um novo m)to$o na classe \erente# chama$o# por e emplo# etSonificacaoEo\erente. 1 problema ) que teramos $ois m)to$os em \erente# confun$in$o bastante quem for usar essa classe# al)m $e que ca$a um $a uma resposta $iferente. 0o .ava# quan$o her$amos um m)to$o# po$emos alterar seu comportamento. 2o$emos reescrever 9reescrever# sobrescrever# override: este m)to$o:
class \erente eAten#s 8uncionario ! int senha; int numeroEe8uncionarios\erencia#os; pu"lic #ou"le etSonificacao() ! return this.salario H -./;; & (( ...
&
5%ora o m)to$o est& correto para o \erente. Eefa,a o teste e veja que o valor impresso ) o correto 9NJB::
\erente erente G new \erente(); erente.setSalario(;---.-); System.out.println( erente. etSonificacao());
1 78. ) um $os principais f+runs brasileiros $e computa,(o e o maior em portu%u!s sobre .ava. 5 nova vers(o $o 78. ) basea$a em uma ferramenta $e perguntas e respostas 9@5: e tem uma comuni$a$e muito forte. *(o mais $e 1JB mil usu&rios pra aju$ar voc! a esclarecer suas $6vi$as. ;a,a sua per%unta.
(( ... &
5qui teramos um problema: o $ia que o etSonificacao $o 8uncionario mu$ar# precisaremos mu$ar o m)to$o $o \erente para acompanhar a nova bonifica,(o. 2ara evitar isso# o etSonificacao $o \erente po$e chamar o $o 8uncionario utilizan$o a palavra chave super.
class \erente eAten#s 8uncionario ! int senha; int numeroEe8uncionarios\erencia#os; pu"lic #ou"le etSonificacao() ! return super. etSonificacao() L /---; & (( ... &
/ssa invoca,(o vai procurar o m)to$o com o nome etSonificacao $e uma super classe $e \erente. 0o caso ele lo%o vai encontrar esse m)to$o em 8uncionario. /ssa ) uma pr&tica comum# pois muitos casos o m)to$o reescrito %eralmente faz "al%o a mais" que o m)to$o $a classe m(e. Chamar ou n(o o m)to$o $e cima ) uma $ecis(o sua e $epen$e $o seu problema. 5l%umas vezes n(o faz senti$o invocar o m)to$o que reescrevemos.
@.6 - Eolimor-ismo
1 que %uar$a uma vari&vel $o tipo 8uncionarioC 8ma refer!ncia para um 8uncionario# nunca o objeto em si. 0a heran,a# vimos que to$o \erente ) um 8uncionario# pois ) uma e tens(o $este. 2o$emos nos referir a um \erente como sen$o um 8uncionario. *e al%u)m precisa falar com um 8uncionario $o banco# po$e falar com um \erenteO 2orqueC 2ois \erente um8uncionario. /ssa ) a sem[ntica $a heran,a.
\erente erente G new \erente(); 8uncionario funcionario G erente; funcionario.setSalario(;---.-);
2olimorfismo ) a capaci$a$e $e um objeto po$er ser referencia$o $e v&rias formas. 9cui$a$o# polimorfismo n(o quer $izer que o objeto fica se transforman$o# muito pelo contr&rio# um objeto nasce $e um tipo e morre $aquele tipo# o que po$e mu$ar ) a maneira como nos referimos a ele:. 5t) aqui tu$o bem# mas e se eu tentar:
funcionario. etSonificacao();
@ual ) o retorno $esse m)to$oC JBB ou NJBC 0o .ava# a invoca,(o $e m)to$o sempre vai ser decidida em tempo de e!ecuo. 1 .ava vai procurar o objeto na mem+ria e# a sim# $eci$ir qual m)to$o $eve ser chama$o# sempre relacionan$o com sua classe $e ver$a$e# e n(o com a que estamos usan$o para referenci&-lo. 5pesar $e estarmos nos referencian$o a esse \erente como sen$o um 8uncionario# o m)to$o e ecuta$o ) o $o \erente. 1 retorno ) NJB. 2arece estranho criar um %erente e referenci&-lo como apenas um funcion&rio. 2or que faramos issoC 0a ver$a$e# a situa,(o que costuma aparecer ) a que temos um m)to$o que recebe um ar%umento $o tipo 8uncionario:
class +ontroleEeSonificacoes ! private #ou"le totalEeSonificacoes G -; pu"lic voi# re istra(8uncionario funcionario) ! this.totalEeSonificacoes LG funcionario. etSonificacao(); & pu"lic #ou"le etPotalEeSonificacoes() ! return this.totalEeSonificacoes; &
&
/# em al%um lu%ar $a minha aplica,(o 9ou no main# se for apenas para testes::
+ontroleEeSonificacoes controle G new +ontroleEeSonificacoes(); \erente funcionario/ G new \erente(); funcionario/.setSalario(;---.-); controle.re istra(funcionario/); 8uncionario funcionario7 G new 8uncionario(); funcionario7.setSalario(/---.-); controle.re istra(funcionario7); System.out.println(controle. etPotalEeSonificacoes());
Eepare que conse%uimos passar um \erente para um m)to$o que recebe um 8uncionario como ar%umento. 2ense como numa porta na a%!ncia banc&ria com o se%uinte aviso: "2ermiti$a a entra$a apenas $e ;uncion&rios". 8m %erente po$e passar nessa portaC *im# pois \erente um8uncionario. @ual ser& o valor resultanteC 0(o importa que $entro $o m)to$o re%istra $o +ontroleEeSonificacoes receba 8uncionario. @uan$o ele receber um objeto que realmente ) um \erente# o seu m)to$o reescrito ser& invoca$o. Eeafirman$o: no importa como nos re-erenciamos a um objeto4 o mtodo que ser1 invocado sempre o que dele. 0o $ia em que criarmos uma classe Secretaria# por e emplo# que ) filha $e 8uncionario# precisaremos mu$ar a classe $e +ontroleEeSonificacoesC 0(o. Basta a classe Secretaria reescrever os m)to$os que lhe parecerem necess&rios. L e atamente esse o po$er $o polimorfismo# juntamente com a reescrita $e m)to$o: $iminuir o acoplamento entre as classes# para evitar que novos c+$i%os resultem em mo$ifica,-es em in6meros lu%ares. Eepare que quem criou +ontroleEeSonificacoes po$e nunca ter ima%ina$o a cria,(o $a classe Secretaria ou Cn enheiro. Contu$o# n(o ser& necess&rio reimplementar esse controle em ca$a nova classe: reaproveitamos aquele c+$i%o. 7erana versus acoplamento 0ote que o uso $e heran,a aumenta o acoplamento entre as classes# isto )# o quanto uma classe $epen$e $e outra. 5 rela,(o entre classe m(e e filha ) muito forte e isso acaba fazen$o com que o pro%rama$or $as classes filhas tenha que conhecer a implementa,(o $a classe pai e vice-versa - fica $ifcil fazer uma mu$an,a pontual no sistema. 2or e emplo# ima%ine se tivermos que mu$ar al%o na nossa classe 8uncionario# mas n(o quis)ssemos que to$os os funcion&rios sofressem a mesma mu$an,a. 2recisaramos passar por ca$a uma $as filhas $e 8uncionario verifican$o se ela se comporta como $everia ou se $evemos sobrescrever o tal m)to$o mo$ifica$o. /sse ) um problema $a heran,a# e n(o $o polimorfismo# que resolveremos mais tar$e com a aju$a
$e 'nterfaces.
1 %asto que temos com o professor n(o ) apenas seu sal&rio. Hemos $e somar um bInus $e 1B reais por hora/aula. 1 que fazemos ent(oC Eeescrevemos o m)to$o. 5ssim como o et\astos ) $iferente# o etQnfo tamb)m ser&# pois temos $e mostrar as horas/aula tamb)m.
class ProfessorEa8acul#a#e eAten#s Cmpre a#oEa8acul#a#e ! private int horasEeJula; #ou"le et\astos() ! return this. etSalario() L this.horasEeJula H /-; & Strin etQnfo() ! Strin informacaoSasica G super. etQnfo(); Strin informacao G informacaoSasica L " horas #e aula, " L this.horasEeJula; return informacao; & (( mTto#os #e etF set e outros )ue forem necessIrios &
5 novi$a$e# aqui# ) a palavra chave super. 5pesar $o m)to$o ter si$o reescrito# %ostaramos $e acessar o m)to$o $a classe m(e# para n(o ter $e copiar e colocar o conte6$o $esse m)to$o e $epois concatenar com a informa,(o $as horas $e aula. Como tiramos proveito $o polimorfismoC 'ma%ine que temos uma classe $e relat+rio:
class \era#orEe[elatorio ! pu"lic voi# a#iciona(Cmpre a#oEa8acul#a#e f) ! System.out.println(f. etQnfo()); System.out.println(f. et\astos()); & &
2o$emos passar para nossa classe qualquer Cmpre a#oEa8acul#a#eO 4ai funcionar tanto para professor# quanto para funcion&rio comum. 8m certo $ia# muito $epois $e terminar essa classe $e relat+rio# resolvemos aumentar nosso sistema# e colocar uma classe nova# que representa o [eitor. Como ele tamb)m ) um Cmpre a#oEa8acul#a#e# ser& que vamos precisar alterar al%o na nossa classe $e [elatorioC 0(o. /ssa ) a i$eiaO @uem pro%ramou a classe \era#orEe[elatorio nunca ima%inou que e istiria uma classe Eeitor e# mesmo assim# o sistema funciona.
class [eitor eAten#s Cmpre a#oEa8acul#a#e !
(( informabes eAtras Strin etQnfo() ! return super. etQnfo() L " e ele T um reitor"; & (( no so"rescrevemos o et\astos!!! &
/$itoras tra$icionais pouco li%am para ebooGs e novas tecnolo%ias. 0(o conhecem pro%rama,(o para revisar os livros tecnicamente a fun$o. 0(o t!m anos $e e peri!ncia em $i$&ticas com cursos. Conhe,a a Casa do C*di#o# uma e$itora $iferente# com cura$oria $a Caelum e obsess(o por livros $e quali$a$e a pre,os justos. Casa $o C+$i%o# ebooG com pre,o $e ebooG.
pu"lic class +onta ! private #ou"le sal#o; pu"lic voi# #eposita(#ou"le valor) ! this.sal#o LG valor; & pu"lic voi# saca(#ou"le valor) ! this.sal#o *G valor; & pu"lic #ou"le etSal#o() ! return this.sal#o; &
&
=. 5$icione um m)to$o na classe +onta# que atualiza essa conta $e acor$o com uma ta a percentual forneci$a.
class +onta ! private #ou"le sal#o; (( outros mTto#os a)ui tam"Tm ... voi# atualiMa(#ou"le taAa) ! this.sal#o LG this.sal#o H taAa; & &
R. Crie $uas subclasses $a classe +onta: +onta+orrente e +ontaPoupanca. 5mbas ter(o o m)to$o atualiza reescrito: 5 +onta+orrente $eve atualizar-se com o $obro $a ta a e a +ontaPoupanca $eve atualizar-se com o triplo $a ta a. 5l)m $isso# a +onta+orrente $eve reescrever o m)to$o #eposita# a fim $e retirar uma ta a banc&ria $e $ez centavos $e ca$a $ep+sito. 1. Crie as classes +onta+orrente e +ontaPoupanca. 5mbas s(o filhas $a classe +onta:
pu"lic class +onta+orrente eAten#s +onta ! & pu"lic class +ontaPoupanca eAten#s +onta ! &
Eepare que# para acessar o atributo sal$o her$a$o $a classe +onta# voc, vai precisar trocar o modi-icador de visibilidade de saldo para protecte# . R. Eeescreva o m)to$o atualiMa na classe +ontaPoupanca# se%uin$o o enuncia$o:
pu"lic class +ontaPoupanca eAten#s +onta ! pu"lic voi# atualiMa(#ou"le taAa) !
K. 0a classe +onta+orrente# reescreva o m)to$o #eposita para $escontar a ta a banc&ria $e $ez centavos:
pu"lic class +onta+orrente eAten#s +onta ! pu"lic voi# atualiMa(#ou"le taAa) ! this.sal#o LG this.sal#o H taAa H 7; & pu"lic voi# #eposita(#ou"le valor) ! this.sal#o LG valor * -./-; & &
K. Crie uma classe com m)to$o main e instancie essas classes# atualize-as e veja o resulta$o. 5l%o como:
pu"lic class Pesta+ontas ! pu"lic static voi# main(Strin $% ar s) ! +onta c G new +onta(); +onta+orrente cc G new +onta+orrente(); +ontaPoupanca cp G new +ontaPoupanca(); c.#eposita(/---); cc.#eposita(/---); cp.#eposita(/---); c.atualiMa(-.-/); cc.atualiMa(-.-/); cp.atualiMa(-.-/); System.out.println(c. etSal#o()); System.out.println(cc. etSal#o()); System.out.println(cp. etSal#o()); & &
5p+s imprimir o sal$o 9 etSal#o(): $e ca$a uma $as contas# o que aconteceC J. 1 que voc! acha $e ro$ar o c+$i%o anterior $a se%uinte maneira:
+onta c G new +onta(); +onta cc G new +onta+orrente(); +onta cp G new +ontaPoupanca();
CompilaC Eo$aC 1 que mu$aC @ual ) a utili$a$e $issoC Eealmente# essa n(o ) a maneira mais 6til $o polimorfismo - veremos o seu real po$er no pr+ imo e erccio. 2or)m e iste uma utili$a$e $e $eclararmos uma vari&vel $e um tipo menos especfico $o que o objeto realmente ). L e!tremamente importante perceber que n(o importa como nos referimos a um objeto# o m)to$o que ser& invoca$o ) sempre o mesmoO 5 .4" vai $escobrir em tempo $e e ecu,(o qual $eve ser invoca$o# $epen$en$o $e que tipo ) aquele objeto# n(o importan$o como nos referimos a ele.
Q. 9opcional: 4amos criar uma classe que seja respons&vel por fazer a atualiza,(o $e to$as as contas banc&rias e %erar um relat+rio com o sal$o anterior e sal$o novo $e ca$a uma $as contas. 5l)m $isso# conforme atualiza as contas# o banco quer saber quanto $o $inheiro $o banco foi atualiza$o at) o momento. 2or isso# precisamos ir %uar$an$o o sal#oPotal e a$icionar um %etter < classe.
pu"lic class JtualiMa#orEe+ontas ! private #ou"le sal#oPotal G -; private #ou"le selic; pu"lic JtualiMa#orEe+ontas(#ou"le selic) ! this.selic G selic; & pu"lic voi# ro#a(+onta c) ! (( a)ui vocX imprime o sal#o anteriorF atualiMa a contaF (( e #epois imprime o sal#o final (( lem"ran#o #e somar o sal#o final ao atri"uto sal#oPotal & & (( outros mTto#osF colocar o etter para sal#oPotal!
Y. 91pcional: 8se a palavra chave super nos m)to$os atualiMa reescritos# para n(o ter $e refazer o trabalho. A. 91pcional: *e voc! precisasse criar uma classe +ontaQnvestimento# e seu m)to$o atualiMa fosse complica$ssimo# voc! precisaria alterar a classe JtualiMa#orEe+ontasC 1B.91pcional# Hrabalhoso: Crie uma classe Sanco que possui um arraD $e +onta. Eepare que num arraD $e +onta voc! po$e colocar tanto +onta+orrente quanto +ontaPoupanca. Crie um m)to$o pu"lic voi# a#iciona(+onta c)# um m)to$o pu"lic +onta pe a+onta(int A) e outro pu"lic int pe aPotalEe+ontas()# muito similar a rela,(o anterior $e /mpresa-;uncionario.
;a,a com que seu m)to$o main crie $iversas contas# insira-as no Sanco e $epois# com um for# percorra to$as as contas $o Sanco para pass&-las como ar%umento para o JtualiMa#orEe+ontas.
=clipse 8>=
"3&-se import[ncia aos antepassa$os quan$o j& n(o temos nenhum." 0este captulo# voc! ser& apresenta$o ao 5mbiente $e 3esenvolvimento /clipse e suas principais funcionali$a$es.
A.1 - O =clipse
1 /clipse 9http://www.eclipse.or%: ) uma '3/ 9inte%rate$ $evelopment environment:. 3iferente $e uma E53# on$e o objetivo ) $esenvolver o mais r&pi$o possvel atrav)s $o arrastar)e)soltar do mouse# on$e montanhas $e c+$i%o s(o %era$os em bacG%roun$# uma '3/ te au ilia no $esenvolvimento# evitan$o se intrometer e fazer muita m&%ica. 1 /clipse ) a '3/ l$er $e merca$o. ;orma$a por um cons+rcio li$era$o pela 'B"# possui seu c+$i%o livre. 5 6ltima vers(o ) a K.=# mas com qualquer vers(o posterior a $o R.1 voc! ter& suporte ao .ava J# Q e N. 4eremos aqui os principais recursos $o /clipse. 4oc! perceber& que ele evita ao m& imo te atrapalhar e apenas %era trechos $e c+$i%os +bvios# sempre ao seu coman$o. / istem tamb)m centenas $e plu%ins %ratuitos para %erar $ia%ramas 8"F# suporte a servi$ores $e aplica,(o# visualiza$ores $e banco $e $a$os e muitos outros. Bai e o /clipse $o site oficial http://www.eclipse.or%. 5pesar $e ser escrito em .ava# a biblioteca %r&fica usa$a no /clipse# chama$a *PH# usa componentes nativos $o sistema operacional. 2or isso voc! $eve bai ar a vers(o correspon$ente ao seu sistema operacional. 3escompacte o arquivo e pronto# basta ro$ar o e ecut&vel. Outras 8>=s 8ma outra '3/ open source famosa ) o 0etbeans# $a 1racle. 9http://www.netbeans.or%:. 5l)m $essas# 1racle# Borlan$ e a pr+pria 'B" possuem '3/s comerciais e al%umas vers-es mais restritas $e uso livre. 5 empresa .etBrains $esenvolve o 'ntelli. '3/5# uma '3/ pa%a que tem %anho muitos a$eptos.
4oc! po$e $ei ar o $iret+rio pr)-$efini$o. Fo%o em se%ui$a# uma tela $e Pelcome ser& aberta# on$e voc! tem $iversos linGs para tutoriais e aju$a. Clique em PorGbench. 5 tela $e Pelcome $o /clipse K ) um pouco $iferente# ams possui e atamente os mesmos recursos nos mesmos locais.
4oc! che%ou aqui porque a Caelum ) refer!ncia nacional em cursos $e .ava# EubD# 5%ile# "obile# Peb e .0/H. ;a,a curso com quem escreveu essa apostila. Consulte as vanta%ens $o curso Java e Orientao a Objetos.
"u$e para a perspectiva Eesource# clican$o no cone ao la$o $a perspectiva .ava# selecionan$o 1ther e $epois Eesource. 0este momento# trabalharemos com esta perspectiva# antes $a $e .ava# pois ela possui um conjunto $e 4iews mais simples.
5 4iew 0avi%ator mostra a estrutura $e $iret+rio assim como est& no sistema $e arquivos. 5 4iew 1utline mostra um resumo $as classes# interfaces e enumera,-es $eclara$as no arquivo java atualmente e$ita$o 9serve tamb)m para outros tipos $e arquivos:. 0o menu 3indo5 -Q $o5 +ie5 -Q Ot$er# voc! po$e ver as $ezenas $e 4iews que j& vem embuti$as no /clipse. 5costume-se a sempre procurar novas 4iews# elas po$em te aju$ar em $iversas tarefas.
Crie um projeto chama$o "anco. 4oc! po$e che%ar nessa mesma tela clican$o com o bot(o $a $ireta no espa,o $a 4iew 0avi%ator e se%uin$o o mesmo menu. 0esta tela# confi%ure seu projeto como na tela abai o:
'sto )# marque "create separate source an$ output fol$ers"# $esta maneira seus arquivos java e arquivos class estar(o em $iret+rios $iferentes# para voc! trabalhar $e uma maneira mais or%aniza$a. Clique em ;inish. 1 /clipse pe$ir& para trocar a perspectiva para .ava? escolha "Bo" para permanecer em Eesource. 0a 4iew *avigator# voc! ver& o novo projeto e suas pastas e arquivos:
4amos iniciar nosso projeto crian$o a classe Conta. 2ara isso# v& em ;ile -Z 0ew -Z 1ther -Z Class. Clique em 0e t e crie a classe se%uin$o a tela abai o:
Clique em ;inish. 1 /clipse possui $iversos wizar$s# mas usaremos o mnimo $eles. 1 interessante ) usar o code assist e quic! "i#es que a ferramenta possui e veremos em se%ui$a. 0(o se atente <s milhares $e op,-es $e ca$a wizar$# a parte mais interessante $o /clipse n(o ) essa. /screva o m)to$o #eposita como abai o e note que o /clipse reclama $e erro em this.sal#o pois este atributo n(o e iste.
4amos usar o recurso $o /clipse $e quicM -i!. Coloque o cursor em cima $o erro e aperte Ctrl V 1.
1 /clipse su%erir& possveis formas $e consertar o erro? uma $elas )# justamente# criar o campo sal#o na classe +onta# que ) nosso objetivo. Clique nesta op,(o.
/ste recurso $e quicG fi es# acessvel pelo CtrlV1# ) uma $as %ran$es facili$a$es $o /clipse e ) e tremamente po$eroso. 5trav)s $ele ) possvel corri%ir boa parte $os erros na hora $e pro%ramar e# como fizemos# economizar a $i%ita,(o $e certos c+$i%os repetitivos. 0o nosso e emplo# n(o precisamos criar o campo antes? o /clipse faz isso para n+s. /le at) acerta a tipa%em# j& que estamos soman$o ele a um $ouble. 1 private ) coloca$o por motivos que j& estu$amos. 4& ao menu ;ile -Z *ave para %ravar. Control V * tem o mesmo efeito.
1 /clipse su%erir& a cria,(o $o m)to$o main completo? selecione esta op,(o. 1 control V espa,o )
chama$o $e code assist. 5ssim como os quicG fi es s(o $e e trema import[ncia. / perimente usar o co$e assist em $iversos lu%ares. 3entro $o m)to$o main# comece a $i%itar o se%uinte c+$i%o:
+onta conta G new +onta(); conta.#eposita(/--.-);
1bserve que# na hora $e invocar o m)to$o sobre o objeto conta# o /clipse su%ere os m)to$os possveis. /ste recurso ) bastante 6til# principalmente quan$o estivermos pro%raman$o com classes que n(o s(o as nossas# como $a 52' $o .ava. 1 /clipse aciona este recurso quan$o voc! $i%ita o ponto lo%o ap+s um objeto 9e voc! po$e usar o CtrlV/spa,o para acion&-lo:. 4amos imprimir o sal$o com System.out.println. "as# mesmo nesse c+$i%o# o /clipse nos aju$a. /screva syso e aperte CtrlV/spa,o que o /clipse escrever& *Dstem.out.println9: para voc!. 2ara imprimir# chame o conta. etSal#o():
System.out.println(conta. etSal#o());
0ote que o /clipse acusar& erro em etSal#o() porque este m)to$o n(o e iste na classe +onta. 4amos usar CtrlV1 em cima $o erro para corri%ir o problema:
1 /clipse su%ere criar um m)to$o etSal#o() na classe +onta. *elecione esta op,(o e o m)to$o ser& inseri$o automaticamente.
pu"lic 2"'ect etSal#o() ! (( P2E2 Juto* enerate# metho# stu" return null; &
/le %era um m)to$o n(o e atamente como queramos# pois nem sempre h& como o /clipse ter $e antem(o informa,-es suficientes para que ele acerta a assinatura $o seu m)to$o. "o$ifique o m)to$o etSal#o como se%ue:
pu"lic #ou"le etSal#o() ! return this.sal#o; &
/sses pequenos recursos $o /clipse s(o $e e trema utili$a$e. 3essa maneira# voc! po$e pro%ramar sem se preocupar com m)to$os que ain$a n(o e istem# j& que a qualquer momento ele po$e %erar o esqueleto 9a parte $a assinatura $o m)to$o:. eus livros de tecnolo#ia parecem do sculo passado?
Conhe,a a Casa do C*di#o# uma nova e$itora# com autores $e $estaque no merca$o# foco em ebooMs 923;# epub# mobi:# pre,os imbat"veis e assuntos atuais. Com a cura$oria $a Caelum e e celentes autores# ) uma abor$a%em di-erente para livros $e tecnolo%ia no Brasil. Conhe,a os ttulos e a nova proposta# voc! vai %ostar. Casa $o C+$i%o# livros para o pro%rama$or.
1 /clipse abrir& uma 4iew chama$a Console on$e ser& apresenta$a a sa$a $o seu pro%rama:
@uan$o voc! precisar ro$ar $e novo# basta clicar no cone ver$e $e plaD na toolbar# que ro$a o pro%rama anterior. 5o la$o $esse cone tem uma setinha on$e s(o lista$os os 1B 6ltimos e ecuta$os.
4& nessa linha e $! control - .. /le vai su%erir e $eclarar& a vari&vel pra voc!. =. 'ma%ine que queremos criar um setter $o sal$o para a classe +onta. 3entro $a classe +onta# $i%ite: setSa3ctrl L espaco4 1 mesmo vale no caso $e voc! querer reescrever um m)to$o. 3entro $e +onta+orrente fa,a: atua3+ontrolCspaco4 R. 4& na sua classe que tem o main e se%ure o C10HE1F aperta$o enquanto voc! passa o mouse sobre o seu c+$i%o. Eepare que tu$o virou hDperlinG. Clique em um m)to$o que voc! est& invocan$o na classe +onta. 4oc! po$e conse%uir o mesmo efeito# $e abrir o arquivo no qual o m)to$o foi $eclara$o# $e uma maneira ain$a mais pr&tica: sem usar o mouse# quan$o o cursor estiver sobre o que voc! quer analisar# simplesmente clique 8:. K. 3! um clique $a $ireita em um arquivo no navi%ator. /scolha Compare 3it$ -Q Nocal 7istor2. 1 que ) esta telaC
J. 8se o Control - /hi"t - 0 para formatar o seu c+$i%o. 3essa maneira# ele vai arrumar a ba%un,a $e espa,amento e enters $o seu c+$i%o.
Q. 9opcional: Crie no seu projeto a classe JtualiMa#orEe+ontas como no captulo anterior. N. 9opcional: 1 que s(o os arquivos .project e .classpathC Feia o conte6$o $eles. Y. 9opcional: Clique $a $ireita no projeto# proprie$a$es. L uma $as telas mais importantes $o /clipse# on$e voc! po$e confi%urar $iversas informa,-es para o seu projeto# como compila$or# vers-es# formata$or e outros.
Captulo A
Classes Abstratas
"3&-se import[ncia aos antepassa$os quan$o j& n(o temos nenhum." 5o t)rmino $esse captulo# voc! ser& capaz $e utilizar classes abstratas# quan$o necess&rio.
0osso m)to$o re istra recebe qualquer refer!ncia $o tipo 8uncionario# isto )# po$em ser objetos $o tipo 8uncionario e qualquer $e seus subtipos: \erente# Eiretor e# eventualmente# al%uma nova subclasse que venha ser escrita# sem pr)vio conhecimento $o autor $a +ontroleEeSonificacao. /stamos utilizan$o aqui a classe 8uncionario para o polimorfismo. *e n(o fosse ela# teramos um %ran$e prejuzo: precisaramos criar um m)to$o re istra para receber ca$a um $os tipos $e 8uncionario# um para \erente# um para Eiretor# etc. Eepare que per$er esse po$er ) muito pior $o que a pequena vanta%em que a heran,a traz em her$ar c+$i%o. 2or)m# em al%uns sistemas# como ) o nosso caso# usamos uma classe com apenas esses intuitos: $e economizar um pouco c+$i%o e %anhar polimorfismo para criar m)to$os mais %en)ricos# que se encai em a $iversos objetos. ;az senti$o ter um objeto $o tipo 8uncionarioC /ssa per%unta ) $iferente $e saber se faz senti$o ter uma refer!ncia $o tipo 8uncionario: nesse caso# faz sim e ) muito 6til. Eeferencian$o 8uncionario temos o polimorfismo $e refer!ncia# j& que po$emos receber qualquer objeto que seja um 8uncionario. 2or)m# $ar new em 8uncionario po$e n(o fazer senti$o# isto )# n(o queremos receber um objeto $o tipo 8uncionario# mas sim que aquela refer!ncia seja ou um \erente# ou um Eiretor# etc. 5l%o mais concreto que um 8uncionario.
+ontroleEeSonificacoes c#" G new +ontroleEeSonificacoes(); 8uncionario f G new 8uncionario(); c#".a#iciona(f); (( faM senti#o]
4ejamos um outro caso em que n(o faz senti$o ter um objeto $aquele tipo# apesar $a classe e istir: ima%ine a classe Pessoa e $uas filhas# Pessoa8isica e PessoaJuri#ica. @uan$o pu amos um relat+rio $e nossos clientes 9uma arraD $e Pessoa por e emplo:# queremos que ca$a um $eles seja ou uma Pessoa8isica# ou uma PessoaJuri#ica. 5 classe Pessoa# nesse caso# estaria sen$o usa$a apenas para %anhar o polimorfismo e her$ar al%umas coisas: n(o faz senti$o permitir instanci&-la. 2ara resolver esses problemas# temos as classes abstratas.
/# no meio $e um c+$i%o:
8uncionario f G new 8uncionario(); (( no compila!!!
1 c+$i%o acima n(o compila. 1 problema ) instanciar a classe - criar refer!ncia# voc! po$e. *e ela n(o po$e ser instancia$a# para que serveC *erve para o polimorfismo e heran,a $os atributos e m)to$os# que s(o recursos muito po$erosos# como j& vimos. 4amos ent(o her$ar $essa classe# reescreven$o o m)to$o etSonificacao:
class \erente eAten#s 8uncionario ! pu"lic #ou"le etSonificacao() ! return this.salario H /.6 L /---; & &
"as qual ) a real vanta%em $e uma classe abstrataC 2o$eramos ter feito isto com uma heran,a comum. 2or enquanto# a 6nica $iferen,a ) que n(o po$emos instanciar um objeto $o tipo 8uncionario# que j& ) $e %ran$e valia# $an$o mais consist!ncia ao sistema. ;ique claro que a nossa $ecis(o $e transformar 8uncionario em uma classe abstrata $epen$eu $o nosso $omnio. 2o$e ser que# em um sistema com classes similares# fa,a senti$o que uma classe an&lo%a a 8uncionario seja concreta. +oc, pode tambm -a.er o curso /J-11 dessa apostila na Caelum
@ueren$o apren$er ain$a mais sobre .ava e boas pr&ticas $e orienta,(o a objetosC /sclarecer $6vi$as $os e ercciosC 1uvir e plica,-es $etalha$as com um instrutorC 5 Caelum oferece o curso /J-11 presencial nas ci$a$es $e *(o 2aulo# Eio $e .aneiro e Braslia# al)m $e turmas incompanD. Consulte as vanta%ens $o curso Java e Orientao a Objetos.
Eepare que n(o colocamos o corpo $o m)to$o e usamos a palavra chave a"stract para $efinir o mesmo. 2or que n(o colocar corpo al%umC 2orque esse m)to$o nunca vai ser chama$o# sempre que al%u)m chamar o m)to$o etSonificacao# vai cair em uma $as suas filhas# que realmente escreveram o m)to$o. @ualquer classe que esten$er a classe 8uncionario ser& obri%a$a a reescrever este m)to$o# tornan$o-o "concreto". *e n(o reescreverem esse m)to$o# um erro $e compila,(o ocorrer&. 1 m)to$o $o +ontroleEeSonificacao estava assim:
pu"lic voi# re istra(8uncionario f) ! System.out.println("J#icionan#o "onificao #o funcionario, " L f); this.totalEeSonificacoes LG f. etSonificacao(); &
Como posso acessar o m)to$o etSonificacao se ele n(o e iste na classe 8uncionarioC .& que o m)to$o ) abstrato# com certe.a suas subclasses t!m esse m)to$o# o que %arante que essa invoca,(o $e m)to$o n(o vai falhar. Basta pensar que uma refer!ncia $o tipo 8uncionario nunca aponta para um objeto que n(o tem o m)to$o etSonificacao# pois n(o ) possvel instanciar uma classe abstrata# apenas as concretas. 8m m)to$o abstrato obri%a a classe em que ele se encontra ser abstrata# o que %arante a coer!ncia $o c+$i%o acima compilar.
1u seja# tenho a classe abstrata 8uncionario# com o m)to$o abstrato etSonificacao? as classes \erente e Presi#ente esten$en$o 8uncionario e implementan$o o m)to$o etSonificacao? e# por fim# a classe Eiretor# que esten$e \erente# mas n(o implementa o m)to$o etSonificacao. /ssas classes v(o compilarC 4(o ro$arC 5 resposta ) sim. /# al)m $e tu$o# far(o e atamente o que n+s queremos# pois# quan$o \erente e Presi#ente possuem os m)to$os perfeitamente implementa$os# a classe Eiretor# que n(o possui o m)to$o implementa$o# vai usar a implementa,(o her$a$a $e \erente.
/ esse $ia%rama# no qual inclumos uma classe abstrata Secretaria sem o m)to$o etSonificacao# que ) esten$i$a por mais $uas classes 9SecretariaJ#ministrativa# SecretariaJ encia: que# por sua vez# implementam o m)to$o etSonificacao# vai compilarC 4ai ro$arC 3e novo# a resposta ) sim# pois Secretaria ) uma classe abstrata e# por isso# o .ava tem certeza $e que nin%u)m vai conse%uir instanci&-la e# muito menos# chamar o m)to$o etSonificacao $ela. Fembran$o que# nesse caso# n(o precisamos nem ao menos escrever o m)to$o abstrato etSonificacao na classe Secretaria.
*e eu n(o reescrever um m)to$o abstrato $a minha classe m(e# o c+$i%o n(o compilar&. "as posso# em vez $isso# $eclarar a classe como abstrataO java.io Classes abstratas n(o possuem nenhum se%re$o no apren$iza$o# mas quem est& apren$en$o orienta,(o a objetos po$e ter uma enorme $ificul$a$e para saber quan$o utiliz&-las# o que ) muito normal. /stu$aremos o pacote java.io# que usa bastantes classes abstratas# sen$o um e emplo real $e uso $esse recurso# que vai melhorar o enten$imento $elas. 9classe 'nput*tream e suas filhas:
1 78. ) um $os principais f+runs brasileiros $e computa,(o e o maior em portu%u!s sobre .ava. 5 nova vers(o $o 78. ) basea$a em uma ferramenta $e perguntas e respostas 9@5: e tem uma comuni$a$e muito forte. *(o mais $e 1JB mil usu&rios pra aju$ar voc! a esclarecer suas $6vi$as. ;a,a sua per%unta.
=. 2ara que o c+$i%o $o main volte a compilar# troque o new +onta() por new +onta+orrente(). *e n(o po$emos $ar new em +onta# qual ) a utili$a$e $e ter um m)to$o que recebe uma refer!ncia a +onta como ar%umentoC 5li&s# posso ter issoC R. 5penas para enten$er melhor o a"stract# comente o m)to$o atualiMa() $a +ontaPoupanca# $essa forma ele her$ar& o m)to$o $iretamente $e +onta. Hransforme o m)to$o atualiMa() $a classe +onta em abstrato. Eepare que# ao colocar a palavra chave a"stract ao la$o $o m)to$o# o /clipse rapi$amente vai su%erir que voc! $eve remover o corpo 9bo$D: $o m)to$o com um quicG fi :
pu"lic a"stract class +onta ! (( atri"utos e mTto#os )ue 'I eAistiam & pu"lic a"stract voi# atualiMa(#ou"le taAaSelic);
@ual ) o problema com a classe +ontaPoupancaC K. Eeescreva o m)to$o atualiMa() na classe +ontaPoupanca para que a classe possa compilar normalmente. 1 eclipse tamb)m su%ere isso como um quicG fi :
J. 9opcional: / iste outra maneira $e a classe +onta+orrente compilar se voc! n(o reescrever o m)to$o abstratoC Q. 9opcional: 2ra que ter o m)to$o atualiMa na classe +onta se ele n(o faz na$aC 1 que acontece se simplesmente apa%armos esse m)to$o $a classe +onta e $ei armos o m)to$o atualiMa nas filhasC N. 9opcional: 2osso chamar um m)to$o abstrato $e $entro $e um outro m)to$o $a pr+pria classe abstrataC 8m e emplo: o mostra $o 8uncionario po$e invocar this. etSonificacao()C
C.@ - >esa-ios
1. 0(o po$emos $ar new em +onta# mas por que# ent(o# po$emos $ar new em +onta$/-%# por e emploC Captulo 1B
8nter-aces
"8ma ima%em vale mil palavras. 8ma interface vale mil ima%ens." 5o t)rmino $esse captulo# voc! ser& capaz $e: $izer o que ) uma interface e as $iferen,as entre heran,a e implementa,(o? escrever uma interface em .ava? utiliz&-las como um po$eroso recurso para $iminuir acoplamento entre as classes.
/ a classe \erente:
class \erente eAten#s 8uncionario !
pu"lic "oolean autentica(int senha) ! (( verifica a)ui se a senha confere com a rece"i#a como parametro (( no caso #o erente verifica tam"Tm se o #epartamento #ele (( tem acesso & &
Eepare que o m)to$o $e autentica,(o $e ca$a tipo $e 8uncionario po$e variar muito. "as vamos aos problemas. Consi$ere o SistemaQnterno e seu controle: precisamos receber um Eiretor ou \erente como ar%umento# verificar se ele se autentica e coloc&-lo $entro $o sistema.
class SistemaQnterno ! voi# lo in(8uncionario funcionario) ! (( invocar o mTto#o autentica] (( no #a! Dem to#o 8uncionario tem & &
1 SistemaQnterno aceita qualquer tipo $e 8uncionario# ten$o ele acesso ao sistema ou n(o# mas note que nem to$o 8uncionario possui o m)to$o autentica. 'sso nos impe$e $e chamar esse m)to$o com uma refer!ncia apenas a 8uncionario 9haveria um erro $e compila,(o:. 1 que fazer ent(oC
class SistemaQnterno ! voi# lo in(8uncionario funcionario) ! funcionario.autentica(...); (( no compila & &
8ma possibili$a$e ) criar $ois m)to$os lo in no SistemaQnterno: um para receber Eiretor e outro para receber \erente. .& vimos que essa n(o ) uma boa escolha. 2or qu!C
class SistemaQnterno ! (( #esi n pro"lemItico voi# lo in(Eiretor funcionario) ! funcionario.autentica(...); & (( #esi n pro"lemItico voi# lo in(\erente funcionario) ! funcionario.autentica(...); & &
Ca$a vez que criarmos uma nova classe $e 8uncionario que ) autentic vel# precisaramos a$icionar um novo m)to$o $e lo%in no SistemaQnterno. 0todos com mesmo nome /m .ava# m)to$os po$em ter o mesmo nome $es$e que n(o sejam amb%uos# isto )# que e ista uma maneira $e $istin%uir no momento $a chama$a.
'sso se chama sobrecar#a $e m)to$o. 9Overloadin#. 0(o confun$ir com overridin## que ) um conceito muito mais po$eroso:. 8ma solu,(o mais interessante seria criar uma classe no meio $a &rvore $e heran,a# 8uncionarioJutenticavel:
class 8uncionarioJutenticavel eAten#s 8uncionario ! pu"lic "oolean autentica(int senha) ! (( faM autenticacao pa#ro & (( outros atri"utos e mTto#os &
5s classes Eiretor e \erente passariam a esten$er $e 8uncionarioJutenticavel# e o SistemaQnterno receberia refer!ncias $esse tipo# como a se%uir:
class SistemaQnterno ! voi# lo in(8uncionarioJutenticavel fa) ! int senha G ((pe a senha #e um lu arF ou #e um scanner #e pole ar (( a)ui eu posso chamar o autentica! (( Pois to#o 8uncionarioJutenticavel tem "oolean o0 G fa.autentica(senha); & &
Eepare que 8uncionarioJutenticavel ) uma forte can$i$ata a classe abstrata. "ais ain$a# o m)to$o autentica po$eria ser um m)to$o abstrato. 1 uso $e heran,a resolve esse caso# mas vamos a uma outra situa,(o um pouco mais comple a: precisamos que to$os os clientes tamb)m tenham acesso ao SistemaQnterno. 1 que fazerC 8ma op,(o ) criar outro m)to$o lo in em SistemaQnterno: mas j& $escartamos essa anteriormente. 8ma outra# que ) comum entre os novatos# ) fazer uma heran,a sem senti$o para resolver o problema# por e emplo# fazer +liente eAten#s 8uncionarioJutenticavel. Eealmente# resolve o problema# mas trar& $iversos outros. +liente $efinitivamente no 8uncionarioJutenticavel. *e voc! fizer isso# o +liente ter&# por e emplo# um m)to$o etSonificacao# um atributo salario e outros membros que n(o fazem o menor senti$o para esta classeO 0(o fa,a heran,a quan$o a rela,(o n(o ) estritamente ") um".
Como resolver essa situa,(oC 0ote que conhecer a sinta e $a lin%ua%em n(o ) o suficiente# precisamos estruturar/$esenhar bem a nossa estrutura $e classes.
1D.2 - 8nter-aces
1 que precisamos para resolver nosso problemaC 5rranjar uma forma $e po$er referenciar
Eiretor# \erente e +liente $e uma mesma maneira# isto )# achar um fator comum. *e e istisse uma forma na qual essas classes %arantissem a e ist!ncia $e um $etermina$o m)to$o# atrav)s $e um contrato# resolveramos o problema. Ho$a classe $efine = itens: o que uma classe faz 9as assinaturas $os m)to$os: como uma classe faz essas tarefas 9o corpo $os m)to$os e atributos priva$os: 2o$emos criar um "contrato" que $efine tu$o o que uma classe $eve fazer se quiser ter um $etermina$o status. 'ma%ine:
contrato Jutenticavel, )uem )uiser ser Jutenticavel precisa sa"er faMer, /.autenticar #a#a uma senhaF #evolven#o um "ooleano
@uem quiser# po$e "assinar" esse contrato# sen$o assim obri%a$o a e plicar como ser& feita essa autentica,(o. 5 vanta%em ) que# se um \erente assinar esse contrato# po$emos nos referenciar a um \erente como um Jutenticavel. 2o$emos criar esse contrato em .avaO
interface Jutenticavel ! "oolean autentica(int senha); &
Chama-se interface pois ) a maneira pela qual po$eremos conversar com um Jutenticavel. 'nterface ) a maneira atrav)s $a qual conversamos com um objeto. Femos a interface $a se%uinte maneira: 'quem desejar ser autentic vel precisa saber autenticar dado um inteiro e retornando um booleano'. /la ) um contrato on$e quem assina se responsabiliza por implementar esses m)to$os 9cumprir o contrato:. 8ma interface po$e $efinir uma s)rie $e m)to$os# mas nunca conter implementa,(o $eles. /la s+ e p-e o que o objeto deve -a.er# e n(o como ele -a.# nem o que ele tem. Como ele -a. vai ser $efini$o em uma implementao $essa interface. / o \erente po$e "assinar" o contrato# ou seja# implementar a interface. 0o momento em que ele implementa essa interface# ele precisa escrever os m)to$os pe$i$os pela interface 9muito pareci$o com o efeito $e her$ar m)to$os abstratos# ali&s# m)to$os $e uma interface s(o p6blicos e abstratos# sempre:. 2ara implementar usamos a palavra chave implements na classe:
class \erente eAten#s 8uncionario implements Jutenticavel ! private int senha; (( outros atri"utos e mTto#os pu"lic "oolean autentica(int senha) ! if(this.senha !G senha) ! return false; & (( po#e faMer outras poss?veis verificabesF como sa"er se esse (( #epartamento #o erente tem acesso ao Sistema & return true;
&
1 implements po$e ser li$o $a se%uinte maneira: "5 classe \erente se compromete a ser trata$a como Jutenticavel# sen$o obri%a$a a ter os m)to$os necess&rios# $efini$os neste contrato". 5 partir $e a%ora# po$emos tratar um \erente como sen$o um Jutenticavel. 7anhamos mais polimorfismoO Hemos mais uma forma $e referenciar a um \erente. @uan$o crio uma vari&vel $o tipo Jutenticavel# estou crian$o uma refer!ncia para qualquer objeto $e uma classe que implemente Jutenticavel# $ireta ou in$iretamente:
Jutenticavel a G new \erente(); (( posso a)ui chamar o mTto#o autentica!
0ovamente# a utiliza,(o mais comum seria receber por ar%umento# como no nosso SistemaQnterno:
class SistemaQnterno ! voi# lo in(Jutenticavel a) ! int senha G (( pe a senha #e um lu arF ou #e um scanner #e pole ar "oolean o0 G a.autentica(senha); (( a)ui eu posso chamar o autentica! (( no necessariamente T um 8uncionario! (( Mais ain#aF eu no sei )ue o"'eto a (( referXncia "a" estI apontan#o eAatamente! 8leAi"ili#a#e.
& &
2rontoO / j& po$emos passar qualquer Jutenticavel para o SistemaQnterno. /nt(o precisamos fazer com que o Eiretor tamb)m implemente essa interface.
class Eiretor eAten#s 8uncionario implements Jutenticavel ! (( mTto#os e atri"utosF alTm #e o"ri atoriamente ter o autentica &
2o$emos passar um Eiretor. 0o $ia em que tivermos mais um funcion&rio com acesso ao sistema# basta que ele implemente essa interface# para se encai ar no sistema. @ualquer Jutenticavel passa$o para o SistemaQnterno est& bom para n+s. Eepare que pouco importa quem o objeto referencia$o realmente )# pois ele tem um m)to$o autentica que ) o necess&rio para nosso SistemaQnterno funcionar corretamente. 5li&s# qualquer outra classe que futuramente implemente essa interface po$er& ser passa$a como ar%umento aqui.
Jutenticavel #iretor G new Eiretor(); Jutenticavel erente G new \erente();
1u# se achamos que o 8ornece#or precisa ter acesso# basta que ele implemente Jutenticavel. 1lhe s+ o tamanho $o $esacoplamento: quem escreveu o SistemaQnterno s+ precisa saber que ele ) Jutenticavel.
class SistemaQnterno ! voi# lo in(Jutenticavel a) ! (( no importa se ele T um erente ou #iretor (( serI )ue T um fornece#or] (( CuF o pro rama#or #o SistemaQnternoF no me preocupo (( Qnvocarei o mTto#o autentica & &
0(o faz $iferen,a se ) um Eiretor# \erente# +liente ou qualquer classe que venha por a. Basta se%uir o contratoO "ais ain$a# ca$a Jutenticavel po$e se autenticar $e uma maneira completamente $iferente $e outro. Fembre-se: a interface $efine que to$os v(o saber se autenticar 9o que ele faz:# enquanto a implementa,(o $efine como e atamente vai ser feito 9como ele faz:. 5 maneira como os objetos se comunicam num sistema orienta$o a objetos ) muito mais importante $o que como eles e ecutam. O que um objeto -a. ) mais importante $o que como ele -a.. 5queles que se%uem essa re%ra# ter(o sistemas mais f&ceis $e manter e mo$ificar. Como voc! j& percebeu# esta ) uma $as i$eias principais que queremos passar e# provavelmente# a mais importante $e to$o esse curso. 7erana entre inter-aces 3iferentemente $as classes# uma interface po$e her$ar $e mais $e uma interface. L como um contrato que $epen$e que outros contratos sejam fecha$os antes $este valer. 4oc! n(o her$a m)to$os e atributos# mas sim responsabili$a$es. Bova editora Casa do C*di#o com livros de uma -orma di-erente
/$itoras tra$icionais pouco li%am para ebooGs e novas tecnolo%ias. 0(o conhecem pro%rama,(o para revisar os livros tecnicamente a fun$o. 0(o t!m anos $e e peri!ncia em $i$&ticas com cursos. Conhe,a a Casa do C*di#o# uma e$itora $iferente# com cura$oria $a Caelum e obsess(o por livros $e quali$a$e a pre,os justos. Casa $o C+$i%o# ebooG com pre,o $e ebooG.
prefira composi,(o" e a outra# "pro%rame volta$o a interface e n(o < implementa,(o". 4eremos o uso $e interfaces no captulo $e cole,-es# o que melhora o enten$imento $o assunto. 1 e emplo $a interface +ompara"le tamb)m ) muito esclarece$or# on$e en er%amos o reaproveitamento $e c+$i%o atrav)s $as interfaces# al)m $o encapsulamento. 2ara o m)to$o +ollections.sort()# pouco importa quem vai ser passa$o como ar%umento. 2ara ele# basta que a cole,(o seja $e objetos compar&veis. /le po$e or$enar Clefante# +oneAao ou +onta+orrente# $es$e que implementem +ompara"le.
5pesar $o 'ava.s)l.+onnection n(o trabalhar bem assim# a i$eia ) muito similar# por)m as cone -es v!m $e uma "actor3 chama$a EriverMana er. Cone (o a banco $e $a$os est& fora $o escopo $esse treinamento# mas ) um $os primeiros t+picos abor$a$os no curso ;.-=1# juntamente com 351. )m pouco mais... 2osso substituir to$a minha heran,a por interfacesC @ual ) a vanta%em e a $esvanta%emC
class [etan ulo implements Jrea+alculavel ! private int lar ura; private int altura; pu"lic [etan ulo(int lar uraF int altura) ! this.lar ura G lar ura; this.altura G altura; & pu"lic #ou"le calculaJrea() ! return this.lar ura H this.altura; &
&
Eepare que# aqui# se voc! tivesse usa$o heran,a# n(o iria %anhar muito# j& que ca$a implementa,(o ) totalmente $iferente $a outra: um Kua#ra#o# um [etan ulo e um +irculo t!m atributos e m)to$os bem $iferentes. "as# mesmo que eles tivessem atributos em comum# utilizar interfaces ) uma maneira muito mais ele%ante $e mo$elar suas classes. /las tamb)m trazem vanta%ens em n(o acoplar as classes. 8ma vez que heran,a atrav)s $e classes traz muito acoplamento# muitos autores renoma$os $izem que# na maioria $os casos# $erana quebra o encapsulamento# pensamento com o qual a equipe $a Caelum concor$a plenamente. Crie a se%uinte classe $e Peste. Eepare no polimorfismo. 2o$eramos passar esses objetos como ar%umento para al%u)m que aceitasse Jrea+alculavel como ar%umento:
class Peste ! pu"lic static voi# main(Strin $% ar s) ! Jrea+alculavel a G new [etan ulo(:F7); System.out.println(a.calculaJrea()); & &
8tilize Math.PQ H raio H raio para calcular a &rea. =. 0osso banco precisa tributar $inheiro $e al%uns bens que nossos clientes possuem. 2ara isso# vamos criar uma interface no nosso projeto banco j& e istente:
interface Pri"utavel ! #ou"le calculaPri"utos(); &
Femos essa interface $a se%uinte maneira: "to$os que quiserem ser tribut vel precisam saber calcular tributos# $evolven$o um $ouble". 5l%uns bens s(o tribut&veis e outros n(o# +ontaPoupanca n(o ) tribut&vel# j& para +onta+orrente voc! precisa pa%ar 1U $a conta e o Se uroEe5i#a tem uma ta a fi a $e K= reais. 5proveite o /clipseO @uan$o voc! escrever implements Pri"utavel na classe +onta+orrente# o quic! "i# $o /clipse vai su%erir que voc! reescreva o m)to$o? escolha essa op,(o e# $epois# preencha o corpo $o m)to$o a$equa$amente:
class +onta+orrente eAten#s +onta implements Pri"utavel !
(( outros atri"utos e mTto#os pu"lic #ou"le calculaPri"utos() ! return this. etSal#o() H -.-/; &
&
4amos criar uma classe PestaPri"utavel com um m)to$o main para testar o nosso e emplo:
class PestaPri"utavel ! pu"lic static voi# main(Strin $% ar s) ! +onta+orrente cc G new +onta+orrente(); cc.#eposita(/--); System.out.println(cc.calculaPri"utos()); (( testan#o polimorfismo, Pri"utavel t G cc; System.out.println(t.calculaPri"utos());
& &
Hente chamar o m)to$o etSal#o atrav)s $a refer!ncia t# o que ocorreC 2or qu!C 5 linha em que atribumos cc a um Pri"utavel ) apenas para voc! en er%ar que ) possvel faz!-lo. 0esse nosso caso# isso n(o tem uma utili$a$e. /ssa possibili$a$e ser& 6til para o pr+ imo e erccio. R. 9opcional: Crie um \erencia#orEeQmpostoEe[en#a# que recebe to$os os tribut&veis $e uma pessoa e soma seus valores e inclua nele um m)to$o para $evolver seu total:
class \erencia#orEeQmpostoEe[en#a ! private #ou"le total; voi# a#iciona(Pri"utavel t) ! System.out.println("J#icionan#o tri"utavel, " L t); this.total LG & pu"lic #ou"le etPotal() ! return this.total; & t.calculaPri"utos();
&
Crie um main para instanciar $iversas classes que implementam Pri"utavel e passar como ar%umento para um \erencia#orEeQmpostoEe[en#a. Eepare que voc! n(o po$e passar qualquer tipo $e conta para o m)to$o a$iciona# apenas a que implementa
Eepare que# $e $entro $o \erencia#orEeQmpostoEe[en#a# voc! n(o po$e acessar o m)to$o etSal#o# por e emplo# pois voc! n(o tem a %arantia $e que o Pri"utavel que vai ser passa$o como ar%umento tem esse m)to$o. 5 6nica certeza que voc! tem ) $e que esse objeto tem os m)to$os $eclara$os na interface Pri"utavel. L interessante en er%ar que as interfaces 9como aqui# no caso# Pri"utavel: costumam li%ar classes muito $istintas# unin$o-as por uma caracterstica que elas tem em comum. 0o nosso e emplo# Se uroEe5i#a e +onta+orrente s(o enti$a$es completamente $istintas# por)m ambas possuem a caracterstica $e serem tribut&veis. *e amanh( o %overno come,ar a tributar at) mesmo PlanoEe+apitaliMacao# basta que essa classe implemente a interface Pri"utavelO Eepare no %rau $e $esacoplamento que temos: a classe \erencia#orEeQmpostoEe[en#a nem ima%ina que vai trabalhar como PlanoEe+apitaliMacao. 2ara ela# o 6nico fato que importa ) que o objeto respeite o contrato $e um tribut&vel# isso )# a interface Pri"utavel. 0ovamente: pro%rame volta$o < interface# n(o < implementa,(o. @uais os benefcios $e manter o c+$i%o com bai o acoplamentoC K. 9opcional: 8se o m)to$o printf para imprimir o sal$o com e atamente $uas casas $ecimais:
System.out.printf("2 sal#o T, O.7f"F cc. etSal#o());
5 Alura oferece $ezenas $e cursos online em sua plataforma e clusiva $e ensino que favorece o apren$iza$o com a qualidade reconheci$a $a Caelum. 4oc! po$e escolher um curso nas &reas $e .ava# EubD# Peb# "obile# .0/H e outros# com uma assinatura que $& acesso a to$os os cursos. Conhe,a os cursos online 5lura.
5l%um c+$i%o vai ter $e ser copia$o e cola$oC 'sso ) t(o ruimC =. 91pcional: Xs vezes# ) interessante criarmos uma interface que her$a $e outras interfaces: essas# s(o chama$as subinterfaces. /ssas# na$a mais s(o $o que um a%rupamento $e obri%a,-es para a classe que a implementar.
interface +ontaPri"utavel eAten#s +ontaF Pri"utavel ! &
3essa maneira# quem for implementar essa nova interface precisa implementar to$os os m)to$os her$a$os $as suas superinterfaces 9e talvez ain$a novos m)to$os $eclara$os $entro $ela::
class +onta+orrente implements +ontaPri"utavel ! (( mTto#os & +onta c G new +onta+orrente(); Pri"utavel t G new +onta+orrente();
Eepare que o c+$i%o po$e parecer estranho# pois a interface n(o $eclara m)to$o al%um# s+ her$a os m)to$os abstratos $eclara$os nas outras interfaces. 5o mesmo tempo que uma interface po$e her$ar $e mais $e uma outra interface# classes s+ po$em possuir uma classe m(e 9heran,a simples:.
11.1 - 0otivao
4oltan$o <s +ontas que criamos no captulo Q# o que aconteceria ao tentar chamar o m)to$o saca com um valor fora $o limiteC 1 sistema mostraria uma mensa%em $e erro# mas quem chamou o m)to$o saca n(o saber& que isso aconteceu. Como avisar aquele que chamou o m)to$o $e que ele n(o conse%uiu fazer aquilo que $everiaC /m .ava# os m)to$os $izem qual o contrato que eles $evem se%uir. *e# ao tentar sacar# ele n(o conse%ue fazer o que $everia# ele precisa# ao menos# avisar ao usu&rio que o saque n(o foi feito. 4eja no e emplo abai o: estamos for,an$o uma +onta a ter um valor ne%ativo# isto )# estar num esta$o inconsistente $e acor$o com a nossa mo$ela%em.
+onta minha+onta G new +onta(); minha+onta.#eposita(/--); minha+onta.set9imite(/--); minha+onta.saca(/---); (( o sal#o T *Y--] c /--] c -] J chama#a ao mTto#o saca funcionou]
/m sistemas $e ver$a$e# ) muito comum que quem saiba tratar o erro ) aquele que chamou o m)to$o e n(o a pr+pria classeO 2ortanto# na$a mais natural $o que a classe sinalizar que um erro ocorreu. 5 solu,(o mais simples utiliza$a anti%amente ) a $e marcar o retorno $e um m)to$o como "oolean e retornar true# se tu$o ocorreu $a maneira planeja$a# ou false# caso contr&rio:
"oolean saca(#ou"le )uanti#a#e) ! (( posso sacar atT sal#oLlimite if ()uanti#a#e 4 this.sal#o L this.limite) ! System.out.println("Do posso sacar fora #o limite!"); return false; & else ! this.sal#o G this.sal#o * )uanti#a#e; return true; & &
&
Eepare que tivemos $e lembrar $e testar o retorno $o m)to$o# mas n(o somos obri%a$os a fazer isso. /squecer $e testar o retorno $esse m)to$o teria consequ!ncias $r&sticas: a m&quina $e autoaten$imento po$eria vir a liberar a quantia $eseja$a $e $inheiro# mesmo que o sistema n(o tivesse conse%ui$o efetuar o m)to$o saca com sucesso# como no e emplo a se%uir:
+onta minha+onta G new +onta(); minha+onta.#eposita(/--); (( ... #ou"le valor G ;---; minha+onta.saca(valor); (( vai retornar falseF mas nin uTm verifica! caiAaCletronico.emite(valor);
"esmo invocan$o o m)to$o e tratan$o o retorno $e maneira correta# o que faramos se fosse necess&rio sinalizar quan$o o usu&rio passou um valor ne%ativo como quantidadeC 8ma solu,(o seria alterar o retorno $e "oolean para int e retornar o c+$i%o $o erro que ocorreu. 'sso ) consi$era$o uma m& pr&tica 9conheci$a tamb)m como uso $e "magic numbers":. 5l)m $e voc! per$er o retorno $o m)to$o# o valor $evolvi$o ) "m&%ico" e s+ le%vel perante e tensa $ocumenta,(o# al)m $e n(o obri%ar o pro%rama$or a tratar esse retorno e# no caso $e esquecer isso# seu pro%rama continuar& ro$an$o j& num esta$o inconsistente. Eepare o que aconteceria se fosse necess&rio retornar um outro valor. 1 e emplo abai o mostra um caso on$e# atrav)s $o retorno# n(o ser& possvel $escobrir se ocorreu um erro ou n(o# pois o m)to$o retorna um cliente.
pu"lic +liente procura+liente(int i#) ! if (i#Qnvali#o) ! (( avisa o mTto#o )ue chamou este )ue ocorreu um erro & else ! +liente cliente G new +liente(); cliente.setQ#(i#); (( cliente.setDome("nome #o cliente"); return cliente; & &
2or esses e outros motivos# utilizamos um c+$i%o $iferente em .ava para tratar aquilo que chamamos $e e ce,-es: os casos on$e acontece al%o que# normalmente# n(o iria acontecer. 1 e emplo $o ar%umento $o saque inv&li$o ou $o i# inv&li$o $e um cliente ) uma e!ceo < re%ra. =!ceo 8ma e ce,(o representa uma situa,(o que normalmente n(o ocorre e representa al%o $e estranho ou inespera$o no sistema.
&
static voi# meto#o/() ! System.out.println("inicio #o meto#o/"); meto#o7(); System.out.println("fim #o meto#o/"); & static voi# meto#o7() ! System.out.println("inicio #o meto#o7"); int$% array G new int$/-%; for (int i G -; i 3G /;; iLL) ! array$i% G i; System.out.println(i); & System.out.println("fim #o meto#o7"); & &
Eepare o m)to$o main chaman$o meto#o/ e esse# por sua vez# chaman$o o meto#o7. Ca$a um $esses m)to$os po$e ter suas pr+prias vari&veis locais# isto ): o meto#o/ n(o en er%a as vari&veis $eclara$as $entro $o main e por a em $iante. Como o .ava 9e muitas $as outras lin%ua%ens: faz issoC Ho$a invoca,(o $e m)to$o ) empilha$a em uma estrutura $e $a$os que isola a &rea $e mem+ria $e ca$a um. @uan$o um m)to$o termina 9retorna:# ele volta para o m)to$o que o invocou. /le $escobre isso atrav)s $a pil$a de e!ecuo 9stac!:: basta remover o marca$or que est& no topo $a pilha:
2or)m# o nosso meto#o7 proposita$amente possui um enorme problema: est& acessan$o um n$ice $e arraD in$evi$o para esse caso? o n$ice estar& fora $os limites $a arraD quan$o che%ar em /-O Eo$e o c+$i%o. @ual ) a sa$aC 1 que isso representaC 1 que ela in$icaC
/ssa ) o conheci$o rastro da pil$a 9stac!trace:. L uma sa$a importantssima para o pro%rama$or - tanto que# em qualquer f+rum ou lista $e $iscuss(o# ) comum os pro%rama$ores enviarem# juntamente com a $escri,(o $o problema# essa stacGtrace. "as por que isso aconteceuC 1 sistema $e e ce,-es $o .ava funciona $a se%uinte maneira: quan$o uma e ce,(o ) lanada 9thro+:# a .4" entra em esta$o $e alerta e vai ver se o m)to$o atual toma al%uma precau,(o ao tentar e ecutar esse trecho $e c+$i%o. Como po$emos ver# o meto#o7 n(o toma nenhuma me$i$a $iferente $o que vimos at) a%ora. Como o meto#o7 n(o est& tratando esse problema# a .4" p&ra a e ecu,(o $ele anormalmente# sem esperar ele terminar# e volta um stac!"rame pra bai o# on$e ser& feita nova verifica,(o: "o meto#o/ est& se precaven$o $e um problema chama$o JrrayQn#eA2ut2fSoun#sCAceptionC" "0(o..." 4olta para o main# on$e tamb)m n(o h& prote,(o# ent(o a .4" morre 9na ver$a$e# quem morre ) apenas a Phrea# corrente# veremos mais para frente:. 1bviamente# aqui estamos for,an$o esse caso e n(o faria senti$o tomarmos cui$a$o com
ele. L f&cil arrumar um problema $esses: basta percorrermos a arraD no m& imo at) o seu len th. 2or)m# apenas para enten$er o controle $e flu o $e uma CAception# vamos colocar o c+$i%o que vai tentar 9tr3: e ecutar o bloco peri%oso e# caso o problema seja $o tipo JrrayQn#eA2ut2fSoun#sCAception# ele ser& pe#o 9caught:. Eepare que ) interessante que ca$a e ce,(o no .ava tenha um tipo... ela po$e ter atributos e m)to$os. =. 5$icione um try(catch em volta $o for# pe%an$o JrrayQn#eA2ut2fSoun#sCAception. 1 que o c+$i%o imprimeC
try ! for (int i G -; i 3G /;; iLL) ! array$i% G i; System.out.println(i); & & catch (JrrayQn#eA2ut2fSoun#sCAception e) ! System.out.println("erro, " L e); &
R. /m vez $e fazer o try em torno $o for inteiro# tente apenas com o bloco $e $entro $o for:
for (int i G -; i 3G /;; iLL) ! try ! array$i% G i; System.out.println(i); & catch (JrrayQn#eA2ut2fSoun#sCAception e) ! System.out.println("erro, " L e); & &
@ual ) a $iferen,aC
J. ;a,a o mesmo# retiran$o o try(catch novamente e colocan$o em volta $a chama$a $o meto#o/. Eo$e os c+$i%os# o que aconteceC
System.out.println("inicio #o main"); try ! meto#o/(); & catch (JrrayQn#eA2ut2fSoun#sCAception e) ! System.out.println("Crro , "Le); & System.out.println("fim #o main");
Eepare que# a partir $o momento que uma e ception foi catched 9pe%a# trata$a# han$le$:# a e ecu,(o volta ao normal a partir $aquele ponto. +oc, no est1 nessa p1#ina a toa
4oc! che%ou aqui porque a Caelum ) refer!ncia nacional em cursos $e .ava# EubD# 5%ile# "obile# Peb e .0/H. ;a,a curso com quem escreveu essa apostila. Consulte as vanta%ens $o curso Java e Orientao a Objetos.
pu"lic class Pestan#o[eferenciaDula ! pu"lic static voi# main(Strin ar s$%) ! +onta c G null; System.out.println("Sal#o atual " L c. etSal#o()); & &
Eepare que um JrrayQn#eA2ut2fSoun#sCAception ou um DullPointerCAception po$eria ser facilmente evita$o com o for corretamente escrito ou com ifs que checariam os limites $a arraD. 1utro caso em que tamb)m ocorre tal tipo $e e ce,(o ) quan$o um cast erra$o ) feito 9veremos mais pra frente:. /m to$os os casos# tais problemas provavelmente po$eriam ser evita$os pelo pro%rama$or. L por esse motivo que o java n(o te obri%a a $ar o trD/catch nessas e ceptions e chamamos essas e ce,-es $e unchec!ed. /m outras palavras# o compila$or n(o checa se voc! est& tratan$o essas e ce,-es.
=rros 1s erros em .ava s(o um tipo $e e ce,(o que tamb)m po$em ser trata$os. /les representam problemas na m&quina virtual e n(o $evem ser trata$os em AAU $os casos# j& que provavelmente o melhor a se fazer ) $ei ar a .4" encerrar 9ou apenas a Hhrea$ em quest(o:.
1 c+$i%o acima n(o compila e o compila$or avisa que ) necess&rio tratar o 8ileDot8oun#CAception que po$e ocorrer:
2ara compilar e fazer o pro%rama funcionar# temos $uas maneiras que po$emos tratar o problema. 1 primeiro# ) trat&-lo com o try e catch $o mesmo jeito que usamos no e emplo anterior# com uma arraD:
pu"lic static voi# meto#o() ! try ! new 'ava.io.8ileQnputStream("ar)uivo.tAt"); & catch ('ava.io.8ileDot8oun#CAception e) ! System.out.println("Dao foi poss?vel a"rir o ar)uivo para leitura"); & &
5 se%un$a forma $e tratar esse erro# ) $ele%ar ele para quem chamou o nosso m)to$o# isto )# passar para a frente.
pu"lic static voi# meto#o() throws 'ava.io.8ileDot8oun#CAception ! new 'ava.io.8ileQnputStream("ar)uivo.tAt"); &
0o /clipse ) bem simples fazer tanto um try(catch como um throws: Hente $i%itar esse c+$i%o no eclipse:
pu"lic class PestaCAception !
/ voc! tem $uas op,-es: 1. 8dd thro+s declaration# que vai %erar:
pu"lic class PestaCAception ! pu"lic static voi# main(Strin $% ar s) throws 8ileDot8oun#CAception ! new 'ava.io.8ileQnputStream("ar)uivo.tAt"); & &
0o incio# e iste uma %ran$e tenta,(o $e sempre passar o problema pra frente para outros o tratarem. 2o$e ser que fa,a senti$o# $epen$en$o $o caso# mas n(o at) o main# por e emplo. 5contece que quem tenta abrir um arquivo sabe como li$ar com um problema na leitura. @uem chamou um m)to$o no come,o $o pro%rama po$e n(o saber ou# pior ain$a# tentar abrir cinco arquivos $iferentes e n(o saber qual $eles teve um problemaO 0(o h& uma re%ra para $eci$ir em que momento $o seu pro%rama voc! vai tratar $etermina$a e ce,(o. 'sso vai $epen$er $e em que ponto voc! tem con$i,-es $e tomar uma $ecis(o em rela,(o <quele erro. /nquanto n(o for o momento# voc! provavelmente vai preferir $ele%ar a responsabili$a$e para o m)to$o que te invocou. 8m outro problema comum ) quan$o trabalhamos com banco $e $a$os: Poas pr1ticas no tratamento de e!ce:es 0o blo% $a Caelum h& um e tenso arti%o $iscutin$o as boas pr&ticas em rela,(o ao tratamento $e e ce,-es. http://blo%.caelum.com.br/=BBQ/1B/BN/li$an$o-com-e ceptions/
Conhe,a a Casa do C*di#o# uma nova e$itora# com autores $e $estaque no merca$o# foco em ebooMs 923;# epub# mobi:# pre,os imbat"veis e assuntos atuais. Com a cura$oria $a Caelum e e celentes autores# ) uma abor$a%em di-erente para livros $e tecnolo%ia no Brasil. Conhe,a os ttulos e a nova proposta# voc! vai %ostar. Casa $o C+$i%o# livros para o pro%rama$or.
=. Com o throws:
pu"lic voi# a"re(Strin (( .. & ar)uivo) throws Q2CAceptionF SK9CAception !
R. 4oc! po$e# tamb)m# escolher tratar al%umas e ce,-es e $eclarar as outras no throws:
pu"lic voi# a"re(Strin ar)uivo) throws Q2CAception ! try ! o"'eto.meto#oKuePo#e9ancarQ2eSK9CAception(); & catch (SK9CAception e) ! (( .. & &
L $esnecess&rio $eclarar no throws as e ceptions que s(o unchec!ed# por)m ) permiti$o e <s vezes# facilita a leitura e a $ocumenta,(o $o seu c+$i%o.
2o$emos# tamb)m# lan,ar uma CAception# o que ) e tremamente 6til. 3essa maneira#
resolvemos o problema $e al%u)m po$er esquecer $e fazer um if no retorno $e um m)to$o. 5 palavra chave t$ro5# que est& no imperativo# lan,a uma CAception. 'sto ) bem $iferente $e throws# que est& no presente $o in$icativo# e que apenas avisa $a possibili$a$e $aquele m)to$o lan,&-la# obri%an$o o outro m)to$o que v& utilizar $este $e se preocupar com essa e ce,(o em quest(o.
voi# saca(#ou"le valor) ! if (this.sal#o 3 valor) ! throw new [untimeCAception(); & else ! this.sal#o*Gvalor; & &
0o nosso caso# lan,a uma $o tipo unchec!ed. [untimeCAception ) a e ception m(e $e to$as as e ceptions unchec!ed. 5 $esvanta%em# aqui# ) que ela ) muito %en)rica? quem receber esse erro n(o sabe $izer e atamente qual foi o problema. 2o$emos ent(o usar uma / ception mais especfica:
voi# saca(#ou"le valor) ! if (this.sal#o 3 valor) ! throw new Qlle alJr umentCAception(); & else ! this.sal#o*Gvalor; & &
Qlle alJr umentCAception $iz um pouco mais: al%o foi passa$o como ar%umento e seu m)to$o n(o %ostou. /la ) uma / ception unchec!ed pois esten$e $e [untimeCAception e j& faz parte $a biblioteca $o java. 9Qlle alJr umentCAception ) a melhor escolha quan$o um ar%umento sempre ) inv&li$o como# por e emplo# n6meros ne%ativos# refer!ncias nulas# etc:. 2ara pe%ar esse erro# n(o usaremos um if(else e sim um try(catch# porque faz mais senti$o j& que a falta $e sal$o ) uma e ce,(o:
+onta cc G new +onta+orrente(); cc.#eposita(/--); try ! cc.saca(/--); & catch (Qlle alJr umentCAception e) ! System.out.println("Sal#o Qnsuficiente"); &
2o$amos melhorar ain$a mais e passar para o construtor $a Qlle alJr umentCAception o motivo $a e ce,(o:
voi# saca(#ou"le valor) ! if (this.sal#o 3 valor) ! throw new Qlle alJr umentCAception("Sal#o insuficiente"); & else ! this.sal#o*Gvalor; & &
1 m)to$o etMessa e() $efini$o na classe Phrowa"le 9m(e $e to$os os tipos $e erros e e ceptions: vai retornar a mensa%em que passamos ao construtor $a Qlle alJr umentCAception.
try ! cc.saca(/--);
/ssa n(o parece uma op,(o boa# pois a mensa%em 'consegui sacar' ser& impressa mesmo que o catch seja aciona$o. *empre que temos al%o que $epen$e $a linha $e cima para ser correto# $evemos a%rup&-lo no try:
try ! cc.saca(;-); System.out.println("conse ui sacar #a corrente!"); & catch (Qlle alJr umentCAception e) ! System.out.println(e. etMessa e()); & try ! cp.saca(;-); System.out.println("conse ui sacar #a poupana!"); & catch (Qlle alJr umentCAception e) ! System.out.println(e. etMessa e()); &
"as h& ain$a uma outra op,(o: ima%ine que# para o nosso sistema# uma falha ao sacar $a conta poupan,a $eve parar o processo $e saques e nem tentar sacar $a conta corrente. 2ara isso# a%ruparamos mais ain$a:
try ! cc.saca(;-); System.out.println("conse ui sacar #a corrente!"); cp.saca(;-); System.out.println("conse ui sacar #a poupana!"); & catch (Qlle alJr umentCAception e) ! System.out.println(e. etMessa e()); &
O que voc, vai colocar dentro do try in-luencia muito a e!ecuo do pro#ramaO 2ense $ireito nas linhas que $epen$em uma $a outra para a e ecu,(o correta $a sua l+%ica $e ne%+cios. A#ora a mel$or $ora de aprender al#o novo
*e voc! %osta $e estu$ar essa apostila aberta $a Caelum# certamente vai %ostar $os novos cursos online que lan,amos na plataforma Alura. 4oc! estu$a a qualquer momento com a qualidade Caelum. Conhe,a a 5lura.
/m vez $e lan,ar um Qlle alJr umentCAception# vamos lan,ar nossa pr+pria e ception# com uma mensa%em que $ir& "*al$o 'nsuficiente":
voi# saca(#ou"le valor) ! if (this.sal#o 3 valor) ! throw new Sal#oQnsuficienteCAception("Sal#o QnsuficienteF" L "tente um valor menor"); & else ! this.sal#o*Gvalor; & &
/# para testar# crie uma classe que $eposite um valor e tente sacar um valor maior:
pu"lic static voi# main(Strin $% ar s) ! +onta cc G new +onta+orrente(); cc.#eposita(/-); try ! cc.saca(/--); & catch (Sal#oQnsuficienteCAception e) !
2o$emos transformar essa CAception $e unchec!ed para chec!ed# obri%an$o a quem chama esse m)to$o a $ar try*catch# ou throws:
pu"lic class Sal#oQnsuficienteCAception eAten#s CAception ! Sal#oQnsuficienteCAception(Strin super(messa e); & & messa e) !
>& tamb)m# no .ava N# um recurso po$eroso conheci$o como tr3)+ith)resources# que permite utilizar a sem[ntica $o finallD $e uma maneira bem mais simples# como veremos no captulo
=. Crie uma classe PestaEeposita com o m)to$o main. Crie uma +ontaPoupanca e tente $epositar valores inv&li$os:
1 que aconteceC AtenoF estamos usan$o a +ontaPoupanca porque# em captulos anteriores# sobrescrevemos o m)to$o #eposita $a +onta+orrente# provavelmente sem utilizar o super.#eposita. 5ssim# ela n(o se comportar& i%ual < +ontaPoupanca no caso $o valor ne%ativoO 4oc! po$e resolver isso utilizan$o o super.#eposita ou fazen$o apenas o teste com +ontaPoupanca. R. 5$icione o try(catch para tratar o erro:
pu"lic static voi# main(Strin $% ar s) ! +onta cp G new +ontaPoupanca(); try ! cp.#eposita(*/--); & catch (Qlle alJr umentCAception e) ! System.out.println("5ocX tentou #epositar um valor invIli#o"); & &
K. 5o lan,ar a Qlle alJr umentCAception# passe via construtor uma mensa%em a ser e ibi$a. Fembre que a Strin recebi$a como par[metro ) acessvel $epois via o m)to$o etMessa e() her$a$o por to$as as CAceptions.
pu"lic voi# #eposita(#ou"le valor) ! if (valor 3 -) ! throw new Qlle alJr umentCAception("5ocX tentou #epositar" L " um valor ne ativo"); & else ! this.sal#o LG valor * -./-; & &
Com isso# voc! precisar& fazer al%umas mu$an,as no PestaEeposita. Como ficou ele# $epois $e altera$oC J. Crie sua pr+pria CAception# 5alorQnvali#oCAception. 2ara isso# voc! precisa criar uma classe com esse nome que seja filha $e [untimeCAception.
pu"lic class 5alorQnvali#oCAception eAten#s [untimeCAception ! &
Fance-a em vez $e Qlle alJr umentCAception. @uais altera,-es voc! teve que fazer nas classes +onta e na PestaEepositaC AtenoF nem sempre ) interessante criarmos um novo tipo $e e ceptionO 3epen$e $o caso. 0este aqui# seria melhor ain$a utilizarmos Qlle alJr umentCAception. 5 boa pr&tica $iz que $evemos preferir usar as j& e istentes $o .ava sempre que possvel. Q. 9opcional: Coloque um construtor na classe 5alorQnvali#oCAception que receba valor inv&li$o que ele tentou passar 9isto )# ele vai receber um #ou"le valor:. @uan$o esten$emos uma classe# n(o her$amos seus construtores# mas po$emos acess&-los atrav)s $a palavra chave super $e $entro $e um construtor. 5s e ce,-es $o .ava possuem uma s)rie $e construtores 6teis para po$er popul&-las j& com uma mensa%em $e erro. /nt(o
vamos criar um construtor em 5alorQnvali#oCAception que $ele%ue para o construtor $e sua m(e. /ssa vai %uar$ar essa mensa%em para po$er mostr&-la ao ser invoca$o o m)to$o etMessa e:
pu"lic class 5alorQnvali#oCAception eAten#s [untimeCAception ! pu"lic 5alorQnvali#oCAception(#ou"le valor) ! super("5alor invali#o, " L valor); & &
3essa maneira# na hora $e $ar o throw new 5alorQnvali#oCAception voc! vai precisar passar esse valor como ar%umento:
if (valor 3 -) ! throw new 5alorQnvali#oCAception(valor); &
AtenoF voc! po$e se aproveitar $o /clipse para isso: comece j& passan$o o valor como ar%umento para o construtor $a e ception e o /clipse vai reclamar que n(o e iste tal construtor. 1 quicG fi 9ctrl L /: vai su%erir que ele seja construin$o# poupan$o-lhe tempoO / a%ora# como fica a classe PestaEepositaC N. 9opcional: 3eclare a classe 5alorQnvali#oCAception como filha $ireta $e CAception em vez $e [untimeCAception. /la passa a ser c$ecMed. 1 que isso resultaC 4oc! vai precisar avisar que o seu m)to$o #eposita()throws 5alorQnvali#oCAception# pois ela ) uma chec!ed e ception. 5l)m $isso# quem chama esse m)to$o vai precisar tomar uma $ecis(o entre try*catch ou throws. ;a,a uso $o quicG fi $o /clipse novamenteO 3epois# retorne a e ception para unchec!ed# isto )# para ser filha $e [untimeCAception# pois utilizaremos ela assim em e erccios $os captulos posteriores. Captulo 1=
12.1 - Or#ani.ao
@uan$o um pro%rama$or utiliza as classes feitas por outro# sur%e um problema cl&ssico: como escrever $uas classes com o mesmo nomeC 2or e emplo: po$e ser que a minha classe $e Eata funcione $e um certo jeito# e a classe Eata $e um cole%a# $e outro jeito. 2o$e ser que a classe $e Eata $e uma biblioteca funcione ain$a $e uma terceira maneira $iferente.
Como permitir que tu$o isso realmente funcioneC Como controlar quem quer usar qual classe $e EataC 2ensan$o um pouco mais# notamos a e ist!ncia $e um outro problema e $a pr+pria solu,(o: o sistema operacional n(o permite a e ist!ncia $e $ois arquivos com o mesmo nome sob o mesmo $iret+rio# portanto precisamos or%anizar nossas classes em $iret+rios $iferentes. 1s $iret+rios est(o $iretamente relaciona$os aos chama$os pacotes e costumam a%rupar classes $e funcionali$a$es similares ou relaciona$as. 2or e emplo# no pacote 'ava.util temos as classes Eate# SimpleEate8ormat e \re orian+alen#ar? to$as elas trabalham com $atas $e formas $iferentes.
12.2 - >iret*rios
*e a classe +liente est& no pacote "anco# ela $ever& estar no $iret+rio com o mesmo nome: "anco. *e ela se localiza no pacote "r.com.caelum."anco# si%nifica que est& no $iret+rio "r(com(caelum("anco . 5 classe +liente# que se localiza nesse 6ltimo $iret+rio menciona$o# $eve ser escrita $a se%uinte forma:
pac0a e "r.com.caelum."anco; class +liente ! (( ... &
;ica f&cil notar que a palavra chave pac0a e in$ica qual o pacote/$iret+rio cont)m esta classe. 8m pacote po$e conter nenhum ou mais subpacotes e/ou classes $entro $ele. Eadro da nomenclatura dos pacotes 1 pa$r(o $a sun para $ar nome aos pacotes ) relativo ao nome $a empresa que $esenvolveu a classe:
"r.com.nome#aempresa.nome#opro'eto.su"pacote "r.com.nome#aempresa.nome#opro'eto.su"pacote7 "r.com.nome#aempresa.nome#opro'eto.su"pacote7.su"pacote:
1s pacotes s+ possuem letras min6sculas# n(o importa quantas palavras estejam conti$as nele. /sse pa$r(o e iste para evitar ao m& imo o conflito $e pacotes $e empresas $iferentes. 5s classes $o pacote pa$r(o $e bibliotecas n(o se%uem essa nomenclatura# que foi $a$a para bibliotecas $e terceiros. &ire suas d'vidas no novo ()J ;espostas
1 78. ) um $os principais f+runs brasileiros $e computa,(o e o maior em portu%u!s sobre .ava. 5 nova vers(o $o 78. ) basea$a em uma ferramenta $e perguntas e respostas 9@5: e tem uma comuni$a$e muito forte. *(o mais $e 1JB mil usu&rios pra aju$ar voc! a esclarecer suas $6vi$as. ;a,a sua per%unta.
12.% - 8mport
2ara usar uma classe $o mesmo pacote# basta fazer refer!ncia a ela como foi feito at) a%ora simplesmente escreven$o o pr+prio nome $a classe. *e quisermos que a classe Sanco fique $entro $o pacote "r.com.caelum."anco# ela $eve ser $eclara$a assim:
pac0a e "r.com.caelum."anco; class Sanco ! Strin nome; +liente clientes$%; &
5 novi$a$e che%a ao tentar utilizar a classe Sanco 9ou +liente: em uma outra classe que esteja fora $esse pacote# por e emplo# no pacote "r.com.caelum.util:
pac0a e "r.com.caelum."anco.util; class PesteEoSanco ! pu"lic static voi# main(Strin ar s$%) ! "r.com.caelum."anco.Sanco meuSanco G new "r.com.caelum."anco.Sanco(); meuSanco.nome G "Sanco #o Srasil"; System.out.println(meuSanco.nome); & &
Eepare que precisamos referenciar a classe Sanco com to$o o nome $o pacote na sua frente. /sse ) o conheci$o 0ull3 :uali"ied *ame $e uma classe. /m outras palavras# esse ) o ver$a$eiro nome $e uma classe# por isso $uas classes com o mesmo nome em pacotes $iferentes n(o conflitam. "esmo assim# ao tentar compilar a classe anterior# sur%e um erro reclaman$o que a classe Sanco n(o est& visvel. 5contece que as classes s+ s(o visveis para outras no mesmo pacote e# para permitir que a classe PesteEoSanco veja e acesse a classe Sanco em outro pacote# precisamos alterar essa 6ltima e transform&-la em p6blica:
pac0a e "r.com.caelum."anco; pu"lic class Sanco ! Strin nome; +liente clientes$% G new +liente$7%; &
5 palavra chave pu"lic libera o acesso para classes $e outros pacotes. 3o mesmo jeito que o compila$or reclamou que a classe n(o estava visvel# ele reclama que o atributo/vari&vel membro tamb)m n(o est&. L f&cil $e$uzir como resolver o problema: utilizan$o novamente o mo$ifica$or pu"lic:
pac0a e "r.com.caelum."anco;
pu"lic class Sanco ! pu"lic Strin nome; pu"lic +liente clientes$% G new +liente$7%; &
2o$emos testar nosso e emplo anterior# lembran$o que utilizar atributos como p6blico n(o traz encapsulamento e est& aqui como ilustra,(o. 4oltan$o ao c+$i%o $o PesteEoSanco# ) necess&rio escrever to$o o pacote para i$entificar qual classe queremos usarC 1 e emplo que usamos ficou bem complica$o $e ler:
"r.com.caelum."anco.Sanco meuSanco G new "r.com.caelum."anco.Sanco();
/ iste uma maneira mais simples $e se referenciar a classe Sanco: basta import1-la $o pacote "r.com.caelum."anco:
pac0a e "r.com.caelum."anco.util; (( para po#ermos referenciar (( a Sanco #iretamente import "r.com.caelum."anco.Sanco; class PesteEoSanco ! pu"lic static voi# main(Strin ar s$%) ! Sanco meuSanco G new Sanco(); meuSanco.nome G "Sanco #o Srasil"; & &
'sso faz com que n(o precisemos nos referenciar utilizan$o o "ull3 quali"ied name# po$en$o utilizar Sanco $entro $o nosso c+$i%o em vez $e escrever o lon%o "r.com.caelum."anco.Sanco. pacMa#e4 import4 class L muito importante manter a or$emO 2rimeiro# aparece uma 9ou nenhuma: vez o pac0a e? $epois# po$e aparecer um ou mais imports? e# por 6ltimo# as $eclara,-es $e classes. import !.2...TU L possvel "importar um pacote inteiro" 9to$as as classes $o pacote# e!ceto os subpacotes: atrav)s $o corin%a H:
import 'ava.util.H;
'mportar to$as as classes $e um pacote n(o implica em per$a $e performance em tempo $e e ecu,(o# mas po$e trazer problemas com classes $e mesmo nomeO 5l)m $isso# importar $e um em um ) consi$era$o boa pr&tica# pois facilita a leitura para outros pro%rama$ores. 8ma '3/ como o /clipse j& vai fazer isso por voc!# assim como a or%aniza,(o em $iret+rios.
construtores e m)to$os po$em ser pu"lic. protecte# - 5quilo que ) protecte# po$e ser acessa$o por to$as as classes $o mesmo pacote e por to$as as classes que o esten$am# mesmo que essas n(o estejam no mesmo pacote. *omente atributos# construtores e m)to$os po$em ser protecte#. padro Hsem nen$um modi-icadorI - *e nenhum mo$ifica$or for utiliza$o# to$as as classes $o mesmo pacote t!m acesso ao atributo# construtor# m)to$o ou classe. private - 5 6nica classe capaz $e acessar os atributos# construtores e m)to$os priva$os ) a pr+pria classe. Classes# como conhecemos# n(o po$em ser private# mas atributos# construtores e m)to$os sim. Classes p'blicas 2ara melhor or%anizar seu c+$i%o# o .ava n(o permite mais $e uma classe p6blica por arquivo e o arquivo $eve ser DomeEa+lasse.'ava. 8ma vez que outros pro%rama$ores ir(o utilizar essa classe# quan$o precisarem olhar o c+$i%o $a mesma# fica mais f&cil encontr&-la saben$o que ela est& no arquivo $e mesmo nome. Classes aninha$as po$em ser protecte# ou private# mas esse ) um t+pico avan,a$o que n(o ser& estu$a$o nesse momento.
5ntes $e movermos nossas classes# $eclare-as como p6blicas e coloque-as em seus respectivos arquivos: um arquivo para ca$a classe. 4oc! po$e mover uma classe $e pacote arrastan$o-a para o $estino $eseja$o. Eepare que o /clipse j& $eclara pac0a es e imports necess&rios:
0o /clipse nunca precisamos $eclarar um import# pois ele sempre vai su%erir isso quan$o usarmos o +trlLCspao no nome $e uma classe. 4oc! tamb)m po$e usar o +trlL/ no caso $a $eclara,(o $e pacote possuir al%um erro. Bova editora Casa do C*di#o com livros de uma -orma di-erente
/$itoras tra$icionais pouco li%am para ebooGs e novas tecnolo%ias. 0(o conhecem pro%rama,(o para revisar os livros tecnicamente a fun$o. 0(o t!m anos $e e peri!ncia em $i$&ticas com cursos. Conhe,a a Casa do C*di#o# uma e$itora $iferente# com cura$oria $a Caelum e obsess(o por livros $e quali$a$e a pre,os justos. Casa $o C+$i%o# ebooG com pre,o $e ebooG.
ca$a cliente que quer utiliz&-lo. 1 jeito mais simples $e trabalhar com um conjunto $e classes ) compact&-los em um arquivo s+. 1 formato $e compacta,(o pa$r(o ) o `QP com a e tens(o $o arquivo compacta$o JJ[ . O arquivo .jar 1 arquivo jar ou Java A;chive# possui um conjunto $e classes 9e arquivos $e confi%ura,-es: compacta$os# no estilo $e um arquivo Mip . 1 arquivo 'ar po$e ser cria$o com qualquer compacta$or Mip $isponvel no merca$o# inclusive o pro%rama 'ar que vem junto com o .3T. 2ara criar um arquivo jar $o nosso pro%rama $e banco# basta ir ao $iret+rio on$e est(o conti$as as classes e usar o coman$o a se%uir para criar o arquivo "anco.'ar com to$as as classes $os pacotes "r.com.caelum.util e "r.com.caelum."anco:
'ar *cvf "anco.'ar "r(com(caelum(util(H.class "r(com(caelum("anco(H.class
2ara usar esse arquivo "anco.'ar para ro$ar o PesteEoSanco basta ro$ar o 'ava com o arquivo 'ar como ar%umento:
'ava *classpath "anco.'ar "r.com.caelum.util.PesteEoSanco
2ara a$icionar mais arquivos .'ar # que po$em ser bibliotecas# ao pro%rama basta ro$ar o java $a se%uinte maneira:
'ava *classpath "i"lioteca/.'ar;"i"lioteca7.'ar DomeEa+lasse
4ale lembrar que o ponto e vr%ula utiliza$o s+ ) v&li$o em ambiente Pin$ows. /m Finu # "ac e outros 8ni # ) o $ois pontos 9varia $e acor$o com o sistema operacional:. >& tamb)m um arquivo $e manifesto que cont)m informa,-es $o seu jar como# por e emplo# qual classe ele vai ro$ar quan$o o jar for chama$o. "as n(o se preocupe pois# com o /clipse# esse arquivo ) %era$o automaticamente. Pibliotecas 3iversas bibliotecas po$em ser controla$as $e acor$o com a vers(o por estarem sempre compacta$as em um arquivo .'ar. Basta verificar o nome $a biblioteca 9por e emplo lo 6'* /.7./:.'ar : para $escobrir a vers(o $ela. /nt(o ) possvel ro$ar $ois pro%ramas ao mesmo tempo# ca$a um utilizan$o uma vers(o $a biblioteca atrav)s $o par[metro *classpath $o java. Criando um .jar automaticamente / istem $iversas ferramentas que servem para automatizar o processo $e $eploD# que consiste em compilar# %erar $ocumenta,(o# bibliotecas etc. 5s $uas mais famosas s(o o AB& e o 0A+=B# ambos s(o projetos $o %rupo 5pache. 1 /clipse po$e %erar facilmente um jar# por)m# se o seu buil$ ) comple o e precisa preparar e copiar uma s)rie $e recursos# as ferramentas in$ica$as acima possuem sofistica$as maneiras $e ro$ar um script batch.
=. 0a tela / port 9como mostra a fi%ura abai o:# selecione a op,(o ".5E file" e aperte o bot(o "0e t". R. 0a op,(o ".5E file:"# selecione o local que voc! $eseja salvar o arquivo .5E. / aperte "0e t". K. 0a pr+ ima tela# simplesmente clique em ne t# pois n(o h& nenhuma confi%ura,(o a ser feita. J. 0a tela abai o# na op,(o "select the class of the application entrD point"# voc! $eve escolher qual classe ser& a classe que vai ro$ar automaticamente quan$o voc! e ecutar o .5E. Q. /ntre na linha $e coman$o: 'ava *'ar "anco.'ar L comum $ar um nome mais si%nificativo aos .5Es# incluin$o nome $a empresa# $o projeto e vers(o# como caelum*"anco*/.-.'ar. J1 con$ece os cursos online Alura?
5 Alura oferece $ezenas $e cursos online em sua plataforma e clusiva $e ensino que favorece o apren$iza$o com a qualidade reconheci$a $a Caelum. 4oc! po$e escolher um curso nas &reas $e .ava# EubD# Peb# "obile# .0/H e outros# com uma assinatura que $& acesso a to$os os cursos. Conhe,a os cursos online 5lura.
1%.% - Javadoc
Como vamos saber o que ca$a classe tem no .avaC @uais s(o seus m)to$os# o que eles fazemC 0a sala $e aula $a Caelum# voc! po$e acessar a $ocumenta,(o $i%itan$o na barra $e en$ere,o $o Browser: VcaelumVdocsVapiVinde!.$tml /# a partir $a 'nternet# voc! po$e acessar atrav)s $o linG: http://$ocs.oracle.com/javase/N/$ocs/api/ 0o site $a 1racle# voc! po$e 9e $eve: bai ar a $ocumenta,(o $as bibliotecas $o .ava# frequentemente referi$a como "javadoc" ou 52' 9sen$o na ver$a$e a $ocumenta,(o $a 52':.
0esta $ocumenta,(o# no qua$ro superior esquer$o# voc! encontra os pacotes e# no inferior esquer$o# est& a lista%em $as classes e interfaces $o respectivo pacote 9ou $e to$os# caso nenhum tenha si$o especifica$o:. Clican$o-se em uma classe ou interface# o qua$ro $a $ireita passa a $etalhar to$os atributos e m)to$os. Eepare que m)to$os e atributos priva$os n(o est(o a. 1 importante ) $ocumentar o que sua classe faz# e n(o como ela faz: $etalhes $e implementa,(o# como atributos e m)to$os priva$os# n(o interessam ao $esenvolve$or que usar& a sua biblioteca 9ou# ao menos# n(o $everiam interessar:. 4oc! tamb)m conse%ue %erar esse java$oc a partir $a linha $e coman$o# com o coman$o: 'ava#oc.
*e o Pin$ows ou o Finu foi confi%ura$o para trabalhar com a e tens(o 4jar# basta voc! $ar um $uplo clique no arquivo# que ele ser& "e ecuta$o": o arquivo Manifest ser& li$o para que ele $escubra qual ) a classe com main que o .ava $eve processar. =. 7ere o .ava$oc $o seu sistema. 2ara isso# v& ao menu $roject# $epois < op,(o =enerate Javadoc# se estiver na perspectiva .ava. *e n(o# $! um clique com o bot(o $ireito no seu projeto# escolha 2#port e $epois javadoc e si%a o proce$imento $escrito na 6ltima se,(o
$este captulo. 'n$epen$ente $a perspectiva que voc! usa no /clipse# voc! tamb)m po$e usar o ctrl J % e come,ar a escrever JavaEoc# at) que a op,(o $e e portar o .ava3oc apare,a. 8nter-ace versus implementao novamenteO Eepare que a $ocumenta,(o %era$a n(o mostra o conte6$o $os m)to$os# nem atributos e m)to$os priva$osO 'sso faz parte $a implementa,(o# e o que importa para quem usa uma biblioteca ) a interface: o que ela faz. Captulo 1K
O pacote java.lan#
"0ossas cabe,as s(o re$on$as para que os pensamentos possam mu$ar $e $ire,(o." 5o t)rmino $esse captulo# voc! ser& capaz $e: utilizar as principais classes $o pacote 'ava.lan e ler a $ocumenta,(o pa$r(o $e projetos java? usar a classe System para obter informa,-es $o sistema? utilizar a classe Strin $e uma maneira eficiente e conhecer seus $etalhes? usar as classes wrappers 9como Qnte er: e bo in%? utilizar os m)to$os her$a$os $e 2"'ect para %eneralizar seu conceito $e objetos.
/la tamb)m possui o atributo in# que l! $a entra$a pa$r(o# por)m s+ conse%ue captar bDtes:
int i G System.in.rea#();
1 c+$i%o acima $eve estar $entro $e um bloco $e try e catch# pois po$e lan,ar uma e ce,(o Q2CAception. L 6til ficar len$o $e "yte em "yteC Hrabalharemos mais com a entra$a pa$r(o tamb)m no pr+ imo captulo. 1 System conta tamb)m com um m)to$o que simplesmente $esli%a a virtual machine# retornan$o um c+$i%o $e erro para o sistema operacional# ) o eAit.
System.eAit(-);
4eremos tamb)m um pouco mais sobre a classe System no pr+ imo captulo e no $e Phrea#s. Consulte a $ocumenta,(o $o .ava e veja outros m)to$os 6teis $a System. A classe ;untime 5 classe [untime possui um m)to$o para fazer uma chama$a ao sistema operacional e ro$ar al%um pro%rama:
[untime rt G [untime. et[untime(); Process p G rt.eAec("#ir");
'sto $eve ser evita$o ao m& imo# j& que %era uma $epen$!ncia $a sua aplica,(o com o sistema operacional em quest(o# per$en$o a portabili$a$e entre plataformas. /m muitos casos# isso po$e ser substitu$o por chama$as <s bibliotecas $o .ava. 0esse caso# por e emplo# voc! tem um m)to$o list na classe 8ile $o pacote $e entra$a e sa$a# que veremos posteriormente. 1 m)to$o eAec te retorna um Process# on$e voc! ) capaz $e pe%ar a sa$a $o pro%rama# enviar $a$os para a entra$a# entre outros. eus livros de tecnolo#ia parecem do sculo passado?
Conhe,a a Casa do C*di#o# uma nova e$itora# com autores $e $estaque no merca$o# foco em ebooMs 923;# epub# mobi:# pre,os imbat"veis e assuntos atuais. Com a cura$oria $a Caelum e e celentes autores# ) uma abor$a%em di-erente para livros $e tecnolo%ia no Brasil. Conhe,a os ttulos e a nova proposta# voc! vai %ostar. Casa $o C+$i%o# livros para o pro%rama$or.
16.% - java.lan#.Object
*empre quan$o $eclaramos uma classe# essa classe ) obri#ada a her$ar $e outra. 'sto )# para to$a classe que $eclararmos# e iste uma superclasse. 2or)m# criamos $iversas classes sem her$ar $e nin%u)m:
class Minha+lasse ! &
@uan$o o .ava n(o encontra a palavra chave eAten#s# ele consi$era que voc! est& her$an$o $a classe 2"'ect# que tamb)m se encontra $entro $o pacote 'ava.lan . 4oc! at) mesmo po$e escrever essa heran,a# que ) o mesmo:
class Minha+lasse eAten#s 2"'ect ! &
&odas as classes4 sem e!ceo4 $erdam de 2"'ect # seja $ireta ou in$iretamente# pois ela ) a m(e# v+# bisav+# etc $e qualquer classe. 2o$emos tamb)m afirmar que qualquer objeto em .ava ) um 2"'ect# po$en$o ser referencia$o como tal. /nt(o# qualquer objeto possui to$os os m)to$os $eclara$os na classe 2"'ect e veremos al%uns $eles lo%o ap+s o casting.
&
"as# e no momento que retirarmos uma refer!ncia a esse objeto# como vamos acessar os m)to$os e atributos $esse objetoC *e estamos referencian$o-o como 2"'ect# n(o po$emos acess&-lo como sen$o +onta. 4eja o e emplo a se%uir:
\uar#a#orEe2"'etos uar#a#or G new \uar#a#orEe2"'etos(); +onta conta G new +onta(); uar#a#or.a#iciona2"'eto(conta); (( ... (( pe a a conta referencia#o como o"'eto 2"'ect o"'ect G uar#a#or.pe a2"'eto(-); (( serI )ue posso invocar o"'ect. etSal#o(); etSal#o em 2"'ect] ,
2o$eramos ent(o atribuir essa refer!ncia $e 2"'ect para +onta para $epois invocar o etSal#o()C Hentemos:
+onta conta[es ata#a G o"'ect;
0+s temos certeza $e que esse 2"'ect se refere a uma +onta# j& que fomos n+s que o a$icionamos na classe que %uar$a objetos. "as o compila$or .ava n(o tem %arantias sobre issoO /ssa linha acima n(o compila# pois nem to$o 2"'ect ) uma +onta. 2ara realizar essa atribui,(o# para isso $evemos "avisar" o compila$or .ava que realmente queremos fazer isso# saben$o $o risco que corremos. ;azemos o castin# de re-er,ncias# pareci$o com $e tipos primitivos:
+onta conta[es ata#a G (+onta) o"'ect;
1 c+$i%o passa a compilar# mas ser& que ro$aC /sse c+$i%o ro$a sem nenhum problema# pois em tempo $e e ecu,(o a .4" verificar& se essa refer!ncia realmente ) para um objeto $e tipo +onta# e est&O *e n(o estivesse# uma e ce,(o $o tipo +lass+astCAception seria lan,a$a. 2o$eramos fazer o mesmo com 8uncionario e \erente. Hen$o uma refer!ncia para um 8uncionario que temos certeza ser um \erente# po$emos fazer a atribui,(o# $es$e que o castin% e ista# pois nem to$o 8uncionario ) um \erente.
8uncionario funcionario G new \erente();
((
\erente
\erente
/sse c+$i%o compilaC Eo$aC Compila# pois e iste a chance $e um 2"'ect ser um \erente. 2or)m n(o ro$a# ele vai lan,ar uma CAception 9+lass+astCAception: em tempo $e e ecu,(o. L importante $iferenciar tempo $e compila,(o e tempo $e e ecu,(o. 0este e emplo# n+s %arantimos ao java que nosso 1bjeto o"'ect era um \erente com o castin%# por isso compilou# mas na hora $e ro$ar# quan$o ele foi receber um \erente# ele recebeu uma +onta# $a ele reclamou lan,an$o +lass+astCAceptionO
&
Chaman$o o toStrin :
+onta c G new +onta(/--); System.out.println(c.toStrin ()); ((imprime, ema conta com valor, /--.
/ o melhor# se for apenas para jo%ar na tela# voc! nem precisa chamar o toStrin O /le j& )
7era o mesmo resulta$oO 4oc! ain$a po$e concatenar Strin s em .ava com o opera$or L. *e o .ava encontra um objeto no meio $a concatena,(o# ele tamb)m chama o toStrin $ele.
+onta c G new +onta(/--); System.out.println("#escrio, " L c);
1 outro m)to$o muito importante ) o e)uals. @uan$o comparamos $uas vari&veis refer!ncia no .ava# o GG verifica se as $uas referem-se ao mesmo objeto:
+onta c/ G new +onta(/--); +onta c7 G new +onta(/--); if (c/ !G c7) ! System.out.println("o"'etos referencia#os so #iferentes!"); &
/# nesse caso# realmente s(o $iferentes. "as# e se fosse preciso comparar os atributosC @uais atributos ele $everia compararC 1 .ava por si s+ n(o faz isso# mas e iste um m)to$o na classe 2"'ect que po$e ser reescrito para criarmos esse crit)rio $e compara,(o. /sse m)to$o ) o e)uals. 1 e)uals recebe um 2"'ect como ar%umento e $eve verificar se ele mesmo ) i%ual ao 2"'ect recebi$o para retornar um "oolean. *e voc! n(o reescrever esse m)to$o# o comportamento her$a$o ) fazer um GG com o objeto recebi$o como ar%umento.
pu"lic class +onta ! private #ou"le sal#o; (( outros atri"utos... pu"lic +onta(#ou"le sal#o) ! this.sal#o G sal#o; & pu"lic "oolean e)uals(2"'ect o"'ect) ! +onta outra+onta G (+onta) o"'ect; if (this.sal#o GG outra+onta.sal#o) ! return true; & return false; & pu"lic Strin toStrin () ! return "ema conta com valor, " L this.sal#o; &
&
8m e emplo cl&ssico $o uso $o e)uals ) para $atas. *e voc! criar $uas $atas# isto )# $ois objetos $iferentes# conten$o :/(/-(/YZY# ao comparar com o GG receber& false# pois s(o refer!ncias para objetos $iferentes. *eria correto# ent(o# reescrever este m)to$o# fazen$o as compara,-es $os atributos# e o usu&rio passaria a invocar e)uals em vez $e comparar com GG. 4oc! po$eria criar um m)to$o com outro nome em vez $e reescrever e)uals que recebe 2"'ect# mas ele ) importante pois muitas bibliotecas o chamam atrav)s $o polimorfismo# como veremos no captulo $o 'ava.util.
1 m)to$o hash+o#e() an$a $e m(os $a$as com o m)to$o e)uals() e ) $e fun$amental enten$imento no caso $e voc! utilizar suas classes com estruturas $e $a$os que usam tabelas $e espalhamento. Hamb)m falaremos $ele no captulo $e 'ava.util. ;e#ras para a reescrita do mtodo equals 2elo contrato $efini$o pela classe 2"'ect $evemos retornar false tamb)m no caso $o objeto passa$o n(o ser $e tipo compatvel com a sua classe. /nt(o antes $e fazer o castin% $evemos verificar isso# e para tal usamos a palavra chave instanceof# ou teramos uma e ception sen$o lan,a$a. 5l)m $isso# po$emos resumir nosso e)uals $e tal forma a n(o usar um if:
pu"lic "oolean e)uals(2"'ect o"'ect) ! if (!(o"'ect instanceof +onta)) return false; +onta outra+onta G (+onta) o"'ect; return this.sal#o GG outra+onta.sal#o; &
*e voc! %osta $e estu$ar essa apostila aberta $a Caelum# certamente vai %ostar $os novos cursos online que lan,amos na plataforma Alura. 4oc! estu$a a qualquer momento com a qualidade Caelum. Conhe,a a 5lura.
2ara formatar o n6mero $e uma maneira $iferente# com vr%ula e n6mero $e casas $ecimais $evemos utilizar outras classes $e aju$a 9Dum"er8ormat# 8ormatter:. 2ara transformar uma Strin em n6mero# utilizamos as classes $e aju$a para os tipos primitivos correspon$entes. 2or e emplo# para transformar a Strin s em um n6mero inteiro utilizamos o m)to$o est&tico $a classe Qnte er:
Strin s G "/-/"; int i G Qnte er.parseQnt(s);
5s classes Eou"le# Short# 9on # 8loat etc cont!m o mesmo tipo $e m)to$o# como parseEou"le e parse8loat que retornam um #ou"le e float respectivamente. /ssas classes tamb)m s(o muito utiliza$as para fazer o 5rappin# 9embrulho: $e tipos primitivos como objetos# pois refer!ncias e tipos primitivos s(o incompatveis. 'ma%ine que precisamos passar como ar%umento um inteiro para o nosso %uar$a$or $e objetos. 8m inteiro n(o ) um 2"'ect# como fazerC
int i G ;; Qnte er A G new Qnte er(i); uar#a#or.a#iciona(A);
/# $a$o um Qnte er# po$emos pe%ar o int que est& $entro $ele 9$esembrulh&-lo::
int i G ;; Qnte er A G new Qnte er(i); int numeroEe5olta G A.int5alue();
0o .ava 1.K esse c+$i%o ) inv&li$o. 0o .ava J.B em $iante ele compila perfeitamente. L importante ressaltar que isso n(o quer $izer que tipos primitivos e refer!ncias sejam $o mesmo tipo# isso ) simplesmente um "a,6car sint&tico" 9s3nta# sugar: para facilitar a co$ifica,(o. 4oc! po$e fazer to$os os tipos $e opera,-es matem&ticas com os wrappers# por)m corre o risco $e tomar um DullPointerCAception. 4oc! po$e fazer o autobo in% $iretamente para 2"'ect tamb)m# possibilitan$o passar um tipo primitivo para um m)to$o que receber 2"'ect como ar%umento:
2"'ect o G ;;
Criamos aqui# $ois objetos $iferentes. 1 que acontece quan$o comparamos essas $uas refer!ncias utilizan$o o GGC
if (A GG y) ! System.out.println("referXncia para o mesmo o"'eto"); & else ! System.out.println("referXncias para o"'etos #iferentes!"); &
Hemos aqui $ois objetos $iferentesO /# ent(o# como faramos para verificar se o conte6$o $o objeto
) o mesmoC 8tilizamos o m)to$o e)uals# que foi reescrito pela Strin # para fazer a compara,(o $e char em char.
if (A.e)uals(y)) ! System.out.println("consi#eramos i uais no critTrio #e i ual#a#e"); & else ! System.out.println("consi#eramos #iferentes no critTrio #e i ual#a#e"); &
5qui# a compara,(o retorna ver$a$eiro. 2or qu!C 2ois quem implementou a classe Strin $eci$iu que este seria o melhor crit)rio $e compara,(o. 4oc! po$e $escobrir os crit)rios $e i%ual$a$e $e ca$a classe pela $ocumenta,(o. 2o$emos tamb)m concatenar Strin s usan$o o L. 2o$emos concatenar Strin s com qualquer objeto# at) mesmo n6meros:
int total G ;; System.out.println("o total asto T, " L total);
1 compila$or utilizar& os m)to$os apropria$os $a classe Strin e $as classes wrappers para realizar tal tarefa. 5 classe Strin conta tamb)m com um m)to$o split# que $ivi$e a Strin em um arraD $e Strin s# $a$o $etermina$o crit)rio.
Strin Strin frase G "'ava T #emais"; palavras$% G frase.split(" ");
*e quisermos comparar $uas *trin%s# utilizamos o m)to$o comparePo# que recebe uma Strin como ar%umento e $evolve um inteiro in$ican$o se a Strin vem antes# ) i%ual ou vem $epois $a Strin recebi$a. *e forem i%uais# ) $evolvi$o -? se for anterior < Strin $o ar%umento# $evolve um inteiro ne%ativo? e# se for posterior# um inteiro positivo. ;ato importante: uma trin# imut1vel. 1 java cria um pool $e *trin%s para usar como cache e# se a Strin n(o fosse imut&vel# mu$an$o o valor $e uma Strin afetaria to$as as Strin s $e outras classes que tivessem o mesmo valor. Eepare no c+$i%o abai o:
Strin palavra G "f'//"; palavra.toepper+ase(); System.out.println(palavra);
2o$e parecer estranho# mas ele imprime "fj11" em min6sculo. Ho$o m)to$o que parece alterar o valor $e uma Strin # na ver$a$e# cria uma nova Strin com as mu$an,as solicita$as e a retornaO Hanto que esse m)to$o n(o ) voi#. 1 c+$i%o realmente 6til ficaria assim:
Strin palavra G "f'//"; Strin outra G palavra.toepper+ase(); System.out.println(outra);
'sso funciona $a mesma forma para todos os m)to$os que parecem alterar o conte6$o $e uma Strin .
1u ain$a po$emos concatenar as invoca,-es $e m)to$o# j& que uma Strin ) $evolvi$a a ca$a invoca,(o:
Strin palavra G "f'//"; palavra G palavra.toepper+ase().replace("/"F "7"); System.out.println(palavra);
1 funcionamento $o pool interno $e *trin%s $o .ava tem uma s)rie $e $etalhes e voc! po$e encontrar mais informa,-es sobre isto na $ocumenta,(o $a classe Strin e no seu m)to$o intern(). Outros mtodos da classe Strin / istem $iversos m)to$os $a classe Strin que s(o e tremamente importantes. Eecomen$amos sempre consultar o java$oc relativo a essa classe para apren$er ca$a vez mais sobre a mesma. 2or e emplo# o m)to$o charJt(i)# retorna o caractere e istente na posi,(o i $a *trin%# o mtodolen th retorna o n6mero $e caracteres na mesma e o m)to$o su"strin que recebe um int e $evolve a *ub*trin% a partir $a posi,(o passa$a por aquele int. 1 in#eA2f recebe um char ou uma *trin% e $evolve o n$ice em que aparece pela primeira vez na *trin% principal 9h& tamb)m o lastQn#eA2f que $evolve o n$ice $a 6ltima ocorr!ncia:. 1 toepper+ase e o to9ower+ase $evolvem uma nova *trin% to$a em mai6scula e to$a em min6scula# respectivamente. 5 partir $o .ava Q# temos ain$a o m)to$o isCmpty# que $evolve true se a *trin% for vazia ou false caso contr&rio. 5l%uns m)to$os 6teis para buscas s(o o contains e o matches. >& muitos outros m)to$os# recomen$amos que voc! sempre consulte o java$oc $a classe. java.lan# Strin Suffer e Strin Suil#er Como a classe Strin ) imut&vel# trabalhar com uma mesma Strin $iversas vezes po$e ter um efeito colateral: %erar in6meras Strin s tempor&rias. 'sto preju$ica a performance $a aplica,(o consi$eravelmente. 0o caso $e voc! trabalhar muito com a manipula,(o $e uma mesma Strin 9por e emplo# $entro $e um la,o:# o i$eal ) utilizar a classe Strin Suffer. 5 classe Strin Suffer representa uma sequ!ncia $e caracteres. 3iferentemente $a Strin # ela ) mut&vel# e n(o possui aquele pool. 5 classe Strin Suil#er tem e atamente os mesmos m)to$os# com a $iferen,a $ela n(o ser t$read-sa-e. 4eremos sobre este conceito no captulo $e Hhrea$s. +oc, pode tambm -a.er o curso /J-11 dessa apostila na Caelum
@ueren$o apren$er ain$a mais sobre .ava e boas pr&ticas $e orienta,(o a objetosC /sclarecer $6vi$as $os e ercciosC 1uvir e plica,-es $etalha$as com um instrutorC
5 Caelum oferece o curso /J-11 presencial nas ci$a$es $e *(o 2aulo# Eio $e .aneiro e Braslia# al)m $e turmas incompanD. Consulte as vanta%ens $o curso Java e Orientao a Objetos.
16.C - java.lan#.0at$
0a classe Math# e iste uma s)rie $e m)to$os est&ticos que fazem opera,-es com n6meros como# por e emplo# arre$on$ar9roun#:# tirar o valor absoluto 9a"s:# tirar a raiz9s)rt:# calcular o seno9sin: e outros.
#ou"le # G 6.N; lon i G Math.roun#(#); int A G *6; int y G Math.a"s(A);
Consulte a $ocumenta,(o para ver a %ran$e quanti$a$e $e m)to$os $iferentes. 0o .ava J.B# po$emos tirar proveito $o import static aqui:
import static 'ava.lan .Math.H;
Como fazer para ele imprimir fj==C =. Como fazer para saber se uma Strin se encontra $entro $e outraC / para tirar os espa,os em branco $as pontas $e uma Strin C / para saber se uma Strin est& vaziaC / para saber quantos caracteres tem uma Strin C Home como h&bito sempre pesquisar o .ava3ocO Conhecer a 52'# aos poucos# ) fun$amental para que voc! n(o precise reescrever a ro$aO R. Crie uma classe PestaQnte er e vamos fazer compara,-es com 'nte%ers $entro $o main:
Qnte er A/ G new Qnte er(/-);
Qnte er A7 G new Qnte er(/-); if (A/ GG A7) ! System.out.println("i ual"); & else ! System.out.println("#iferente"); &
/ se testarmos com o e)ualsC 1 que po$emos concluirC K. Como verificar se a classe Qnte er tamb)m reescreve o m)to$o toStrin C 5 maioria $as classes $o .ava que s(o muito utiliza$as ter(o seus m)to$os e)uals e toStrin reescritos convenientemente. 5proveite e fa,a um teste com o m)to$o est&tico parseQnt# receben$o uma *trin% v&li$a e uma inv&li$a 9com caracteres alfab)ticos:# e veja o que aconteceO J. 8tilize-se $a $ocumenta,(o $o .ava e $escubra $e que classe ) o objeto referencia$o pelo atributo out $a System. Eepare que# com o $evi$o import# po$eramos escrever:
(( falta a #eclarao #a sa?#a ........ sai#a G System.out; sai#a.println("ola");
5 vari&vel sai#a precisa ser $eclara$a $e que tipoC L isso que voc! precisa $escobrir. *e voc! $i%itar esse c+$i%o no /clipse# ele vai te su%erir um quicGfi e $eclarar& a vari&vel para voc!. /stu$aremos essa classe no captulo se%uinte. Q. Crie e imprima uma refer!ncia $e +onta. 0ote que voc! vai ter que $ar new em +onta+orrente ou +ontaPoupanca# j& que sua +onta ) abstrata:
+onta conta G new +onta+orrente(), System.out.println(conta);
1 que aconteceC N. Eeescreva o m)to$o toStrin $a sua classe +onta fazen$o com que uma mensa%em mais e plicativa seja $evolvi$a. Fembre-se $e aproveitar $os recursos $o /clipse para isto: $i%itan$o apenas o come,o $o nome $o m)to$o a ser reescrito e pressionan$o ctrl J espao# ele vai su%erir reescrever o m)to$o# poupan$o o trabalho $e escrever a assinatura $o m)to$o e cometer al%um en%ano.
pu"lic a"stract class +onta ! private #ou"le sal#o; pu"lic Strin toStrin () ! return "esse o"'eto T uma conta com sal#o [a" L this.sal#o; & (( restante #a classe &
'mprima novamente uma refer!ncia a +onta. 1 que aconteceuC Y. Eeescreva o m)to$o e)uals $a classe +onta para que $uas contas com o mesmo n'mero
de conta sejam consi$era$as i%uais. 2ara isso# voc! vai precisar $e um atributo numero. /sbo,o:
pu"lic a"stract class +onta ! private int numero; pu"lic "oolean e)uals(2"'ect o"') ! +onta outra+onta G (+onta) o"'; & & return this.numero GG outra+onta.numero; etter e setter para numeroF usan#o Cclipse!
(( colo)ue
4oc! po$e usar o ctrl J espao $o /clipse para escrever o esqueleto $o m)to$o e)uals# basta $i%itar $entro $a classe e)u e pressionar ctrl J espao. Crie uma classe Pesta+omparacao+onta e# $entro $o main# crie $uas inst[ncias $e +onta+orrente com n6meros i%uais. 5 compare elas com GG e $epois com e)uals. A. 8m #ou"le n(o est& sen$o suficiente para %uar$ar a quanti$a$e $e casas necess&rias em uma aplica,(o. 2reciso %uar$ar um n6mero $ecimal muito %ran$eO 1 que po$eria usarC 1 #ou"le tamb)m tem problemas $e precis(o ao fazer contas# por causa $e arre$on$amentos $a aritm)tica $e ponto flutuante $efini$o pela '/// NJK: http://en.wiGipe$ia.or%/wiGi/'///`NJK /le n(o $eve ser usa$o se voc! precisa realmente $e muita precis(o 9casos que envolvam $inheiro# por e emplo:. Consulte a documentao# tente a$ivinhar on$e voc! po$e encontrar um tipo que te aju$aria para resolver esses casos e veja como ) intuitivoO @ual ) a classe que resolveria esses problemasC Fembre-se: no .ava h& muito j& pronto. *eja na biblioteca pa$r(o# seja em bibliotecas open source que voc! po$e encontrar pela internet. 1B.9opcional: ;a,a com que o e)uals $a sua classe +onta tamb)m leve em consi$era,(o a Strin $o nome $o cliente a qual ela pertence. *e sua +onta n(o possuir o atributo nome# crie-o. Heste se o m)to$o cria$o est& funcionan$o corretamente. 11.9opcional: Crie a classe \uar#a#orEe2"'etos como visto nesse captulo. Crie uma classe Pesta\uar#a#or e $entro $o main crie uma +onta+orrente e a$icione-a em um \uar#a#orEe2"'etos. 3epois teste pe%ar essa refer!ncia como +ontaPoupanca# usan$o castin%:
\uar#a#orEe2"'etos uar#a#or G new \uar#a#orEe2"'etos(); +onta+orrente cc G new +onta+orrente(); uar#a#or.a#iciona2"'eto(cc); (( vai precisar #o castin para compilar! (( use +trlL/ para o Cclipse erar para vocX +ontaPoupanca cp G uar#a#or.pe a(-);
Eepare na e ception que ) lan,a$a. @ual ) o tipo $elaC Heste tamb)m o autobo in% $o .ava J.B# passan$o um inteiro para nosso %uar$a$or. 1=.9opcional: /screva um m)to$o que usa os m)to$os charJt e len th $e uma Strin para imprimir a mesma caractere a caractere# com ca$a caractere em uma linha $iferente.
1R.9opcional: Eeescreva o m)to$o $o e erccio anterior# mas mo$ifican$o ele para que imprima a Strin $e tr&s para a frente e em uma linha s+. Heste-a para '/ocorram)me& subi no >nibus em ?arrocos' e 'anotaram a data da maratona'. 1K.9opcional: 3a$a uma frase# reescreva essa frase com as palavras na or$em inverti$a. '/ocorram)me& subi no >nibus em ?arrocos' $eve retornar '?arrocos em >nibus no subi /ocorram)me&'. 8tilize o m)to$o split $a Strin para te au iliar. 1J.9opcional: 2esquise a classe Strin Suil#er 9ou *trin%Buffer no .ava 1.K:. /la ) mut&vel. 2or que us&-la em vez $a Strin C @uan$o us&-laC Como voc! po$eria reescrever o m)to$o $e escrever a Strin $e tr&s para a frente usan$o um Strin Suil#erC
16.11 - >esa-io
1. Converta uma Strin para um n6mero sem usar as bibliotecas $o java que j& fazem isso. 'sso )# uma Strin A G "ZN7" $eve %erar um int i G ZN7. 2ara aju$ar# saiba que um char po$e ser "transforma$o" em int com o mesmo valor num)rico fazen$o:
char c G @:@; int i G c * @-@; (( i vale :!
5qui estamos nos aproveitan$o $o conhecimento $a tabela unico$e: os n6meros $e B a A est(o em sequ!nciaO 4oc! po$eria usar o m)to$o est&tico +haracter. etDumeric5alue(char) em vez $isso. &ire suas d'vidas no novo ()J ;espostas
1 78. ) um $os principais f+runs brasileiros $e computa,(o e o maior em portu%u!s sobre .ava. 5 nova vers(o $o 78. ) basea$a em uma ferramenta $e perguntas e respostas 9@5: e tem uma comuni$a$e muito forte. *(o mais $e 1JB mil usu&rios pra aju$ar voc! a esclarecer suas $6vi$as. ;a,a sua per%unta.
Eacote java.io
"5 benevol!ncia ) sobretu$o um vcio $o or%ulho e n(o uma virtu$e $a alma." 5o t)rmino $esse captulo# voc! ser& capaz $e: ler e escrever bDtes# caracteres e *trin%s $e/para a entra$a e sa$a pa$r(o? ler e escrever bDtes# caracteres e *trin%s $e/para arquivos? utilizar buffers para a%ilizar a leitura e escrita atrav)s $e flu os? usar *canner e 2rint*tream.
/$itoras tra$icionais pouco li%am para ebooGs e novas tecnolo%ias. 0(o conhecem pro%rama,(o para revisar os livros tecnicamente a fun$o. 0(o t!m anos $e e peri!ncia em $i$&ticas com cursos. Conhe,a a Casa do C*di#o# uma e$itora $iferente# com cura$oria $a Caelum e obsess(o por livros $e quali$a$e a pre,os justos. Casa $o C+$i%o# ebooG com pre,o $e ebooG.
5 classe QnputStream ) abstrata e 8ileQnputStream uma $e suas filhas concretas. 8ileQnputStream vai procurar o arquivo no $iret+rio em que a .4" fora invoca$a 9no caso $o /clipse# vai ser a partir $e $entro $o $iret+rio $o projeto:. 5lternativamente voc! po$e usar um caminho absoluto. @uan$o trabalhamos com 'ava.io# $iversos m)to$os lan,am Q2CAception# que ) uma e ception $o tipo checGe$ - o que nos obri%a a trat&-la ou $eclar&-la. 0os e emplos aqui# estamos $eclaran$o Q2CAception atrav)s $a clausula throws $o main apenas para facilitar o e emplo. Caso a e ception ocorra# a .4" vai parar# mostran$o a stacGtrace. /sta n(o ) uma boa pr&tica em uma aplica,(o real: trate suas e ceptions para sua aplica,(o po$er abortar ele%antemente. QnputStream tem $iversas outras filhas# como 2"'ectQnputStream# Ju#ioQnputStream# SyteJrrayQnputStream# entre outras. 2ara recuperar um caractere# precisamos tra$uzir os bDtes com o enco$in% $a$o para o respectivo c+$i%o unico$e# isso po$e usar um ou mais bDtes. /screver esse $eco$ifica$or ) muito complica$o# quem faz isso por voc! ) a classe QnputStream[ea#er.
class PestaCntra#a ! pu"lic static voi# main(Strin $% ar s) throws Q2CAception ! QnputStream is G new 8ileQnputStream("ar)uivo.tAt"); QnputStream[ea#er isr G new QnputStream[ea#er(is); int c G isr.rea#(); & &
1 construtor $e QnputStream[ea#er po$e receber o enco$in% a ser utiliza$o como par[metro# se $eseja$o# tal como eP8*< ou QS2*<<;Y*/. =ncodin#s 3evi$o a %ran$e quanti$a$e $e aplicativos internacionaliza$os $e hoje em $ia# ) imprescin$vel que um bom pro%rama$or enten$a bem o que s(o os character enco$in%s e o 8nico$e. 1 blo% $a Caelum possui um bom arti%o a respeito: http://blo%.caelum.com.br/=BBQ/1B/==/enten$en$o-unico$e-e-os-character-enco$in%s/ QnputStream[ea#er ) filha $a classe abstrata [ea#er# que possui $iversas outras filhas - s(o
classes que manipulam chars. 5pesar $a classe abstrata [ea#er j& aju$ar no trabalho $e manipula,(o $e caracteres# ain$a seria $ifcil pe%ar uma Strin . 5 classe Suffere#[ea#er ) um [ea#er que recebe outro [ea#er pelo construtor e concatena os $iversos chars para formar uma Strin atrav)s $o m)to$o rea#9ine:
class PestaCntra#a ! pu"lic static voi# main(Strin $% ar s) throws Q2CAception ! QnputStream is G new 8ileQnputStream("ar)uivo.tAt"); QnputStream[ea#er isr G new QnputStream[ea#er(is); Suffere#[ea#er "r G new Suffere#[ea#er(isr); Strin s G "r.rea#9ine(); & &
Como o pr+prio nome $iz# essa classe l! $o [ea#er por pe$a,os 9usan$o o buffer: para evitar realizar muitas chama$as ao sistema operacional. 4oc! po$e at) confi%urar o tamanho $o buffer pelo construtor. L essa a composi,(o $e classes que est& acontecen$o:
/sse pa$r(o $e composi,(o ) bastante utiliza$o e conheci$o. L o >ecorator Eattern. 5qui# lemos apenas a primeira linha $o arquivo. 1 m)to$o rea#9ine $evolve a linha que foi li$a e mu$a o cursor para a pr+ ima linha. Caso ele che%ue ao fim $o [ea#er 9no nosso caso# fim $o arquivo:# ele vai $evolver null. /nt(o# com um simples la,o# po$emos ler o arquivo por inteiro:
class PestaCntra#a ! pu"lic static voi# main(Strin $% ar s) throws Q2CAception ! QnputStream is G new 8ileQnputStream("ar)uivo.tAt"); QnputStream[ea#er isr G new QnputStream[ea#er(is); Suffere#[ea#er "r G new Suffere#[ea#er(isr); Strin s G "r.rea#9ine(); (( primeira linha
System.out.println(s); s G "r.rea#9ine();
5penas mo$ificamos a quem a vari&vel is est& se referin$o. 2o$emos receber ar%umentos $o tipo QnputStream e ter esse tipo $e abstra,(o: n(o importa e atamente $e on$e estamos len$o esse punha$o $e bDtes# $es$e que a %ente receba a informa,(o que estamos queren$o. Como na fi%ura:
Eepare que a ponta $a $ireita po$eria ser qualquer QnputStream# seja 2"'ectQnputStream# Ju#ioQnputStream# SyteJrrayQnputStream# ou a nossa 8ileQnputStream. 2olimorfismoO 1u voc! mesmo po$e criar uma filha $e QnputStream# se $esejar. 2or isso ) muito comum m)to$os receberem e retornarem QnputStream# em vez $e suas filhas especficas. Com isso# elas $esacoplam as informa,-es e escon$em a implementa,(o# facilitan$o a mu$an,a e manuten,(o $o c+$i%o. Eepare que isso vai ao encontro $e tu$o o que apren$emos $urante os captulos que apresentaram classes abstratas# interfaces# polimorfismo e encapsulamento.
class PestaSai#a ! pu"lic static voi# main(Strin $% ar s) throws Q2CAception ! 2utputStream os G new 8ile2utputStream("sai#a.tAt"); 2utputStreamfriter osw G new 2utputStreamfriter(os); Suffere#friter "w G new Suffere#friter(osw); "w.write("caelum"); "w.close(); & &
Fembre-se $e $ar re"resh 9clique $a $ireita no nome $o projeto# refresh: no seu projeto $o /clipse para que o arquivo cria$o apare,a. 1 8ile2utputStream po$e receber um booleano como se%un$o par[metro# para in$icar se voc! quer reescrever o arquivo ou manter o que j& estava escrito 9appen#:. 1 m)to$o write $o Suffere#friter n(o insere o9s: caractere9s: $e quebra $e linha. 2ara isso# voc! po$e chamar o m)to$o new9ine. /ec$ando o arquivo com o -inall2 e o tr2-5it$-resources L importante sempre fechar o arquivo. 4oc! po$e fazer isso chaman$o $iretamente o m)to$o close $o 8ileQnputStream/2utputStream# ou ain$a chaman$o o close $o Suffere#[ea#er/friter. 0esse 6ltimo caso# o close ser& cascatea$o para os objetos os quais o Suffere#[ea#er/friter utiliza para realizar a leitura/escrita# al)m $ele fazer o -lus$ $os buffers no caso $a escrita. L comum e fun$amental que o close esteja $entro $e um bloco finally. *e um arquivo for
esqueci$o aberto e a refer!ncia para ele for per$i$a# po$e ser que ele seja fecha$o pelo garbage collector# que veremos mais a frente# por causa $o finaliMe. "as n(o ) bom voc! se pren$er a isso. *e voc! esquecer $e fechar o arquivo# no caso $e um pro%rama min6sculo como esse# o pro%rama vai terminar antes que o tal $o %arba%e collector te aju$e# resultan$o em um arquivo n(o escrito 9os bDtes ficaram no buffer $o Suffere#friter:. 2roblemas similares po$em acontecer com leitores que n(o forem fecha$os. 0o .ava N h& a estrutura tr3)+ith)resources# que j& far& o finally cui$ar $os recursos $eclara$os $entro $o try()# invocan$o close. 2ra isso# os recursos $evem implementar a interface 'ava.lan .Juto+losea"le# que ) o caso $os Eea$ers# Priters e *treams estu$a$os aqui:
try (Suffere#[ea#er "r G new Suffere#[ea#er(new 8ile("ar)uivo.tAt"))) ! (( com eAceo ou noF o close() #o "r sera invoca#o &
5 Alura oferece $ezenas $e cursos online em sua plataforma e clusiva $e ensino que favorece o apren$iza$o com a qualidade reconheci$a $a Caelum. 4oc! po$e escolher um curso nas &reas $e .ava# EubD# Peb# "obile# .0/H e outros# com uma assinatura que $& acesso a to$os os cursos. Conhe,a os cursos online 5lura.
0enhum $os m)to$os lan,a Q2CAception: PrintStream lan,a 8ileDot8oun#CAception se voc! o construir passan$o uma Strin . /ssa e ce,(o ) filha $e Q2CAception e in$ica que o arquivo n(o foi encontra$o. 1 Scanner consi$erar& que che%ou ao fim se uma Q2CAception for lan,a$a# mas o PrintStream simplesmente en%ole e ceptions $esse tipo. 5mbos possuem m)to$os para voc! verificar se al%um problema ocorreu. 5 classe Scanner ) $o pacote 'ava.util. /la possui m)to$os muito 6teis para trabalhar com *trin%s# em especial# $iversos m)to$os j& prepara$os para pe%ar n6meros e palavras j& formata$as atrav)s $e e press-es re%ulares. ;ica f&cil parsear um arquivo com qualquer formato $a$o. 2stem.out Como vimos no captulo passa$o# o atributo out $a classe System ) $o tipo PrintStream 9e# portanto# ) um 2utputStream:.
1 compila$or vai reclamar que voc! n(o est& tratan$o al%umas e ce,-es 9como 'ava.io.Q2CAception:. 8tilize a cl&usula throws para $ei ar "escapar" a e ce,(o pelo seu main# ou use os $evi$os try/catch. 8tilize o quic! "i# $o /clipse para isso 9ctrl J 1:. 4ale lembrar que $ei ar to$as as e ceptions passarem $espercebi$as n(o ) uma boa pr&ticaO 4oc! po$e usar aqui# pois estamos focan$o apenas no apren$iza$o $a utiliza,(o $o 'ava.io. Eo$e sua aplica,(o. 5trav)s $a <ie+ Console voc! po$e $i%itar al%umas linhas para que seu pro%rama as capture. =O/ @uan$o ro$ar sua aplica,(o# para encerrar a entra$a $e $a$os $o tecla$o# ) necess&rio enviarmos um sinal $e fim $e stream. L o famoso =O/# isto )# end o" "ile. 0o Finu /"ac/*olaris/8ni voc! faz isso com o ctrl L E. 0o Pin$ows# use o ctrl L `.
=. @uan$o trabalhamos com recursos que falam com a parte e terna < nossa aplica,(o# ) preciso que avisemos quan$o acabarmos $e usar esses recursos. 2or isso# ) important"ssimo lembrar $e fechar os canais com o e terior que abrimos. ;elizmente para n+s# n(o ) necess&rio fechar ca$a um $os canais $e comunica,(o que abrimos 9is# isr e "r: porque# ao fechar a comunica,(o com o Suffere#[ea#er# ele mesmo j& trata $e fechar os recursos $os quais ele $epen$e. /nt(o# basta a$icionarmos a se%uinte instru,(o# $epois que recebermos a 6ltima informa,(o pelo [ea#er:
"r.close();
R. 4amos ler $e um arquivo# em vez $o tecla$o. 5ntes# vamos criar o arquivo que ser& li$o pelo pro%rama: 1. 8se o ctrl J B para criar um novo arquivo e comece a $i%itar 8ile. 8se as setinhas para che%ar na op,(o ;ile e $! enter para escolh!-la: =. Com o nome $o projeto seleciona$o# $i%ite o nome ar)uivo.tAt no campo 8ile name: R. Hroque na classe PestaCntra#a o System.in por um new 8ileQnputStream:
QnputStream is G new 8ileQnputStream("ar)uivo.tAt");
K. 9conceitual: *eu pro%rama l! to$as as linhas $esse arquivo. Eepare na utiliza,(o $o polimorfismo. Como ambos s(o QnputStream# isso faz com que eles se encai em no QnputStream[ea#er. 5l)m $a ;ile'nput*tream# que outras classes po$eriam tomar seu lu%arC 1lhe na $ocumenta,(oO J. Eepare que# no final# s+ usamos mesmo o Suffere#[ea#er. 5s refer!ncias para QnputStream e para QnputStream[ea#er s(o apenas utiliza$as temporariamente. 2ortanto# ) comum encontrarmos o se%uinte c+$i%o nesses casos:
Suffere#[ea#er "r G new Suffere#[ea#er( new QnputStream[ea#er( new 8ileQnputStream("ar)uivo.tAt"))); Strin linha G "r.rea#9ine(); (( primeira linha
Claro que# principalmente em lin%ua%ens $e alto nvel como o .ava# preferimos le%ibili$a$e em vez $e um c+$i%o mais curto# mas este c+$i%o em particular ) bem comum e aceit&vel. ;a,a a altera,(o no seu pro%ramaO Q. 8tilize a classe Scanner $o .ava J para ler $e um arquivo e colocar na tela. 1 c+$i%o vai ficar incrivelmente pequeno.
pu"lic class Cntra#aEeemJr)uivo ! pu"lic static voi# main(Strin $% ar s) throws Q2CAception ! QnputStream is G new 8ileQnputStream("ar)uivo.tAt"); Scanner entra#a G new Scanner(is); System.out.println("Ei ite sua mensa em,"); while (entra#a.hasDeAt9ine()) ! System.out.println(entra#a.neAt9ine()); &
3epois troque a vari&vel is para que ela se refira ao System.in. 5%ora voc! est& len$o $o tecla$oO N. 9opcional: 5ltere seu pro%rama para que ele leia $o arquivo e# em vez $e jo%ar na tela# jo%ue em um outro arquivo. 4oc! vai precisar# al)m $o c+$i%o anterior para ler $e um arquivo# $o c+$i%o para escrever em um arquivo. 2ara isso# voc! po$e usar o Suffere#friter ou o PrintStream. /ste 6ltimo ) $e mais f&cil manipula,(o. *e for usar o Suffere#friter# fazemos assim parar abri-lo:
2utputStream os G new 8ile2utputStream("sai#a.tAt"); 2utputStreamfriter osw G new 2utputStreamfriter(os); Suffere#friter "w G new Suffere#friter(osw);
3entro $o loop $e leitura $o tecla$o# voc! $eve usar "w.write(A)# on$e A ) a linha que voc! leu. 8se "w.new9ine() para pular $e linha. 0(o se esque,a $e# no t)rmino $o loop# $ar um "w.close(). 4oc! po$e se%uir o mo$elo:
while (entra#a.hasDeAt9ine()) ! Strin linha G entra#a.neAt9ine(); "w.write(linha); "w.new9ine(); & "w.close();
5p+s ro$ar seu pro%rama# $! um refresh no seu projeto 9clique $a $ireita no nome $o projeto# refresh: e veja que ele criou um arquivo sai#a.tAt no $iret+rio. Y. 9opcional: 5ltere novamente o pro%rama para ele virar um pequeno e$itor: l! $o tecla$o e escreve em arquivo. Eepare que a mu$an,a a ser feita ) mnimaO A. 9opcional: 5 classe Scanner ) muito po$erosaO Consulte seu java$oc para saber sobre o #elimiter e os outros m)to$os neAt. +oc, no est1 nessa p1#ina a toa
4oc! che%ou aqui porque a Caelum ) refer!ncia nacional em cursos $e .ava# EubD# 5%ile# "obile# Peb e .0/H. ;a,a curso com quem escreveu essa apostila. Consulte as vanta%ens $o curso Java e Orientao a Objetos.
"uitos anos atr&s# %ran$es nomes $o mun$o $a orienta,(o a objetos perceberam que criar bons $esi%ns orienta$os a objetos era um %ran$e $esafio para muitas pessoas. 2erceberam que muitos problemas $e 11 apareciam recorrentemente em v&rios projetos? e que as pessoas j& tinham certas solu,-es para esses problemas cl&ssicos 9nem sempre muito ele%antes:. 1 que fizeram foi criar solu:es padr:es para problemas comuns na orienta,(o a objetos# e chamaram isso $e >esi#n Eatterns# ou 2a$r-es $e 2rojeto. 1 conceito vinha $a arquitetura on$e era muito comum ter esse tipo $e solu,(o. /# em 1AAK# %anhou %ran$e populari$a$e na computa,(o com o livro 1esign $atterns: 2lements o" ,eusable Object)Oriented /o"t+are# um cat&lo%o com v&rias $essas solu,-es escrito por /rich 7amma# Ealph .ohnson# Eichar$ >elm e .ohn 4lissi$es 9a 7an%ue $os @uatro# 7o;:. 1esign $atterns tornou-se refer!ncia absoluta no bom uso $a orienta,(o a objetos. 1utros pa$r-es sur%iram $epois# em outras literaturas i%ualmente consa%ra$as. 1 conhecimento $essas t)cnicas ) imprescin$vel para o bom pro%rama$or. >iscuta com o instrutor como >esi#n Eatterns ajudam a resolver problemas de modela#em em sistemas orientados a objetos. +eja como >esi#n Eatterns so aplicados em muitos lu#ares do pr*prio Java. 1 instrutor comentar& $o Pemplate Metho# e mostrar& o c+$i%o fonte $o m)to$o rea$9: $a classe 'ava.io.QnputStream:
pu"lic int rea#("yte "$%F int offF int len) throws Q2CAception ! if (" GG null) ! throw new DullPointerCAception(); & else if (off 3 - WW len 3 - WW len 4 ".len th * off) ! throw new Qn#eA2ut2fSoun#sCAception(); & else if (len GG -) ! return -; & int c G rea#(); if (c GG */) ! return */; & "$off% G ("yte) c; int i G /; try ! for (; i 3 len ; iLL) ! c G rea#(); if (c GG */) ! "rea0; & "$off L i% G ("yte)c; & & catch (Q2CAception ee) ! & return i;
&
>iscuta em aula como esse mtodo aplica conceitos importantes da orientao a objetos e promove -le!ibilidade e e!tensibilidade. Captulo 1Q
Collections -rame5orM
"5 amiza$e ) um contrato se%un$o o qual nos comprometemos a prestar pequenos favores para que no-los retribuam com %ran$es." 5o t)rmino $esse captulo# voc! ser& capaz $e: utilizar arraDs# lists# sets ou maps $epen$en$o $a necessi$a$e $o pro%rama? iterar e or$enar listas e cole,-es? usar mapas para inser,(o e busca $e objetos.
0a fi%ura acima# voc! po$e ver um arraD que antes estava sen$o completamente utiliza$o e que# $epois# teve um $e seus elementos removi$os. *upon$o que os $a$os armazena$os representem contas# o que acontece quan$o precisarmos inserir uma nova conta no bancoC 2recisaremos procurar por um espa,o vazioC 7uar$aremos em al%uma estrutura $e $a$os e terna# as posi,-es vaziasC / se n(o houver espa,o vazioC Heramos $e criar um arraD maior e copiar os $a$os $o anti%o para eleC >& mais quest-es: como posso saber quantas posi,-es est(o sen$o usa$as no arraDC 4ou precisar sempre percorrer o arraD inteiro para conse%uir essa informa,(oC 5l)m $essas $ificul$a$es que os arraDs apresentavam# faltava um conjunto robusto $e classes para suprir a necessi$a$e $e estruturas $e $a$os b&sicas# como listas li%a$as e tabelas $e espalhamento. Com esses e outros objetivos em mente# o comit! respons&vel pelo .ava criou um conjunto $e classes e interfaces conheci$o como Collections /rame5orM# que resi$e no pacote 'ava.util $es$e o .ava= 1.=. Collections 5 AE8 $o Collections ) robusta e possui $iversas classes que representam estruturas $e $a$os avan,a$as. 2or e emplo# n(o ) necess&rio reinventar a ro$a e criar uma lista li%a$a# mas sim utilizar aquela que o .ava $isponibiliza.
to$os os problemas que levantamos em rela,(o ao arraD 9busca# remo,(o# tamanho "infinito"#...:. /sse c+$i%o j& est& prontoO 5 52' $e +ollections traz a interface 'ava.util.9ist# que especifica o que uma classe $eve ser capaz $e fazer para ser uma lista. >& $iversas implementa,-es $isponveis# ca$a uma com uma forma $iferente $e representar uma lista. 5 implementa,(o mais utiliza$a $a interface 9ist ) a Jrray9ist# que trabalha com um arraD interno para %erar uma lista. 2ortanto# ela ) mais r&pi$a na pesquisa $o que sua concorrente# a 9in0e#9ist# que ) mais r&pi$a na inser,(o e remo,(o $e itens nas pontas. Arra2Nist no um arra2O L comum confun$irem uma Jrray9ist com um arraD# por)m ela n(o ) um arraD. 1 que ocorre ) que# internamente# ela usa um arraD como estrutura para armazenar os $a$os# por)m este atributo est& propriamente encapsula$o e voc! n(o tem como acess&-lo. Eepare# tamb)m# que voc! n(o po$e usar $% com uma Jrray9ist# nem acessar atributo len th. 0(o h& rela,(oO 2ara criar um Jrray9ist# basta chamar o construtor:
Jrray9ist lista G new Jrray9ist();
5 interface 9ist possui $ois m)to$os a### um que recebe o objeto a ser inseri$o e o coloca no final $a lista# e um se%un$o que permite a$icionar o elemento em qualquer posi,(o $a mesma. 0ote que# em momento al%um# $izemos qual ) o tamanho $a lista? po$emos acrescentar quantos elementos quisermos# que a lista cresce conforme for necess&rio. Ho$a lista 9na ver$a$e# to$a +ollection: trabalha $o mo$o mais %en)rico possvel. 'sto )# n(o h& uma Jrray9ist especfica para Strin s# outra para 06meros# outra para 3atas etc. Ho$os os m)to$os trabalham com 2"'ect. 5ssim# ) possvel criar# por e emplo# uma lista $e Contas Correntes:
+onta+orrente c/ G new +onta+orrente(); c/.#eposita(/--); +onta+orrente c7 G new +onta+orrente(); c7.#eposita(7--); +onta+orrente c: G new +onta+orrente(); c:.#eposita(:--); 9ist contas G new Jrray9ist(); contas.a##(c/); contas.a##(c:); contas.a##(c7);
>& ain$a um m)to$o et(int) que recebe como ar%umento o n$ice $o elemento que se quer recuperar. 5trav)s $ele# po$emos fazer um for para iterar na lista $e contas:
for (int i G -; i 3 contas.siMe(); iLL) ! contas. et(i); (( cR#i o no muito Util.... &
"as como fazer para imprimir o sal$o $essas contasC 2o$emos acessar o etSal#o() $iretamente ap+s fazer contas. et(i)C 0(o po$emos? lembre-se que to$a lista trabalha sempre com 2"'ect. 5ssim# a refer!ncia $evolvi$a pelo et(i) ) $o tipo 2"'ect# sen$o necess&rio o cast para +onta+orrente se quisermos acessar o etSal#o():
for (int i G -; i 3 contas.siMe(); iLL) ! +onta+orrente cc G (+onta+orrente) contas. et(i); System.out.println(cc. etSal#o()); & (( note )ue a or#em #os elementos no T altera#a
>& ain$a outros m)to$os# como remove() que recebe um objeto que se $eseja remover $a lista? e contains()# que recebe um objeto como ar%umento e $evolve true ou false# in$ican$o se o elemento est& ou n(o na lista. 5 interface 9ist e al%umas classes que a implementam po$em ser vistas no $ia%rama a se%uir:
Acesso aleat*rio e percorrendo listas com #et 5l%umas listas# como a Jrray9ist# t!m acesso aleat+rio aos seus elementos: a busca por um elemento em uma $etermina$a posi,(o ) feita $e maneira ime$iata# sem que a lista inteira seja percorri$a 9que chamamos $e acesso sequencial:. 0este caso# o acesso atrav)s $o m)to$o et(int) ) muito r&pi$o. Caso contr&rio# percorrer uma lista usan$o um for como esse que acabamos $e ver# po$e ser $esastroso. 5o percorrermos uma lista# $evemos usar sempre um Qterator ou enhance# for# como veremos. 8ma lista ) uma e celente alternativa a um arraD comum# j& que temos to$os os benefcios $e arraDs# sem a necessi$a$e $e tomar cui$a$o com remo,-es# falta $e espa,o etc. 5 outra implementa,(o muito usa$a# a 9in0e#9ist# fornece m)to$os a$icionais para obter e remover o primeiro e 6ltimo elemento $a lista. /la tamb)m tem o funcionamento interno $iferente# o que po$e impactar performance# como veremos $urante os e erccios no final $o captulo. +ector 1utra implementa,(o ) a tra$icional classe 5ector# presente $es$e o .ava 1.B# que foi a$apta$a para uso com o frameworG $e Collections# com a inclus(o $e novos m)to$os. /la $eve ser escolhi$a com cui$a$o# pois li$a $e uma maneira $iferente com processos corren$o em paralelo e ter& um custo a$icional em rela,(o a Jrray9ist quan$o n(o houver acesso simult[neo aos $a$os. eus livros de tecnolo#ia parecem do sculo passado?
Conhe,a a Casa do C*di#o# uma nova e$itora# com autores $e $estaque no merca$o# foco em
ebooMs 923;# epub# mobi:# pre,os imbat"veis e assuntos atuais. Com a cura$oria $a Caelum e e celentes autores# ) uma abor$a%em di-erente para livros $e tecnolo%ia no Brasil. Conhe,a os ttulos e a nova proposta# voc! vai %ostar. Casa $o C+$i%o# livros para o pro%rama$or.
"as e $epois# na hora $e recuperar esses objetosC Como o m)to$o et $evolve um 2"'ect# precisamos fazer o cast. "as com uma lista com v&rios objetos $e tipos $iferentes# isso po$e n(o ser t(o simples... 7eralmente# n(o nos interessa uma lista com v&rios tipos $e objetos mistura$os? no $ia-a-$ia# usamos listas como aquela $e contas correntes. 0o .ava J.B# po$emos usar o recurso $e 7enerics para restrin%ir as listas a um $etermina$o tipo $e objetos 9e n(o qualquer 2"'ect::
9ist3+onta+orrente4 contas G new Jrray9ist3+onta+orrente4(); contas.a##(c/); contas.a##(c:); contas.a##(c7);
Eepare no uso $e um par[metro ao la$o $e 9ist e Jrray9ist: ele in$ica que nossa lista foi cria$a para trabalhar e clusivamente com objetos $o tipo +onta+orrente. 'sso nos traz uma se%uran,a em tempo $e compila,(o:
contas.a##("uma strin "); (( isso no compila mais!!
1 uso $e 7enerics tamb)m elimina a necessi$a$e $e castin%# j& que# se%uramente# to$os os objetos inseri$os na lista ser(o $o tipo +onta+orrente:
for(int i G -; i 3 contas.siMe(); iLL) ! +onta+orrente cc G contas. et(i); (( sem castin ! System.out.println(cc. etSal#o()); &
5 partir $o .ava N# se voc! instancia um tipo %en)rico na mesma linha $e sua $eclara,(o# n(o ) necess&rio passar os tipos novamente# basta usar new Jrray9ist34(). L conheci$o como operador diamante:
9ist3+onta+orrente4 contas G new Jrray9ist34();
Jrray9ist3+onta4 contas G new Jrray9ist3+onta4(); (( para ca#a conta #o "anco #e #a#osF contas.a## return contas; & &
2or)m# para que precisamos retornar a refer!ncia especfica a uma Jrray9istC 2ara que ser t(o especficoC 3essa maneira# o $ia que optarmos por $evolver uma 9in0e#9ist em vez $e Jrray9ist# as pessoas que est(o usan$o o m)to$o "uscaPo#as+ontas po$er(o ter problemas# pois estavam fazen$o refer!ncia a uma Jrray9ist. 1 i$eal ) sempre trabalhar com a interface mais %en)rica possvel:
class J encia ! (( mo#ificao apenas no retorno, pu"lic 9ist3+onta4 "uscaPo#as+ontas() ! Jrray9ist3+onta4 contas G new Jrray9ist34(); (( para ca#a conta #o "anco #e #a#osF contas.a## return contas; & &
L o mesmo caso $e preferir referenciar aos objetos com QnputStream como fizemos no captulo passa$o. 5ssim como no retorno# ) boa pr&tica trabalhar com a interface em to$os os lu%ares possveis: m)to$os que precisam receber uma lista $e objetos t!m 9ist como par[metro em vez $e uma implementa,(o em especfico como Jrray9ist# $ei an$o o m)to$o mais fle vel:
class J encia ! pu"lic voi# atualiMa+ontas(9ist3+onta4 contas) ! (( ... &
&
Hamb)m $eclaramos atributos como 9ist em vez $e nos comprometer como uma ou outra implementa,(o. 3essa forma obtemos um bai!o acoplamento: po$emos trocar a implementa,(o# j& que estamos pro%raman$o para a interfaceO 2or e emplo:
class Cmpresa ! private 9ist38uncionario4 empre a#os G new Jrray9ist34(); & (( ...
9ist3Strin 4 lista G new Jrray9ist34(); lista.a##("STr io"); lista.a##("Paulo"); lista.a##("\uilherme"); (( repare )ue o toStrin #e Jrray9ist foi so"rescrito, System.out.println(lista); +ollections.sort(lista); System.out.println(lista);
5o testar o e emplo acima# voc! observar& que# primeiro# a lista ) impressa na or$em $e inser,(o e# $epois $e invocar o sort# ela ) impressa em or$em alfab)tica. "as to$a lista em .ava po$e ser $e qualquer tipo $e objeto# por e emplo# +onta+orrente. / se quisermos or$enar uma lista $e +onta+orrenteC /m que or$em a classe +ollections or$enar&C 2elo sal$oC 2elo nome $o correntistaC
+onta+orrente c/ G new +onta+orrente(); c/.#eposita(;--); +onta+orrente c7 G new +onta+orrente(); c7.#eposita(7--); +onta+orrente c: G new +onta+orrente(); c:.#eposita(/;-); 9ist3+onta+orrente4 contas G new Jrray9ist34(); contas.a##(c/); contas.a##(c:); contas.a##(c7); +ollections.sort(contas); (( )ual seria o critTrio para esta or#enao]
*empre que falamos em or$ena,(o# precisamos pensar em um critrio de ordenao# uma forma $e $eterminar qual elemento vem antes $e qual. L necess&rio instruir o sort sobre como comparar nossas +onta+orrente a fim $e $eterminar uma or$em na lista. 2ara isto# o m)to$o sort necessita que to$os seus objetos $a lista sejam compar1veis e possuam um m)to$o que se compara com outra +onta+orrente. Como ) que o m)to$o sort ter& a %arantia $e que a sua classe possui esse m)to$oC 'sso ser& feito# novamente# atrav)s $e um contrato# $e uma interfaceO 4amos fazer com que os elementos $a nossa cole,(o implementem a interface 'ava.lan .+ompara"le# que $efine o m)to$o int comparePo(2"'ect). /ste m)to$o $eve retornar .ero# se o objeto compara$o for i#ual a este objeto# um n6mero ne#ativo# se este objeto for menor que o objeto $a$o# e um n6mero positivo# se este objeto for maior que o objeto $a$o. 2ara or$enar as +onta+orrentes por sal$o# basta implementar o +ompara"le:
pu"lic class +onta+orrente eAten#s +onta implements +ompara"le3+onta+orrente4 ! (( ... to#o o cR#i o anterior fica a)ui pu"lic int comparePo(+onta+orrente outra) ! if (this.sal#o 3 outra.sal#o) ! return */; & if (this.sal#o 4 outra.sal#o) !
Com o c+$i%o anterior# nossa classe tornou-se "compar1vel": $a$os $ois objetos $a classe# conse%uimos $izer se um objeto ) maior# menor ou i%ual ao outro# se%un$o al%um crit)rio por n+s $efini$o. 0o nosso caso# a compara,(o ser& feita basean$o-se no sal$o $a conta. Eepare que o crit)rio $e or$ena,(o ) totalmente aberto# $efini$o pelo pro%rama$or. *e quisermos or$enar por outro atributo 9ou at) por uma combina,(o $e atributos:# basta mo$ificar a implementa,(o $o m)to$o comparePo na classe. @uan$o chamarmos o m)to$o sort $e +ollections# ele saber& como fazer a or$ena,(o $a lista? ele usar& o crit)rio que $efinimos no m)to$o comparePo. "as# e o e emplo anterior# com uma lista $e *trin%sC 2or que a or$ena,(o funcionou# naquele caso# sem precisarmos fazer na$aC *imples: quem escreveu a classe Strin 9lembre que ela ) uma classe como qualquer outra: implementou a interface +ompara"le e o m)to$o comparePo para Strin s# fazen$o compara,(o em or$em alfab)tica. 9Consulte a $ocumenta,(o $a classe Strin e veja o m)to$o comparePo l&:. 1 mesmo acontece com outras classes como Qnte er# Si Eecimal# Eate# entre outras. >e-inindo outros critrios de ordenao L possvel $efinir outros crit)rios $e or$ena,(o usan$o um objeto $o tipo +omparator. / iste um m)to$o sort em +ollections que recebe# al)m $a 9ist# um +omparator $efinin$o um crit)rio $e or$ena,(o especfico. L possvel ter v&rios +omparators com crit)rios $iferentes para usar quan$o for necess&rio. Outros mtodos da classe Collections 5 classe +ollections traz uma %ran$e quanti$a$e $e m)to$os est&ticos 6teis na manipula,(o $e cole,-es. "inarySearch(9istF 2"'ect): Eealiza uma busca bin&ria por $etermina$o elemento na lista or$ena$a e retorna sua posi,(o ou um n6mero ne%ativo# caso n(o encontra$o. maA(+ollection): Eetorna o maior elemento $a cole,(o. min(+ollection): Eetorna o menor elemento $a cole,(o. reverse(9ist): 'nverte a lista. ...e muitos outros. Consulte a $ocumenta,(o para ver outros m)to$os. / iste uma classe an&lo%a# a 'ava.util.Jrrays# que faz opera,-es similares com arraDs. L importante conhec!-las para evitar escrever c+$i%o j& e istente. A#ora a mel$or $ora de aprender al#o novo
*e voc! %osta $e estu$ar essa apostila aberta $a Caelum# certamente vai %ostar $os novos cursos online que lan,amos na plataforma Alura. 4oc! estu$a a qualquer momento com a qualidade Caelum.
Conhe,a a 5lura.
/ %ere o %etter pelo /clipse# caso necess&rio. =. ;a,a sua classe +ontaPoupanca implementar a interface +ompara"le3+ontaPoupanca4. 8tilize o crit)rio $e or$enar pelo n6mero $a conta ou pelo seu sal$o 9como visto no c+$i%o $este captulo:.
pu"lic class +ontaPoupanca eAten#s +onta implements +ompara"le3+ontaPoupanca4 ! ... &
Eepare que o /clipse prontamente lhe oferecer& um quicGfi # oferecen$o a cria,(o $o esqueleto $os m)to$os $efini$os na interface +ompara"le:
&
R. Crie uma classe Pesta2r#enacao# on$e voc! vai instanciar $iversas contas e a$icion&las a uma 9ist3+ontaPoupanca4. 8se o +ollections.sort() nessa lista:
pu"lic class Pesta2r#enacao ! pu"lic static voi# main(Strin $% ar s) ! 9ist3+ontaPoupanca4 contas G new Jrray9ist34(); +ontaPoupanca c/ G new +ontaPoupanca(); c/.setDumero(/YZ:); contas.a##(c/);
+ontaPoupanca c7 G new +ontaPoupanca(); c7.setDumero(/6N7); contas.a##(c7); +ontaPoupanca c: G new +ontaPoupanca(); c:.setDumero(/<;6); contas.a##(c:); & & +ollections.sort(contas);
;a,a um la,o para imprimir to$os os n6meros $as contas na lista j& or$ena$a:
for (int i G -; i 3 contas.siMe(); iLL) ! +onta atual G contas. et(i); System.out.println("numero, " L atual. etDumero()); &
Ateno especial: repare que escrevemos um m)to$o comparePo em nossa classe e nosso c+$i%o nunca o invocaOO 'sto ) muito comum. Eeescrevemos 9ou implementamos: um m)to$o e quem o invocar& ser& um outro conjunto $e classes 9nesse caso# quem est& chaman$o o comparePo ) o +ollections.sort# que o usa como base para o al%oritmo $e or$ena,(o:. 'sso cria um sistema e tremamente coeso e# ao mesmo tempo# com bai o acoplamento: a classe +ollections nunca ima%inou que or$enaria objetos $o tipo +ontaPoupanca# mas j& que eles s(o +ompara"le# o seu m)to$o sort est& satisfeito. 4oc! po$eria escrever o for acima $e uma maneira mais sucinta:
for (int i G -; i 3 contas.siMe(); iLL) ! System.out.println("numero, " L contas. et(i). etDumero()); &
K. 1 que teria aconteci$o se a classe +ontaPoupanca n(o implementasse +ompara"le3+ontaPoupanca4 mas tivesse o m)to$o comparePoC ;a,a um teste: remova temporariamente a senten,a implements +ompara"le3+ontaPoupanca4# n(o remova o m)to$o comparePo e veja o que acontece. Basta ter o m)to$o# sem assinar a interfaceC J. 8tilize uma 9in0e#9ist em vez $e Jrray9ist:
9ist3+ontaPoupanca4 contas G new 9in0e#9ist34();
2recisamos alterar mais al%um c+$i%o para que essa substitui,(o funcioneC Eo$e o pro%rama. 5l%uma $iferen,aC Q. Como posso inverter a or$em $e uma listaC Como posso embaralhar to$os os elementos $e uma listaC Como posso rotacionar os elementos $e uma listaC 'nvesti%ue a $ocumenta,(o $a classe +ollections $entro $o pacote 'ava.util. N. 9opcional: *e preferir# insira novas contas atrav)s $e um la,o 9for:. 5$ivinhe o nome $a classe para colocar sal$os aleat+riosC [an#om. 3o pacote 'ava.util. Consulte sua $ocumenta,(o para us&-la 9utilize o m)to$o neAtQnt() passan$o o n6mero m& imo a ser sortea$o:. Y. 9opcional: 'mprima a refer!ncia para essa lista. Eepare que o toStrin $e uma Jrray9ist/9in0e#9ist ) reescritoC
System.out.println(contas);
A. 9opcional: "u$e o crit)rio $e compara,(o $a sua +ontaPoupanca. 5$icione um atributo nomeEo+liente na sua classe 9caso ain$a n(o e ista al%o semelhante: e tente mu$ar o comparePo para que uma lista $e +ontaPoupanca seja or$ena$a alfabeticamente pelo atributo nomeEo+liente. Heste a or$ena,(o.
8m conjunto ) representa$o pela interface Set e tem como suas principais implementa,-es as classes ^ashSet# 9in0e#^ashSet e PreeSet. 1 c+$i%o a se%uir cria um conjunto e a$iciona $iversos elementos# e al%uns repeti$os:
Set3Strin 4 car os G new ^ashSet34(); car car car car car car os.a##("\erente"); os.a##("Eiretor"); os.a##("Presi#ente"); os.a##("SecretIria"); os.a##("8uncionIrio"); os.a##("Eiretor"); (( repeti#o!
5qui# o se%un$o Eiretor n(o ser& a$iciona$o e o m)to$o a## lhe retornar& false. 1 uso $e um Set po$e parecer $esvantajoso# j& que ele n(o armazena a or$em# e n(o aceita elementos repeti$os. 0(o h& m)to$os que trabalham com n$ices# como o et(int) que as listas possuem. 5 %ran$e vanta%em $o Set ) que e istem implementa,-es# como a ^ashSet# que possui uma performance incompar&vel com as 9ists quan$o usa$o para pesquisa 9m)to$o contains por e emplo:. 4eremos essa enorme $iferen,a $urante os e erccios. Ordem de um et *eria possvel usar uma outra implementa,(o $e conjuntos# como um PreeSet# que insere os elementos $e tal forma que# quan$o forem percorri$os# eles apare,am em uma or$em $efini$a pelo m)to$o $e compara,(o entre seus elementos. /sse m)to$o ) $efini$o pela interface 'ava.lan .+ompara"le. 1u# ain$a# po$e se passar um +omparator para seu construtor. .& o 9in0e#^ashSet mant)m a or$em $e inser,(o $os elementos. 5ntes $o .ava J# n(o po$amos utilizar %enerics# e us&vamos o Set $e forma que ele trabalhava com 2"'ect# haven$o necessi$a$e $e castin%s.
8ma cole,(o po$e implementar $iretamente a interface +ollection# por)m normalmente se usa uma $as $uas subinterfaces mais famosas: justamente Set e 9ist. 5 interface Set# como previamente vista# $efine um conjunto $e elementos 6nicos enquanto a interface 9ist permite elementos $uplica$os# al)m $e manter a or$em a qual eles foram a$iciona$os. 5 busca em um Set po$e ser mais r&pi$a $o que em um objeto $o tipo 9ist# pois $iversas implementa,-es utilizam-se $e tabelas $e espalhamento 9hash tables:# realizan$o a busca para tempo linear 9OH1I:. 5 interface Map faz parte $o frameworG# mas n(o esten$e +ollection. 9veremos Map mais a$iante:.
0o .ava J# temos outra interface filha $e +ollection: a Kueue# que $efine m)to$os $e entra$a e $e sa$a e cujo crit)rio ser& $efini$o pela sua implementa,(o 9por e emplo F';1# ;';1 ou ain$a um heap on$e ca$a elemento possui sua chave $e priori$a$e:. +oc, pode tambm -a.er o curso /J-11 dessa apostila na Caelum
@ueren$o apren$er ain$a mais sobre .ava e boas pr&ticas $e orienta,(o a objetosC /sclarecer $6vi$as $os e ercciosC 1uvir e plica,-es $etalha$as com um instrutorC 5 Caelum oferece o curso /J-11 presencial nas ci$a$es $e *(o 2aulo# Eio $e .aneiro e Braslia# al)m $e turmas incompanD. Consulte as vanta%ens $o curso Java e Orientao a Objetos.
/m que or$em os elementos ser(o acessa$osC 0uma lista# os elementos aparecer(o $e acor$o com o n$ice em que foram inseri$os# isto )# $e acor$o com o que foi pr)-$etermina$o. /m um conjunto# a or$em $epen$e $a implementa,(o $a interface Set: voc! muitas vezes n(o vai saber ao certo em que or$em os objetos ser(o percorri$os. 2or que o Set )# ent(o# t(o importante e usa$oC 2ara perceber se um item j& e iste em uma lista# ) muito mais r&pi$o usar al%umas implementa,-es $e Set $o que um 9ist# e os PreeSets j& v!m or$ena$os $e acor$o com as caractersticas que $esejarmosO *empre consi$ere usar um Set se n(o houver a necessi$a$e $e %uar$ar os elementos em $etermina$a or$em e busc&-los atrav)s $e um n$ice. 0o eclipse# voc! po$e escrever foreach e $ar ctrlJespao# que ele vai %erar o esqueleto $esse enhance$ forO "uito 6tilO
5in$a hoje 9$epois $o .ava J: po$emos usar o Qterator# mas o mais comum ) usar o enhance$for. /# na ver$a$e# o enhance$-for ) apenas um a,6car sint&tico que usa iterator por tr&s $os panos. 2rimeiro criamos um Qterator que entra na cole,(o. 5 ca$a chama$a $o m)to$o neAt# o Qterator retorna o pr+ imo objeto $o conjunto. 8m iterator po$e ser obti$o com o m)to$o iterator() $e +ollection# por e emplo numa lista $e Strin :
Qterator3Strin 4 i G lista.iterator();
5 interface Qterator possui $ois m)to$os principais: hasDeAt() 9com retorno booleano:# in$ica se ain$a e iste um elemento a ser percorri$o? neAt()# retorna o pr+ imo objeto. 4oltan$o ao e emplo $o conjunto $e strin%s# vamos percorrer o conjunto:
Set3Strin 4 con'unto G new ^ashSet34(); con'unto.a##("item /"); con'unto.a##("item 7"); con'unto.a##("item :"); (( retorna o iterator Qterator3Strin 4 i G con'unto.iterator(); while (i.hasDeAt()) ! (( rece"e a palavra Strin palavra G i.neAt(); System.out.println(palavra); &
1 while anterior s+ termina quan$o to$os os elementos $o conjunto forem percorri$os# isto )#
quan$o o m)to$o hasDeAt mencionar que n(o e istem mais itens. Nist8terator 8ma lista fornece# al)m $e acesso a um Qterator# um 9istQterator# que oferece recursos a$icionais# especficos para listas. 8san$o o 9istQterator# voc! po$e# por e emplo# a$icionar um elemento na lista ou voltar para o elemento que foi "itera$o" anteriormente. )sar 8terator em ve. do en$anced--or? 1 Qterator po$e sim ain$a ser 6til# mesmo ap+s o .ava J . 5l)m $e iterar na cole,(o como faz o enhance$-for# o Qterator conse%ue remover elementos $a cole,(o $urante a itera,(o $e uma forma ele%ante# atrav)s $o m)to$o remove.
1 m)to$o put(2"'ectF 2"'ect) $a interface Map recebe a chave e o valor $e uma nova associa,(o. 2ara saber o que est& associa$o a um $etermina$o objeto-chave# passa-se esse objeto no m)to$o et(2"'ect). *em $6vi$a essas s(o as $uas opera,-es principais e mais frequentes realiza$as sobre um mapa. 1bserve o e emplo: criamos $uas contas correntes e as colocamos em um mapa associan$o-as aos seus $onos.
+onta+orrente c/ G new +onta+orrente(); c/.#eposita(/----); +onta+orrente c7 G new +onta+orrente(); c7.#eposita(:---); (( cria o mapa Map3Strin F +onta+orrente4 mapaEe+ontas G new ^ashMap34(); (( a#iciona #uas chaves e seus respectivos valores mapaEe+ontas.put("#iretor"F c/); mapaEe+ontas.put(" erente"F c7); (( )ual a conta #o #iretor] (sem castin !) +onta+orrente contaEoEiretor G mapaEe+ontas. et("#iretor"); System.out.println(contaEoEiretor. etSal#o());
8m mapa ) muito usa$o para "in$e ar" objetos $e acor$o com $etermina$o crit)rio# para po$ermos buscar esse objetos rapi$amente. 8m mapa costuma aparecer juntamente com outras cole,-es# para po$er realizar essas buscasO /le# assim como as cole,-es# trabalha $iretamente com 2"'ects 9tanto na chave quanto no valor:# o que tornaria necess&rio o castin% no momento que recuperar elementos. 8san$o os %enerics# como fizemos aqui# n(o precisamos mais $o castin%. *uas principais implementa,-es s(o o ^ashMap# o PreeMap e o ^ashta"le. 5pesar $o mapa fazer parte $o frameworG# ele n(o esten$e a interface +ollection# por ter um comportamento bem $iferente. 2or)m# as cole,-es internas $e um mapa 9a $e chaves e a $e valores# ver ;i%ura N: s(o acessveis por m)to$os $efini$os na interface Map.
1 m)to$o 0eySet() retorna um Set com as chaves $aquele mapa e o m)to$o values() retorna a +ollection com to$os os valores que foram associa$os a al%uma $as chaves. &ire suas d'vidas no novo ()J ;espostas
1 78. ) um $os principais f+runs brasileiros $e computa,(o e o maior em portu%u!s sobre .ava. 5 nova vers(o $o 78. ) basea$a em uma ferramenta $e perguntas e respostas 9@5: e tem uma comuni$a$e muito forte. *(o mais $e 1JB mil usu&rios pra aju$ar voc! a esclarecer suas $6vi$as. ;a,a sua per%unta.
Eepare que n(o houve a necessi$a$e $o castin% para Strin no momento $e recuperar os objetos associa$os. 'sto porque a classe Properties foi $esenha$a com o prop+sito $e trabalhar com a associa,(o entre Strin s.
utiliza$as para que a pesquisa $e um objeto seja feita $e maneira r&pi$a. Como funcionaC Ca$a objeto ) "classifica$o" pelo seu hash+o#e e# com isso# conse%uimos espalhar ca$a objeto a%rupan$o-os pelo hash+o#e. @uan$o buscamos $etermina$o objeto# s+ vamos procurar entre os elementos que est(o no %rupo $aquele hash+o#e. 3entro $esse %rupo# vamos testan$o o objeto procura$o com o can$i$ato usan$o e)uals(). 2ara que isso funcione $ireito# o m)to$o hash+o#e $e ca$a objeto $eve retornar o mesmo valor para $ois objetos# se eles s(o consi$era$os e)uals. /m outras palavras: a.e)uals(") implica a.hash+o#e() GG ".hash+o#e() 'mplementar hash+o#e $e tal maneira que ele retorne valores $iferentes para $ois objetos consi$era$os e)uals quebra o contrato $e 2"'ect e resultar& em collections que usam espalhamento 9como ^ashSet# ^ashMap e ^ashta"le:# n(o achan$o objetos i%uais $entro $e uma mesma cole,(o. =quals e $as$Code no =clipse 1 /clipse ) capaz $e %erar uma implementa,(o correta $e equals e hashco$e basea$o nos atributos que voc! queira comparar. Basta ir no menu *ource e $epois em 7enerate hashco$e9: an$ equals9:.
/$itoras tra$icionais pouco li%am para ebooGs e novas tecnolo%ias. 0(o conhecem pro%rama,(o para revisar os livros tecnicamente a fun$o. 0(o t!m anos $e e peri!ncia em $i$&ticas com cursos. Conhe,a a Casa do C*di#o# uma e$itora $iferente# com cura$oria $a Caelum e obsess(o por livros $e quali$a$e a pre,os justos. Casa $o C+$i%o# ebooG com pre,o $e ebooG.
1 que ) lentoC 5 inser,(o $e RB mil elementos ou as RB mil buscasC 3escubra computan$o o tempo %asto em ca$a for separa$amente. 5 $iferen,a ) mais que %ritante. *e voc! passar $e RB mil para um n6mero maior# como JB ou 1BB mil# ver& que isso inviabiliza por completo o uso $e uma 9ist# no caso em que queremos utiliz&-la essencialmente em pesquisas. =. 9conceitual# importante: Eepare que# se voc! $eclarar a cole,(o e $er new assim:
+ollection3Qnte er4 teste G new Jrray9ist34();
em vez $e:
Jrray9ist3Qnte er4 teste G new Jrray9ist34();
L %aranti$o que vai ter $e alterar s+ essa linha para substituir a implementa,(o por ^ashSet. /stamos aqui usan$o o polimorfismo para nos prote%er que mu$an,as $e implementa,(o venham nos obri%ar a alterar muito c+$i%o. "ais uma vez: programe voltado a inter"ace& e no % implementaoO /sse ) um e!celente e emplo $e bom uso $e interfaces# afinal# $e que importa como a cole,(o funcionaC 1 que queremos ) uma cole,(o qualquer# isso ) suficiente para os nossos prop+sitosO 0osso c+$i%o est& com bai!o acoplamento em rela,(o a estrutura $e $a$os utiliza$a: po$emos troc&-la facilmente. /sse ) um c+$i%o e tremamente ele%ante e fle vel. Com o tempo voc! vai reparar que as pessoas tentam pro%ramar sempre se referin$o a essas interfaces menos especficas# na me$i$a $o possvel: m)to$os costumam receber e $evolver +ollections# 9ists e Sets em vez $e referenciar $iretamente uma implementa,(o. L o mesmo que ocorre com o uso $e QnputStream e 2utputStream: eles s(o o suficiente# n(o h& porque for,ar o uso $e al%o mais especfico.
1bviamente# al%umas vezes n(o conse%uimos trabalhar $essa forma e precisamos usar uma interface mais especfica ou mesmo nos referir ao objeto pela sua implementa,(o para po$er chamar al%uns m)to$os. 2or e emplo# PreeSet tem mais m)to$os que os $efini$os em Set# assim como 9in0e#9ist em rela,(o < 9ist. 3! um e emplo $e um caso em que n(o po$eramos nos referir a uma cole,(o $e elementos como +ollection# mas necessariamente por interfaces mais especficas como 9ist ou Set. R. ;a,a testes com o Map# como visto nesse captulo:
pu"lic class PestaMapa ! pu"lic static voi# main(Strin $% ar s) ! +onta c/ G new +onta+orrente(); c/.#eposita(/----); +onta c7 G new +onta+orrente(); c7.#eposita(:---); (( cria o mapa Map mapaEe+ontas G new ^ashMap(); (( a#iciona #uas chaves e seus valores mapaEe+ontas.put("#iretor"F c/); mapaEe+ontas.put(" erente"F c7); (( )ual a conta #o #iretor] +onta contaEoEiretor G (+onta) mapaEe+ontas. et("#iretor"); System.out.println(contaEoEiretor. etSal#o());
& &
3epois# altere o c+$i%o para usar o generics e n(o haver a necessi$a$e $o castin%# al)m $a %arantia $e que nosso mapa estar& se%uro em rela,(o a tipa%em usa$a. 4oc! po$e utilizar o quic!"i# $o /clipse para que ele conserte isso para voc!: na linha em que voc! est& chaman$o o put# use o ctrl L /. 3epois $e mais um quicGfi 9$escubraO: seu c+$i%o $eve ficar como se%ue:
(( cria o mapa Map3Strin F +onta4 mapaEe+ontas G new ^ashMap3Strin F +onta4();
@ue op,(o $o ctrl L / voc! escolheu para que ele a$icionasse o generics para voc!C K. 9opcional: 5ssim como no e erccio 1# crie uma compara,(o entre Jrray9ist e 9in0e#9ist# para ver qual ) a mais r&pi$a para se a$icionar elementos na primeira posi,(o 9list.a##(-F elemento):# como por e emplo:
pu"lic class PestaPerformanceEeJ#icionarDaPrimeiraPosicao ! pu"lic static voi# main(Strin $% ar s) ! System.out.println("Qnician#o..."); lon inicio G System.currentPimeMillis(); (( trocar #epois por Jrray9ist 9ist3Qnte er4 teste G new 9in0e#9ist34(); for (int i G -; i 3 :----; iLL) ! teste.a##(-F i); & lon fim G System.currentPimeMillis();
& &
*e%uin$o o mesmo raciocnio# voc! po$e ver qual ) a mais r&pi$a para se percorrer usan$o o et(in#ice) 9sabemos que o correto seria utilizar o enhanced "or ou o Qterator:. 2ara isso# insira RB mil elementos e $epois percorra-os usan$o ca$a implementa,(o $e 9ist. 2erceba que aqui o nosso intuito n(o ) que voc! apren$a qual ) o mais r&pi$o# o importante ) perceber que po$emos tirar proveito $o polimorfismo para nos comprometer apenas com a interface. 3epois# quan$o necess&rio# po$emos trocar e escolher uma implementa,(o mais a$equa$a as nossas necessi$a$es. @ual $as $uas listas foi mais r&pi$a para a$icionar elementos < primeira posi,(oC J. 9opcional: Crie uma classe Sanco que possui uma 9ist $e +onta chama$a contas. Eepare que numa lista $e +onta# voc! po$e colocar tanto +onta+orrente quanto +ontaPoupanca por causa $o polimorfismo. Crie um m)to$o voi# a#iciona(+onta c)# um m)to$o +onta pe a(int A) e outro int pe aKuanti#a#eEe+ontas()# muito similar < rela,(o anterior $e /mpresa-;uncion&rio. Basta usar a sua lista e $ele%ar essas chama$as para os m)to$os e cole,-es que estu$amos. Como ficou a classe SancoC Q. 9opcional: 0o Sanco# crie um m)to$o +onta "uscaPorDome(Strin procura por uma +onta cujo nome seja e)uals ao nome $a$o. nome) que
4oc! po$e implementar esse m)to$o com um for na sua lista $e +onta# por)m n(o tem uma performance eficiente. 5$icionan$o um atributo priva$o $o tipo Map3Strin F +onta4 ter& um impacto si%nificativo. Ho$a vez que o m)to$o a#iciona(+onta c) for invoca$o# voc! $eve invocar .put(c. etDome()F c) no seu mapa. 3essa maneira# quan$o al%u)m invocar o m)to$o +onta "uscaPorDome(Strin nome)# basta voc! fazer o et no seu mapa# passan$o nome como ar%umentoO 0ote# apenas# que isso ) s+ um e erccioO 3essa forma voc! n(o po$er& ter $ois clientes com o mesmo nome nesse banco# o que sabemos que n(o ) le%al. Como ficaria sua classe Sanco com esse MapC N. 9opcional# avan,a$o: Crie o m)to$o hash+o#e para a sua conta# $e forma que ele respeite o e)uals $e que $uas contas s(o e)uals quan$o tem o mesmo n6mero. ;elizmente para n+s# o pr+prio /clipse j& vem com um cria$or $e e)uals e hash+o#e que os faz $e forma consistente. 0a classe +onta# use o ctrl L : e comece a escrever hashCode para achar a op,(o $e %er&-los. /nt(o# selecione apenas o atributo nUmero e man$e %erar o hash+o#e e o e)uals. Como ficou o c+$i%o %era$oC Y. 9opcional# avan,a$o: Crie uma classe $e teste e verifique se sua classe +onta funciona a%ora corretamente em um ^ashSet# isto )# que ela n(o %uar$a contas com n6meros repeti$os. 3epois# remova o m)to$o hash+o#e. Continua funcionan$oC 3ominar o uso e o funcionamento $o hash+o#e ) fun$amental para o bom pro%rama$or.
1<.1< - >esa-ios
1. 7ere to$os os n6meros entre 1 e 1BBB e or$ene em or$em $ecrescente utilizan$o um PreeSet. Como ficou seu c+$i%oC =. 7ere to$os os n6meros entre 1 e 1BBB e or$ene em or$em $ecrescente utilizan$o um Jrray9ist. Como ficou seu c+$i%oC Captulo 1N
1@.1 - &$reads
G>uas tare-as ao mesmo tempoG
/m v&rias situa,-es# precisamos "ro$ar $uas coisas ao mesmo tempo". 'ma%ine um pro%rama que %era um relat+rio muito %ran$e em 23;. L um processo $emora$o e# para $ar al%uma satisfa,(o para o usu&rio# queremos mostrar uma barra $e pro%resso. @ueremos ent(o %erar o 23; e ao mesmo tempo atualizar a barrinha. 2ensan$o um pouco mais amplamente# quan$o usamos o computa$or tamb)m fazemos v&rias coisas simultaneamente: queremos nave%ar na internet e ao mesmo tempo ouvir m6sica. 5 necessi$a$e $e se fazer v&rias coisas simultaneamente# ao mesmo tempo# paralelamente# aparece frequentemente na computa,(o. 2ara v&rios pro%ramas $istintos# normalmente o pr+prio sistema operacional %erencia isso atrav)s $e v&rios processos em paralelo. /m um pro%rama s+ 9um processo s+:# se queremos e ecutar coisas em paralelo# normalmente falamos $e &$reads.
&$reads em Java
/m .ava# usamos a classe Phrea# $o pacote 'ava.lan para criarmos linhas de e#ecuo paralelas. 5 classe Phrea# recebe como ar%umento um objeto com o c+$i%o que $esejamos ro$ar. 2or e emplo# no pro%rama $e 23; e barra $e pro%resso:
pu"lic class \eraPE8 ! pu"lic voi# ro#ar () ! (( lR ica para erar o p#f... & & pu"lic class SarraEePro resso ! pu"lic voi# ro#ar () ! (( mostra "arra #e pro resso e vai atualiMan#o ela... & &
/# no m)to$o main# criamos os objetos e passamos para a classe Phrea#. 1 m)to$o start ) respons&vel por iniciar a e ecu,(o $a Phrea#:
pu"lic class MeuPro rama ! pu"lic static voi# main (Strin $% ar s) ! \eraPE8 erap#f G new \eraPE8(); Phrea# threa#EoP#f G new Phrea#( erap#f); threa#EoP#f.start(); SarraEePro resso "arraEePro resso G new SarraEePro resso(); Phrea# threa#EaSarra G new Phrea#("arraEePro resso); threa#EaSarra.start(); & &
1 c+$i%o acima# por)m# n(o compilar&. Como a classe Phrea# sabe que $eve chamar o m)to$o ro#aC Como ela sabe que nome $e m)to$o $aremos e que ela $eve chamar esse m)to$o especialC ;alta na ver$a$e um contrato entre as nossas classes a serem e ecuta$as e a classe Phrea#. /sse contrato e iste e ) feito pela inter"ace[unna"le: $evemos $izer que nossa classe ) "e ecut&vel" e que se%ue esse contrato. 0a interface [unna"le# h& apenas um m)to$o chama$o run. Basta implement&-lo# "assinar" o contrato e a classe Phrea# j& saber& e ecutar nossa classe.
pu"lic class \eraPE8 implements [unna"le ! pu"lic voi# run () ! (( lR ica para erar o p#f... & & pu"lic class SarraEePro resso implements [unna"le ! pu"lic voi# run () ! (( mostra "arra #e pro resso e vai atualiMan#o ela... & &
5 classe Phrea# recebe no construtor um objeto que um[unna"le# e seu m)to$o start chama o m)to$o run $a nossa classe. Eepare que a classe Phrea# n(o sabe qual ) o tipo especfico $a nossa classe? para ela# basta saber que a classe se%ue o contrato estabeleci$o e possui o m)to$o run. L o bom uso $e interfaces# contratos e polimorfismo na pr&ticaO =stendendo a classe &$read 5 classe Phrea# implementa [unna"le. /nt(o# voc! po$e criar uma subclasse $ela e reescrever o run que# na classe Phrea## n(o faz na$a:
pu"lic class \eraPE8 eAten#s Phrea# ! pu"lic voi# run () ! (( ... & &
5pesar $e ser um c+$i%o mais simples# voc! est& usan$o heran,a apenas por "pre%ui,a" 9her$amos um monte $e m)to$os mas usamos apenas o run:# e n(o por polimorfismo# que seria a %ran$e vanta%em. 2refira implementar [unna"le a her$ar $e Phrea#. >ormindo 2ara que a threa$ atual $urma basta chamar o m)to$o a se%uir# por e emplo# para $ormir R se%un$os:
Phrea#.sleep(: H /---);
&
L uma classe que implementa [unna"le e# no m)to$o run# apenas imprime $ez mil n6meros. 4amos us&-las $uas vezes para criar $uas threa$s e imprimir os n6meros $uas vezes simultaneamente:
pu"lic class Peste ! pu"lic static voi# main(Strin $% ar s) ! Pro rama p/ G new Pro rama(); p/.setQ#(/); Phrea# t/ G new Phrea#(p/); t/.start(); Pro rama p7 G new Pro rama(); p7.setQ#(7); Phrea# t7 G new Phrea#(p7); t7.start(); & &
*e ro$armos esse pro%rama# qual ser& a sa$aC 3e um a mil e $epois $e um a milC 2rovavelmente n(o# sen(o seria sequencial. /le imprimir& B $e t1# B $e t=# 1 $e t1# 1 $e t=# = $e t1# = $e t= e etcC / atamente intercala$oC 0a ver$a$e# n(o sabemos e atamente qual ) a sa$a. Eo$e o pro%rama v&rias vezes e observe: em ca$a e ecu,(o a sa$a ) um pouco $iferente. 1 problema ) que no computa$or e iste apenas um processa$or capaz $e e ecutar coisas. / quan$o queremos e ecutar v&rias coisas ao mesmo tempo# e o processa$or s+ conse%ue fazer uma coisa $e ca$a vezC /ntra em cena o escalonador de t$reads.
1 escalona$or 9sc$eduler:# saben$o que apenas uma coisa po$e ser e ecuta$a $e ca$a vez# pe%a to$as as threa$s que precisam ser e ecuta$as e faz o processa$or ficar alternan$o a e ecu,(o $e ca$a uma $elas. 5 i$eia ) e ecutar um pouco $e ca$a threa$ e fazer essa troca t(o rapi$amente que a impress(o que fica ) que as coisas est(o sen$o feitas ao mesmo tempo. 1 escalona$or ) respons&vel por escolher qual a pr+ ima threa$ a ser e ecuta$a e fazer a troca de conte!to 9conte t switch:. /le primeiro salva o esta$o $a e ecu,(o $a threa$ atual para $epois po$er retomar a e ecu,(o $a mesma. 5 ele restaura o esta$o $a threa$ que vai ser e ecuta$a e faz o processa$or continuar a e ecu,(o $esta. 3epois $e um certo tempo# esta threa$ ) tira$a $o processa$or# seu esta$o 9o conte to: ) salvo e outra threa$ ) coloca$a em e ecu,(o. 5 troca de conte#to ) justamente as opera,-es $e salvar o conte to $a threa$ atual e restaurar o $a threa$ que vai ser e ecuta$a em se%ui$a. @uan$o fazer a troca $e conte to# por quanto tempo a threa$ vai ro$ar e qual vai ser a pr+ ima threa$ a ser e ecuta$a# s(o escolhas $o escalona$or. 0+s n(o controlamos essas escolhas 9embora possamos $ar "$icas" ao escalona$or:. 2or isso que nunca sabemos ao certo a or$em em que pro%ramas paralelos s(o e ecuta$os. 4oc! po$e pensar que ) ruim n(o saber a or$em. "as perceba que se a or$em importa para voc!# se ) importante que $etermina$a coisa seja feita antes $e outra# ent(o n(o estamos falan$o $e e ecu,-es paralelas# mas sim $e um pro%rama sequencial normal 9on$e uma coisa ) feita $epois $a outra# em uma sequ!ncia:. Ho$o esse processo ) feito automaticamente pelo escalona$or $o .ava 9e# mais amplamente# pelo escalona$or $o sistema operacional:. 2ara n+s# pro%rama$ores $as threa$s# ) como se as coisas estivessem sen$o e ecuta$as ao mesmo tempo. = em mais de um processador? 5 4" $o .ava e a maioria $os *1s mo$ernos conse%ue fazer proveito $e sistemas com v&rios processa$ores ou multi-core. 5 $iferen,a ) que a%ora temos mais $e um processa$or e ecutan$o coisas e teremos# sim# e ecu,-es ver$a$eiramente paralelas. "as o n6mero $e processos no *1 e o n6mero $e Hhrea$s paralelas costumam ser t(o %ran$es que# mesmo com v&rios processa$ores# temos as trocas $e conte to. 5 $iferen,a ) que o escalona$or tem $ois ou mais processa$ores para e ecutar suas threa$s. "as $ificilmente ter& uma m&quina com mais processa$ores que threa$s paralelas e ecutan$o. J1 con$ece os cursos online Alura?
5 Alura oferece $ezenas $e cursos online em sua plataforma e clusiva $e ensino que favorece o apren$iza$o com a qualidade reconheci$a $a Caelum. 4oc! po$e escolher um curso nas &reas $e .ava# EubD# Peb# "obile# .0/H e outros# com uma assinatura que $& acesso a to$os os cursos. Conhe,a os cursos online 5lura.
5t) este momento# sabemos que temos = objetos em mem+ria. 5qui# o =arbage Collector n(o po$e eliminar nenhum $os objetos# pois ain$a tem al%u)m se referin$o a eles $e al%uma forma. 2o$emos# ent(o# e ecutar uma linha que nos fa,a per$er a refer!ncia para um $os $ois objetos cria$os# como# por e emplo# o se%uinte c+$i%o:
conta7 G conta/;
@uantos objetos temos em mem+riaC 2er$emos a refer!ncia para um $os objetos que foram cria$os. /sse objeto j& n(o ) mais acessvel. Hemos# ent(o# apenas um objeto em mem+riaC 0(o po$emos afirmar issoO Como o =arbage Collector ) uma Hhrea$# voc! n(o tem %arantia $e quan$o ele vai ro$ar. 4oc! s+ sabe que# em al%um momento no futuro# aquela mem+ria vai ser libera$a. 5l%umas pessoas costumam atribuir null a uma vari&vel# com o intuito $e acelerar a passa%em $o =arbage Collector por aquele objeto:
for (int i G -; i 3 /--; iLL) ! 9ist A G new Jrray9ist(); (( faM al umas coisas com a arraylist A G null; &
'sso rarissimamente ) necess&rio. 1 =arbage Collector a%e apenas sobre objetos# nunca sobre vari&veis. 0esse caso# a vari&vel A n(o e istir& mais a ca$a itera,(o# $ei an$o a Jrray9ist cria$a sem nenhuma refer!ncia para ela. 2stem.#cHI 4oc! nunca conse%ue for,ar o 7arba%e Collector# mas chaman$o o m)to$o est&tico c $a classe System# voc! est& su%erin$o que a 4irtual "achine ro$e o 7arba%e Collector naquele momento. *e sua su%est(o vai ser aceita ou n(o# isto $epen$e $e .4" para .4"# e voc! n(o tem %arantias. /vite o uso $este m)to$o. 4oc! n(o $eve basear sua aplica,(o em quan$o o 7arba%e Collector vai ro$ar ou n(o. /inali.er 5 classe 2"'ect $efine tamb)m um m)to$o finaliMe# que voc! po$e reescrever. /sse m)to$o ser& chama$o no instante antes $o 7arba%e Collector coletar este objeto. 0(o ) um $estrutor# voc! n(o sabe em que momento ele ser& chama$o. 5l%umas pessoas o utilizam para liberar recursos "caros" como cone -es# threa$s e recursos nativos. 'sso $eve ser utiliza$o apenas por se%uran,a: o i$eal ) liberar esses recursos o mais r&pi$o possvel# sem $epen$er $a passa%em $o 7arba%e Collector.
1 JtualiMa#orEe+ontas# basicamente# pe%a uma a uma ca$a uma $as milh-es $e contas e chama seu m)to$o atualiMa. 5 atualiza,(o $e milh-es $e contas ) um processo $emora$o# que $ura horas? ) invi&vel parar o banco por tanto tempo at) que as atualiza,-es tenham completa$o. L preciso e ecutar as atualiza,-es paralelamente <s ativi$a$es# $e $ep+sitos e saques# normais $o banco. 1u seja# teremos v&rias threa$s ro$an$o paralelamente. /m uma threa$# pe%amos to$as as contas e vamos chaman$o o m)to$o atualiMa $e ca$a uma. /m outra# po$emos estar sacan$o ou $epositan$o $inheiro. /stamos compartilhan$o objetos entre m6ltiplas threa$s 9as contas# no nosso caso:. 'ma%ine a se%uinte possibili$a$e 9mesmo que muito remota:: no e ato instante em que o atualiza$or est& atualizan$o uma Conta M# o cliente $ono $esta Conta resolve efetuar um saque. Como sabemos# ao trabalhar com Hhrea$s# o escalona$or po$e parar uma certa Hhrea$ a qualquer instante para e ecutar outra# e voc! n(o tem controle sobre isso. 4eja essa classe Conta:
pu"lic class +onta ! private #ou"le sal#o; (( outros mTto#os e atri"utos... pu"lic voi# atualiMa(#ou"le taAa) ! #ou"le sal#oJtualiMa#o G this.sal#o H (/ L taAa); this.sal#o G sal#oJtualiMa#o; & pu"lic voi# #eposita(#ou"le valor) ! #ou"le novoSal#o G this.sal#o L valor; this.sal#o G novoSal#o; &
&
'ma%ine uma Conta com sal$o $e 1BB reais. 8m cliente entra na a%!ncia e faz um $ep+sito $e 1BBB reais. 'sso $ispara uma Hhrea$ no banco que chama o m)to$o #eposita()? ele come,a calculan$o o novoSal#o que passa a ser 11BB 9linha 1R:. *+ que por al%um motivo que $esconhecemos# o escalona$or p&ra essa threa$. 0este e ato instante# ele come,a a e ecutar uma outra Hhrea$ que chama o m)to$o atualiMa $a mesma +onta# por e emplo# com ta a $e 1U. 'sso quer $izer que o novoSal#o passa a valer 1B1 reais 9linha Y:. /# nesse instante o escalona$or troca $e Hhrea$s novamente. /le e ecuta a linha 1K na Hhrea$ que fazia o $ep+sito? o sal$o passa a valer 11BB. 5caban$o o $eposita# o escalona$or volta pra Hhrea$ $o atualiza e e ecuta a linha A# fazen$o o sal$o valer 1B1 reais. Eesulta$o: o $ep+sito $e mil reais foi totalmente i%nora$o e seu Cliente ficar& pouco feliz com isso. 2erceba que n(o ) possvel $etectar esse erro# j& que to$o o c+$i%o foi e ecuta$o perfeitamente# sem problemas. O problema4 aqui4 -oi o acesso simultLneo de duas &$reads ao mesmo objeto. / o erro s+ ocorreu porque o escalona$or parou nossas Hhrea$s naqueles e atos lu%ares. 2o$e ser que nosso c+$i%o fique ro$an$o 1 ano sem $ar problema al%um e em um belo $ia o escalona$or resolve alternar nossas Hhrea$s $aquela forma. 0(o sabemos como o escalona$or se comportaO Hemos que prote%er nosso c+$i%o contra esse tipo $e problema. 3izemos que essa classe n(o ) thread sa"e# isso )# n(o est& pronta para ter uma inst[ncia utiliza$a entre v&rias threa$s concorrentemente. 1 que queramos era que n(o fosse possvel al%u)m atualizar a +onta enquanto outra pessoa est& $epositan$o um $inheiro. @ueramos que uma Hhrea$ n(o pu$esse me er em uma +onta enquanto
outra Hhrea$ est& me en$o nela. 0(o h& como impe$ir o escalona$or $e fazer tal escolha. /nt(o# o que fazerC 8ma i$eia seria criar uma trava e# no momento em que uma Hhrea$ entrasse em um $esses m)to$os# ela trancaria a entra$a com uma chave. 3essa maneira# mesmo que sen$o coloca$a $e la$o# nenhuma outra Hhrea$ po$eria entrar nesses m)to$os# pois a chave estaria com a outra Hhrea$. /ssa i$eia ) chama$a $e re#io cr"tica. L um pe$a,o $e c+$i%o que $efinimos como crtico e que n(o po$e ser e ecuta$o por $uas threa$s ao mesmo tempo. 5penas uma threa$ por vez conse%ue entrar em al%uma re%i(o crtica. 2o$emos fazer isso em .ava. 2o$emos usar qualquer objeto como um locM 9trava# chave:# para po$er sincroni.ar em cima $esse objeto# isto )# se uma Hhrea$ entrar em um bloco que foi $efini$o como sincroniza$o por esse locG# apenas uma Hhrea$ po$er& estar l& $entro ao mesmo tempo# pois a chave estar& com ela. 5 palavra chave synchroniMe# $& essa caracterstica a um bloco $e c+$i%o e recebe qual ) o objeto que ser& usa$o como chave. 5 chave s+ ) $evolvi$a no momento em que a Hhrea$ que tinha essa chave sair $o bloco# seja por return ou $isparo $e uma e ce,(o 9ou ain$a na utiliza,(o $o m)to$o wait():.. @ueremos# ent(o# bloquear o acesso simult[neo a uma mesma +onta:
pu"lic class +onta ! private #ou"le sal#o; (( outros mTto#os e atri"utos... pu"lic voi# atualiMa(#ou"le taAa) ! synchroniMe# (this) ! #ou"le sal#oJtualiMa#o G this.sal#o H (/ L taAa); this.sal#o G sal#oJtualiMa#o; & & pu"lic voi# #eposita(#ou"le valor) ! synchroniMe# (this) ! #ou"le novoSal#o G this.sal#o L valor; this.sal#o G novoSal#o; & & &
1bserve o uso $os blocos synchroniMe# $entro $os $ois m)to$os. /les bloqueiam uma Hhrea$ utilizan$o o mesmo objeto +onta# o this. /sses m)to$os s(o mutuamente e clusivos e s+ e ecutam $e maneira atImica. Hhrea$s que tentam pe%ar um locG que j& est& pe%o# ficar(o em um conjunto especial esperan$o pela libera,(o $o locG 9n(o necessariamente numa fila:. incroni.ando o bloco inteiro L comum sempre sincronizarmos um m)to$o inteiro# normalmente utilizan$o o this.
pu"lic voi# meto#o() ! synchroniMe# (this) ! (( conteU#o #o meto#o & &
2ara este mesmo efeito# e iste uma sinta e mais simples# on$e o synchroniMe# po$e ser usa$o como mo$ifica$or $o m)to$o:
pu"lic synchroniMe# voi# meto#o() ! (( conteU#o #o meto#o &
0ais sobre locMs4 monitores e concorr,ncia *e o m)to$o for est&tico# ser& sincroniza$o usan$o o locG $o objeto que representa a classe 9DomeEa+lasse.class:. 5l)m $isso# o pacote 'ava.util.concurrent# conheci$o como J)C# entrou no .ava J.B para facilitar uma s)rie $e trabalhos comuns que costumam aparecer em uma aplica,(o concorrente. /sse pacote aju$a at) mesmo criar threa$s e pool $e threa$s# atrav)s $os / ecutors.
4oc! che%ou aqui porque a Caelum ) refer!ncia nacional em cursos $e .ava# EubD# 5%ile# "obile# Peb e .0/H. ;a,a curso com quem escreveu essa apostila. Consulte as vanta%ens $o curso Java e Orientao a Objetos.
1@.@ - =!erc"cios
1. Heste o e emplo $este captulo para imprimir n6meros em paralelo.
&
Eo$e v&rias vezes a classe Peste e observe os $iferentes resulta$os em ca$a e ecu,(o. 1 que mu$aC
this.comeco G comeco; this.fim G fim; this.mensa ens G mensa ens; & pu"lic voi# run() ! for (int i G comeco; i 3 fim; iLL) ! mensa ens.a##("Mensa em " L i); & &
&
4amos criar tr!s threa$s que ro$em esse c+$i%o# to$as a$icionan$o as mensa%ens na mesmaJrray9ist. /m outras palavras# teremos threa$s compartilhan$o e acessan$o um mesmo objeto: ) aqui que mora o peri%o.
pu"lic class [e istroEeMensa ens ! pu"lic static voi# main(Strin $% ar s) throws Qnterrupte#CAception ! +ollection3Strin 4 mensa ens G new Jrray9ist3Strin 4(); Phrea# t/ G new Phrea#(new Pro#uMMensa ens(-F /----F mensa ens)); Phrea# t7 G new Phrea#(new Pro#uMMensa ens(/----F 7----F mensa ens)); Phrea# t: G new Phrea#(new Pro#uMMensa ens(7----F :----F mensa ens)); t/.start(); t7.start(); t:.start(); (( faM com )ue a threa# )ue ro#a o main a uar#e o fim #essas t/.'oin(); t7.'oin(); t:.'oin(); System.out.println("Phrea#s pro#utoras #e mensa ens finaliMa#as!"); (( verifica se to#as as mensa ens foram uar#a#as for (int i G -; i 3 /;---; iLL) ! if (!mensa ens.contains("Mensa em " L i)) ! throw new Qlle alStateCAception("no encontrei a mensa em, " L i); & & (( verifica se al uma mensa em ficou nula if (mensa ens.contains(null)) ! throw new Qlle alStateCAception("no #evia ter null a)ui #entro!"); & & & System.out.println("8im #a eAecucao com sucesso");
Eo$e al%umas vezes. 1 que aconteceC =. Heste o c+$i%o anterior# mas usan$o synchroniMe# ao a$icionar na cole,(o:
pu"lic voi# run() ! for (int i G comeco; i 3 fim; iLL) ! synchroniMe# (mensa ens) ! mensa ens.a##("Mensa em " L i); & &
&
R. *em usar o synchroniMe# teste com a classe 5ector# que uma+ollection e ) thread)sa"e. 1 que mu$ouC 1lhe o c+$i%o $o m)to$o a## na classe 5ector. 1 que tem $e $iferente neleC K. 0ovamente sem usar o synchroniMe## teste usar ^ashSet e 9in0e#9ist# em vez $e 5ector. ;a,a v&rios testes# pois as threa$s v(o se entrela,ar ca$a vez $e uma maneira $iferente# po$en$o ou n(o ter um efeito inespera$o. 0o captulo $e *ocGets usaremos threa$s para solucionar um problema real $e e ecu,-es paralelas. Captulo 1Y
= a#ora?
"5 primeira coisa a enten$er ) que voc! n(o enten$e." 1n$e continuar ao terminar os e erccios $e a.ava e 1rienta,(o a 1bjetosa.
1A.2 - 3eb
8m $os principais focos $e .ava# hoje em $ia# ) on$e a maior parte $as va%as e istem: pro%raman$o para a web. /ntram aqui tecnolo%ias como *ervlets# .*2s e ferramentas famosas $o merca$o# como o *truts. 5 Caelum oferece o curso ;.-=1# on$e voc! po$e estu$ar os t+picos necess&rios para come,ar a trabalhar com .ava na web usan$o as melhores pr&ticas# $esi%n patterns e tecnolo%ias $o merca$o. /ssa apostila tamb)m est& $isponvel para $ownloa$. A#ora a mel$or $ora de aprender al#o novo
*e voc! %osta $e estu$ar essa apostila aberta $a Caelum# certamente vai %ostar $os novos cursos online que lan,amos na plataforma Alura. 4oc! estu$a a qualquer momento com a qualidade Caelum. Conhe,a a 5lura.
Ap,ndice - ocMets
"1lho por olho# e o mun$o acabar& ce%o." Conectan$o-se a m&quinas remotas.
1C.2 - Erotocolo
3a necessi$a$e $e $ois computa$ores se comunicarem# sur%iram $iversos protocolos que permitissem tal troca $e informa,(o: o protocolo que vamos usar aqui ) o &CE 9Transmission Control $rotocol:. 5trav)s $o &CE# ) possvel criar um flu o entre $ois computa$ores - como ) mostra$o no $ia%rama abai o:
L possvel conectar mais $e um cliente ao mesmo servi$or# como ) o caso $e $iversos banco $e
$a$os# servi$ores Peb# etc. 5o escrever um pro%rama em .ava que se comunique com outra aplica,(o# n(o ) necess&rio se preocupar com um nvel t(o bai o quanto o protocolo. 5s classes que trabalham com eles j& foram $isponibiliza$as para serem usa$as por n+s no pacote 'ava.net. 5 vanta%em $e se usar HC2# em vez $e criar nosso pr+prio protocolo $e bDtes# ) que o HC2 vai %arantir a entre%a $os pacotes que transferirmos e criar um protocolo base para isto ) al%o bem complica$o. +oc, pode tambm -a.er o curso /J-11 dessa apostila na Caelum
@ueren$o apren$er ain$a mais sobre .ava e boas pr&ticas $e orienta,(o a objetosC /sclarecer $6vi$as $os e ercciosC 1uvir e plica,-es $etalha$as com um instrutorC 5 Caelum oferece o curso /J-11 presencial nas ci$a$es $e *(o 2aulo# Eio $e .aneiro e Braslia# al)m $e turmas incompanD. Consulte as vanta%ens $o curso Java e Orientao a Objetos.
1C.% - Eorta
5cabamos $e mencionar que $iversos computa$ores po$em se conectar a um s+# mas# na reali$a$e# ) muito comum encontrar m&quinas clientes com uma s+ cone (o fsica. /nt(o# como ) possvel se conectar a $ois pontosC Como ) possvel ser conecta$o por $iversos pontosC Ho$as as aplica,-es que est(o envian$o e receben$o $a$os fazem isso atrav)s $a mesma cone (o fsica# mas o computa$or conse%ue $iscernir# $urante a che%a$a $e novos $a$os# quais informa,-es pertencem a qual aplica,(o. "as comoC
5ssim como e iste o 8E para i$entificar uma m&quina# a porta ) a solu,(o para i$entificar $iversas aplica,-es em uma m&quina. /sta porta ) um n6mero $e = bDtes# varia de D a <99%9. *e to$as as portas $e uma m&quina estiverem ocupa$as# n(o ) possvel se conectar a ela enquanto nenhuma for libera$a. 5o confi%urar um servi$or para ro$ar na porta YB 9pa$r(o http:# ) possvel se conectar a esse servi$or atrav)s $essa porta que# junto com o ip# vai formar o en$ere,o $a aplica,(o. 2or e emplo# o servi$or web $a caelum4com4br po$e ser representa$o por: caelum4com4br:@A
1C.6 - ocMet
"as se um cliente se conecta a um pro%rama ro$an$o na porta YB $e um servi$or# enquanto ele n(o se $esconectar $essa porta# ser& impossvel que outra pessoa se conecteC 5contece que# ao efetuar e aceitar a cone (o# o servi$or re$ireciona o cliente $e uma porta para outra# liberan$o novamente sua porta inicial e permitin$o que outros clientes se conectem novamente.
/m .ava# isso $eve ser feito atrav)s $e threa$s e o processo $e aceitar a cone (o $eve ser ro$a$o o mais r&pi$o possvel.
1C.9 - ervidor
'nician$o um mo$elo $e servi$or $e chat# o servi,o $o computa$or que funciona como base $eve# primeiro# abrir uma porta e ficar ouvin$o at) al%u)m tentar se conectar.
import 'ava.net.H; pu"lic class Servi#or ! pu"lic static voi# main(Strin ar s$%) throws Q2CAception !
ServerSoc0et servi#or G new ServerSoc0et(/7:6;); System.out.println("Porta /7:6; a"erta!"); (( a continuao #o servi#or #eve ser escrita a)ui & &
*e o objeto for realmente cria$o# si%nifica que a porta 1=RKJ estava fecha$a e foi aberta. *e outro pro%rama possui o controle $esta porta neste instante# ) normal que o nosso e emplo n(o funcione# pois ele n(o conse%ue utilizar uma porta que j& est& em uso. 5p+s abrir a porta# precisamos esperar por um cliente atrav)s $o m)to$o accept $a ServerSoc0et. 5ssim que um cliente se conectar# o pro%rama continuar&# por isso $izemos que esse m)to$o ) blocante# se%ura a threa$ at) que al%o o notifique.
Soc0et cliente G servi#or.accept(); System.out.println("Dova coneAo com o cliente " L cliente. etQnetJ##ress(). et^ostJ##ress() ); (( imprime o ip #o cliente
2or fim# basta ler to$as as informa,-es que o cliente nos enviar:
Scanner scanner G new Scanner(cliente. etQnputStream()); while (scanner.hasDeAt9ine()) ! System.out.println(scanner.neAt9ine()); &
& &
servi#or.close(); cliente.close();
1 78. ) um $os principais f+runs brasileiros $e computa,(o e o maior em portu%u!s sobre .ava. 5 nova vers(o $o 78. ) basea$a em uma ferramenta $e perguntas e respostas 9@5: e tem uma comuni$a$e muito forte. *(o mais $e 1JB mil usu&rios pra aju$ar voc! a esclarecer suas $6vi$as. ;a,a sua per%unta.
1C.< - Cliente
5 nossa tarefa ) criar um pro%rama cliente que envie mensa%ens para o servi$or... o cliente ) ain$a mais simples $o que o servi$or. 1 c+$i%o a se%uir ) a parte principal e tenta se conectar a um servi$or no '2 1=N.B.B.1 9m&quina local: e porta 1=RKJ:
Soc0et cliente G new Soc0et("/7Z.-.-./"F/7:6;); System.out.println("2 cliente se conectou ao servi#or!");
Basta ler as linhas que o usu&rio $i%itar atrav)s $o buffer $e entra$a 9in:# e jo%&-las no buffer $e sa$a:
PrintStream sai#a G new PrintStream(cliente. et2utputStream()); Scanner tecla#o G new Scanner(System.in); while (tecla#o.hasDeAt9ine()) ! sai#a.println(tecla#o.neAt9ine()); & sai#a.close(); tecla#o.close();
Eepare que usamos os conceito $e 'ava.io aqui novamente# para leitura $o tecla$o e envio $e mensa%ens para o servi$or. 2ara as classes Scanner e PrintStream# tanto faz $e on$e que se l! ou escreve os $a$os: o importante ) que esse stream seja um QnputStream / 2utputStream. L o po$er $as interfaces# $o polimorfismo# aparecen$o novamente. 0osso pro%rama final:
pu"lic class +liente ! pu"lic static voi# main(Strin $% ar s) throws en0nown^ostCAceptionF Q2CAception ! Soc0et cliente G new Soc0et("/7Z.-.-./"F /7:6;); System.out.println("2 cliente se conectou ao servi#or!"); Scanner tecla#o G new Scanner(System.in); PrintStream sai#a G new PrintStream(cliente. et2utputStream());
& &
2ara testar o sistema# precisamos ro$ar primeiro o servi$or e# lo%o $epois# o cliente. Hu$o o que for $i%ita$o no cliente ser& envia$o para o servi$or. 0ultit$readin# 2ara que o servi$or seja capaz $e trabalhar com $ois clientes ao mesmo tempo ) necess&rio criar uma threa$ lo%o ap+s e ecutar o m)to$o accept. 5 threa$ cria$a ser& respons&vel pelo tratamento $essa cone (o# enquanto o la,o $o servi$or $isponibilizar& a porta para uma nova cone (o:
while (true) ! Soc0et cliente G servi#or.accept(); (( cria um o"'eto )ue vai tratar a coneAo Pratamento+lass tratamento G new Pratamento+lass(cliente); (( cria a threa# em cima #este o"'eto Phrea# t G new Phrea#(tratamento); (( inicia a threa# t.start(); &
Crie a classe Servi#or como vimos nesse captulo. 5buse $os recursos $o /clipse para n(o ter $e escrever muitoO
pac0a e "r.com.caelum.chat; import import import import 'ava.io.Q2CAception; 'ava.net.ServerSoc0et; 'ava.net.Soc0et; 'ava.util.Scanner;
pu"lic class Servi#or ! pu"lic static voi# main(Strin $% ar s) throws Q2CAception ! ServerSoc0et servi#or G new ServerSoc0et(/7:6;); System.out.println("Porta /7:6; a"erta!"); Soc0et cliente G servi#or.accept(); System.out.println("Dova coneAo com o cliente " L cliente. etQnetJ##ress(). et^ostJ##ress()); Scanner entra#a G new Scanner(cliente. etQnputStream()); while (entra#a.hasDeAt9ine()) ! System.out.println(entra#a.neAt9ine()); & entra#a.close(); servi#or.close();
& &
pu"lic class +liente ! pu"lic static voi# main(Strin $% ar s) throws en0nown^ostCAceptionF Q2CAception ! Soc0et cliente G new Soc0et("/7Z.-.-./"F /7:6;); System.out.println("2 cliente se conectou ao servi#or!"); Scanner tecla#o G new Scanner(System.in); PrintStream sai#a G new PrintStream(cliente. et2utputStream()); while (tecla#o.hasDeAt9ine()) ! sai#a.println(tecla#o.neAt9ine()); & sai#a.close(); tecla#o.close(); & &
8tilize $os quicG fi es e control espa,o para os imports e o throws. R. Eo$e a classe Servi#or: repare no console $o /clipse que o pro%rama fica esperan$o. Eo$e a classe +liente: a cone (o $eve ser feita e o /clipse $eve mostrar os $ois consoles para voc! 9e iste um pequeno cone na view $e Console para voc! alternar entre eles:.
3i%ite mensa%ens no cliente e veja se elas aparecem corretamente no servi$or. K. Heste seu pro%rama com um cole%a $o curso# usan$o comunica,(o remota entre as $uas m&quinas. Combinem entre si quem vai ro$ar o cliente e quem vai ro$ar o servi$or. @uem for ro$ar o cliente $eve e$itar o '2 na classe para in$icar o en$ere,o $a outra m&quina 9verifique tamb)m se est(o acessan$o a mesma porta:. >escobrindo o ip da m1quina 0o Pin$ows# abra o console e $i%ite ipcon"ig para saber qual ) o seu '2. 0o Finu 9ou no B*3# "ac# *olaris:# v& no console e $i%ite i"con"ig. J. 9opcional: / se voc! quisesse# em vez $e enviar tu$o o que o cliente $i%itou# transferir um arquivo te to $o micro $o cliente para servi$orC *eria $ifcilC 5buse $o polimorfismoO ;a,a o cliente ler $e um arquivo chama$o ar)uivo.tAt 9crieoO: e fa,a com que o servi$or %rave tu$o que recebe num arquivo que chama rece"i#o.tAt. Bova editora Casa do C*di#o com livros de uma -orma di-erente
/$itoras tra$icionais pouco li%am para ebooGs e novas tecnolo%ias. 0(o conhecem pro%rama,(o para revisar os livros tecnicamente a fun$o. 0(o t!m anos $e e peri!ncia em $i$&ticas com cursos. Conhe,a a Casa do C*di#o# uma e$itora $iferente# com cura$oria $a Caelum e obsess(o por livros $e quali$a$e a pre,os justos. Casa $o C+$i%o# ebooG com pre,o $e ebooG.
um cliente novo# crie um PrintStream usan$o o 2utputStream $ele e a$icione na lista. /# quan$o receber uma mensa%em nova# envia para to$os na lista. 8m esbo,o: 5$icionan$o na lista:
while (true) ! Soc0et cliente G servi#or.accept(); this.lista.a##(new PrintStream(cliente. et2utputStream())); & (( #ispara uma Phrea# )ue trata esse cliente e 'I espera o prRAimo
"as nosso cliente tamb)m recebe mensa%ens. /nt(o precisamos fazer com que o Cliente# al)m $e ler mensa%ens $o tecla$o e enviar para o servi$or# simultaneamente tamb)m possa receber mensa%ens $e outros clientes envia$as pelo servi$or. 1u seja# precisamos $e uma se%un$a Hhrea$ na classe +liente que fica receben$o mensa%ens $o QnputStream $o servi$or e imprimin$o no console. 8m esbo,o:
Scanner servi#or G new Scanner(cliente. etQnputStream()); while (servi#or.hasDeAt9ine()) ! System.out.println(servi#or.neAt9ine()); &
Fembre que voc! precisar& $e no mnimo = threa$s para o cliente e = para o servi$or. /nt(o provavelmente voc! vai ter que escrever K classes. "elhorias possveis: ;a,a com o a primeira linha envia$a pelo cliente seja sempre o nicG $ele. / quan$o o servi$or enviar a mensa%em# fa,a ele enviar o nicG $e ca$a cliente antes $a mensa%em. / quan$o um cliente $esconectarC Como retir&-lo $a listaC L $ifcil fazer o envio $e arquivos pelo nosso sistema $e chatsC *aben$o que a leitura $e um arquivo ) feita pelo 8ileQnputStream# seria $ifcil man$ar esse QnputStream pelo 2utputStream $a cone (o $e re$eC
pu"lic static voi# main(Strin $% ar s) throws en0nown^ostCAceptionF Q2CAception ! (( #ispara cliente new +liente("/7Z.-.-./"F /7:6;).eAecuta(); & private Strin host; private int porta; pu"lic +liente (Strin this.host G host; this.porta G porta; & hostF int porta) !
pu"lic voi# eAecuta() throws en0nown^ostCAceptionF Q2CAception ! Soc0et cliente G new Soc0et(this.hostF this.porta); System.out.println("2 cliente se conectou ao servi#or!"); (( threa# para rece"er mensa ens #o servi#or [ece"e#or r G new [ece"e#or(cliente. etQnputStream()); new Phrea#(r).start(); (( lX ms s #o tecla#o e man#a pro servi#or Scanner tecla#o G new Scanner(System.in); PrintStream sai#a G new PrintStream(cliente. et2utputStream()); while (tecla#o.hasDeAt9ine()) ! sai#a.println(tecla#o.neAt9ine()); & sai#a.close(); tecla#o.close(); cliente.close();
& &
pu"lic class [ece"e#or implements [unna"le ! private QnputStream servi#or; pu"lic [ece"e#or(QnputStream servi#or) ! this.servi#or G servi#or; & pu"lic voi# run() ! (( rece"e ms s #o servi#or e imprime na tela Scanner s G new Scanner(this.servi#or); while (s.hasDeAt9ine()) ! System.out.println(s.neAt9ine()); & &
&
.& o *ervi$or sofreu bastante mo$ifica,-es. 5 classe Prata+liente ) a respons&vel por cui$ar $e ca$a cliente conecta$o no sistema:
pu"lic class Servi#or ! pu"lic static voi# main(Strin $% ar s) throws Q2CAception ! (( inicia o servi#or new Servi#or(/7:6;).eAecuta(); &
private int porta; private 9ist3PrintStream4 clientes; pu"lic Servi#or (int porta) ! this.porta G porta; this.clientes G new Jrray9ist3PrintStream4(); & pu"lic voi# eAecuta () throws Q2CAception ! ServerSoc0et servi#or G new ServerSoc0et(this.porta); System.out.println("Porta /7:6; a"erta!"); while (true) ! (( aceita um cliente Soc0et cliente G servi#or.accept(); System.out.println("Dova coneAo com o cliente " L cliente. etQnetJ##ress(). et^ostJ##ress() ); (( a#iciona sai#a #o cliente g lista PrintStream ps G new PrintStream(cliente. et2utputStream()); this.clientes.a##(ps); (( cria trata#or #e cliente numa nova threa# Prata+liente tc G new Prata+liente(cliente. etQnputStream()F this); new Phrea#(tc).start(); & & pu"lic voi# #istri"uiMensa em(Strin ms ) ! (( envia ms para to#o mun#o for (PrintStream cliente , this.clientes) ! cliente.println(ms ); & & & pu"lic class Prata+liente implements [unna"le ! private QnputStream cliente; private Servi#or servi#or; pu"lic Prata+liente(QnputStream clienteF Servi#or servi#or) ! this.cliente G cliente; this.servi#or G servi#or; & pu"lic voi# run() ! (( )uan#o che ar uma ms F #istri"ui pra to#os Scanner s G new Scanner(this.cliente); while (s.hasDeAt9ine()) ! servi#or.#istri"uiMensa em(s.neAt9ine()); & s.close(); & &
Captulo =B
0o linu fe$ora# voc! faria com su *c "yum install 'ava*/.Z.-*open'#0". *e voc! j& tiver outras vers-es instala$as no seu 8buntu# po$e utilizar su#o up#ate* alternatives **confi 'ava para escolher entre elas. 8ma instala,(o mais bra,al# sem usar reposit+rio # po$e ser feita bai an$o o instala$or no pr+prio site $a 1racle. L um tar. M que possui um ."in que $eve ser e ecuta$o. 3epois# ) necess&rio apontar JJ5J.^2MC para esse $iret+rio e a$icionar JJ5J.^2MC("in no seu PJP^.
2D.2 - Bo 0ac O R
1 "ac 1* M j& traz o .ava instala$o junto com o sistema operacional at) a vers(o 1B.Q. 5s vers-es mais novas# $o Fion em $iante# o instala$or $o "ac vai per%untar se voc! $eseja bai &-lo quan$o for ro$ar sua primeira aplica,(o .ava# como o /clipse. 5 vers(o para o .ava N ain$a n(o est& oficialmente $isponvel. 4oc! po$e bai &-la em: http://j$GN.java.net/macportpreview/ 4ai ser preciso trocar a vers(o pa$r(o $o .ava ap+s a instala,(o# in$o no painel $e 2references# e $epois .ava 2references. +oc, no est1 nessa p1#ina a toa
4oc! che%ou aqui porque a Caelum ) refer!ncia nacional em cursos $e .ava# EubD# 5%ile# "obile#
Peb e .0/H. ;a,a curso com quem escreveu essa apostila. Consulte as vanta%ens $o curso Java e Orientao a Objetos.
8nstalao
1. 3! um clique $uplo no arquivo '#0*3verso4*win#ows*i;<N*p.eAe e espere at) ele entrar no wizar$ $e instala,(o. =. 5ceite os pr+ imos $ois passos clican$o em *e#t. 5p+s um tempo# o instala$or pe$ir& para escolher em que $iret+rio instalar o *3T. 2o$e ser on$e ele j& oferece como pa$r(o. 5note qual foi o $iret+rio escolhi$o# vamos utilizar esse caminho mais a$iante. 5 c+pia $e arquivos iniciar&: R. 1 instala$or instalar& tamb)m o .ava;M =. 5p+s isso# voc! ser& $ireciona$o < uma p&%ina on$e voc! po$e# opcionalmente# criar uma conta na 1racle para re%istrar sua instala,(o.
Con-i#urando o ambiente
2recisamos confi%urar al%umas vari&veis $e ambiente ap+s a instala,(o# para que o compila$or seja acessvel via linha $e coman$o. Caso voc! v& utilizar $iretamente o /clipse# provavelmente n(o ser& necess&rio realizar esses passos. 1. Clique com o bot(o $ireito em cima $o cone Computador e selecione a op,(o $ropriedades. =. /scolha a aba "Confi%ura,-es 5van,a$as $e *istema" e $epois clique no bot(o "4ari&veis $e 5mbiente" R. 0esta tela# voc! ver&# na parte $e cima# as vari&veis $e ambiente $o usu&rio corrente e# embai o# as vari&veis $e ambiente $o computa$or 9servem para to$os os usu&rios:. Clique no bot(o *ovo444 $a parte $e bai o. K. /m *ome da <ari vel $i%ite JJ5J.^2MC e# em valor $a vari&vel# $i%ite o caminho que voc! utilizou na instala,(o $o .ava. 2rovavelmente ser& al%o como: +,=Pro ram
8iles=Java='#0/.Z.-.-:: e em O!.
Cliqu
J. 0(o vamos criar outra vari&vel# mas sim alterar. 2ara isso# procure a vari&vel 25H># ou 2ath 9$& no mesmo:# e clique no bot(o $e bai o "/$itar".
Q. 0(o altere o nome $a vari&velO 3ei e como est& e a$icione no final $o valor ; OJJ5J.^2MCO="in# n(o esque,a $o ponto-e-vr%ula - assim# voc! est& a$icionan$o mais
um caminho < sua vari&vel 2ath. N. 5bra o prompt# in$o em Iniciar# 2#ecutar e $i%ite cm#. Y. 0o console# $i%ite 'avac *version. 1 coman$o $eve mostrar a vers(o $o .ava
Compiler e al%umas op,-es. 4oc! po$e se%uir para a instala,(o $o /clipse# conforme visto no seu captulo# ou utilizar um e$itor $e te to simples como o bloco $e notas para os primeiros captulos $e apostila. @ualquer $6vi$a# n(o hesite $e post&-la no 7rupo $e 8su&rios .ava# em www.%uj.com.br. Captulo =1
Ap,ndice - >ebu##in#
"1lho por olho# e o mun$o acabar& ce%o."
"as como fa,o issoC "uito simples# basta clicar na linha que $eseja a$icionar o breaGpoint# $epois clicar no menu ;un -Q &oo#le PreaMpoint.
/sse ) o tipo mais cl&ssico $e breaGpoint# veremos al%uns outros ao lon%o $o captulo. 5%ora que j& a$icionamos o breaGpoint que ) o ponto $e parti$a# vamos $ebu%ar nosso c+$i%o. 2recisamos ro$ar nosso c+$i%o# ou seja# chamar o m)to$o saca para que o breaGpoint seja encontra$o. Heremos um c+$i%o similar ao se%uinte:
pu"lic class Pesta+onta ! pu"lic static voi# main(Strin $% ar s) ! +onta conta G new +onta(); conta.saca(7--); & &
1 processo normal para e ecutarmos esse c+$i%o seria clicar no menu ,un )B ,un 8s )B Java 8pplication. 2or)m para ro$ar o nosso c+$i%o em modo debu# e ativar nosso breaGpoint# $evemos ro$ar o co$i%o no menu ,un )B 1ebug 8s )B Java 8pplication. @uan$o um breaGpoint for encontra$o no c+$i%o que est& sen$o e ecuta$o# o eclipse e ibir& uma perspectiva especfica $e $ebu%# apontan$o para a linha que tem o breaGpoint.
Conhe,a a Casa do C*di#o# uma nova e$itora# com autores $e $estaque no merca$o# foco em ebooMs 923;# epub# mobi:# pre,os imbat"veis e assuntos atuais. Com a cura$oria $a Caelum e e celentes autores# ) uma abor$a%em di-erente para livros $e tecnolo%ia no Brasil. Conhe,a os ttulos e a nova proposta# voc! vai %ostar. Casa $o C+$i%o# livros para o pro%rama$or.
2o$emos e ibir mais informa,-es sobre as vari&veis# basta a$icionarmos as colunas que $esejamos na tabela e ibi$a.
L possvel tamb)m a$icionarmos constantes e vari&veis est&ticas $a classe que est& sen$o $ebu%a$a.
0a aba Srea0points s(o e ibi$os to$os os breaGpoints que seu worGspace possui. "as por que isso ) importanteC L importante porque po$emos ver to$os os pontos $e $ebu% presentes e melhor# po$emos $esabilit&-los um a um ou to$os $e uma s+ vez. 4oc! po$e at) mesmo pe$ir para e portar os breaGpoints. 2ara $esabilitar ou habilitar to$os breaGpoints basta clicarmos no cone Mip All PreaMpoints. *e quisermos $esabilitar um a um# basta $esmarcar o checGbo e o breaGpoint ser& $esativa$o. Xs vezes# encontrar o c+$i%o on$e o breaGpoint foi coloca$o po$e ser complica$o# na aba Srea0points isso fica bem f&cil $e fazer# basta $ar um $uplo clique no breaGpoint e o eclipse automaticamente nos mostra a classe "$ona" $ele. @uan$o estamos $ebu%an$o c+$i%o# muitas vezes ) interessante saber o valor $e al%uma e press(o ou m)to$o. 2or e emplo# uma con$i,(o $entro $e um if# this.sal#o 4 valor. /sse valor n(o est& em uma vari&vel# ele est& em uma e press(o# o que po$e tornar saber o valor $ela complica$o. 5 feature $e CApressions $escomplica esse processo para n+s. 0a perspectiva $e 3ebu% temos a aba CApressions. Basta clicar com o $ireito $entro $a aba# e clicar em Add =!pression:
/ o resulta$o $a e press(o ) e ibi$o. Hemos outra aba importante chama$a $e Ee"u . 3entre as fun,-es $ela est(o:
&$reads - / ibe as threa$s que est(o sen$o e ecuta$as# e melhor# mostra qual threa$ efetuou a chama$a para o m)to$o on$e est& o $ebu%. 5l)m $isso mostra a pilha $e e ecu,(o# o que nos permite voltar a chama$a $e um m)to$o Parra de nave#ao - @ue permite alterarmos os caminhos que o $ebu% se%uir&.
5 lista a se%uir mostrar al%umas teclas e bot-es que alteram o caminho natural $os nosss $ebu%: /9 - 4ai para o pr+ imo passo $o seu pro%rama. *e o pr+ imo passo for um m)to$o# ele entrar& no c+$i%o associa$o? /< - Hamb)m vai para o pr+ imo passo# por)m se o pr+ imo passo for um m)to$o# ele n(o entrar& no c+$i%o associa$o? /@ - 4oltar& e mostrar& o m)to$o que fez a chama$a para o c+$i%o que est& sen$o $ebu%a$o. 0o nosso caso voltar& para o m)to$o main $a classe Pesta+onta? /A - 4ai para o pr+ imo breaGpoint# se nenhum for encontra$o# o pro%rama se%uir& seu flu o $e e ecu,(o normal. 4oc! tamb)m po$e usar os bot-es que est(o presentes na aba Ee"u .
Como na ima%em acima o breaGpoint s+ ser& ativa$o quan$o a linha $e c+$i%o em que ele se encontra for e ecuta$a a=a vezes. 2o$emos tamb)m colocar al%uma e press(o con$icional# um if# por e emplo.
1 breaGpoint# neste caso# somente ser& ativa$o quan$o o ar%umento valor que foi passa$o ao m)to$o saca for maior que 1BB. 1 importante aqui ) notarmos que $evemos retornar sempre um valor booleano# se n(o o fizermos# teremos um erro em tempo $e e ecu,(o. /ssa proprie$a$e ) v&li$a quan$o queremos colocar aqueles famosos System.out.println("entrou no if tal") para efeito $e lo%# po$emos fazer isso colocan$o o lo% $entro $a e press(o con$icional nas proprie$a$es $o breaGpoint. 1 $isplaD ) uma $as partes mais interessantes $o $ebu% $o eclipse# ele prov! uma maneira $e e ecutarmos qualquer c+$i%o que quisermos quan$o estamos em $ebu%%in%. Criar uma classe# instanciar objetos $essa classe# utilizar ifas# foras# whileas# to$os os recursos $o .ava# al)m $e po$er utilizar as vari&veis# m)to$os# constantes $a classe que estamos $ebu%an$o. 8m e emplo cl&ssico ) quan$o estamos em $ebu%%in% e queremos saber o retorno $e al%um m)to$o $o qual n(o temos acesso# o que faramos antes seria colocar um amontoa$o $e System.out.println# poluin$o e tremamente nosso c+$i%o. 0o $isplaD o que fazemos ) efetuar a chama$a $esse c+$i%o e automaticamente os resulta$os s(o e ibi$os.
2ara vermos um efeito real $isso# vamos alterar um pouco o comportamento $a classe Conta# $e mo$o que a%ora o sal$o para saque tenha que ser o sal$o real mais o valor $o limite. 0osso c+$i%o fica assim:
pu"lic class +onta ! private #ou"le sal#o[eal; private #ou"le limite; pu"lic +onta(#ou"le limite) ! this.limite G limite; & pu"lic "oolean saca(#ou"le valor) ! if (!isSal#oSuficiente(valor)) ! return false; & else ! this.sal#o[eal G this.sal#o[eal * valor; return true; & & private "oolean isSal#oSuficiente(#ou"le valor) ! return (this.sal#o[eal L this.limite) 4 valor; & &
Eepare que o if que verifica se o sal$o ) suficiente para efetuarmos o saque chama um m)to$o isSal#oSuficiente# o que po$e ser um problema quan$o estamos $ebu%an$o# afinal a con$i,(o $o if ) um m)to$o. *e utilizarmos o $isplaD po$emos fazer a chama$a $o m)to$o isSal#oSuficiente# ver seu resulta$o e o melhor# n(o afetamos o $ebu%# apenas queremos ver o resulta$o $o m)to$o# por e emplo. 2ara e ibirmos a aba >ispla2 ) bem simples. Hecle Ctrl J %# $i%ite >ispla2 e a aba ser& e ibi$a. @uan$o ro$armos nosso c+$i%o em mo$o $ebu%# po$emos ir no $isplaD# $i%itarmos uma chama$a para o m)to$o isSal#oSuficiente# e ecutamos esse c+$i%o que foi $i%ita$o selecionan$o-o $entro $o $isplaD e teclan$o Ctrl J $i-t J > e o resulta$o ser& impresso# assim como na ima%em abai o:
"uitas vezes queremos "se%uir" al%uma vari&vel $e inst[ncia# ou seja# qualquer chama$a para essa vari&vel 9leitura ou escrita: queremos ser notifica$os $isso. 2o$emos usar o watchpoint# que far& nosso pro%rama entrar em mo$o $ebu%# quan$o qualquer altera,(o na vari&vel que estamos se%uin$o ocorrer# o pro%rama entrar& em $ebu% e atamente na linha que fez a altera,(o. 2ara colocarmos um watchpoint# basta $ar um $uplo clique no atributo $e inst[ncia que $eseja coloc&-lo.
L possvel alterar esse comportamento pa$r(o# e $efinir se voc! quer que o watchpoint seja ativa$o para leitura ou somente para escrita.
5 i$)ia $esse tipo $e breaGpoint ) fazer nosso pro%rama entrar em $ebu% quan$o al%uma e ce,(o especfica ocorrer. @uan$o $efinirmos essa e ce,(o no =!ception PreaMpoint e a mesma ocorrer# automaticamente nosso pro%rama entra em $ebu% na linha que %erou aquela e ce,(o. 2or e emplo#
vamos alterar o co$i%o $a classe Pesta+onta para que a mesma tenha uma DullPointerCAception:
pu"lic class Pesta+onta ! pu"lic static voi# main(Strin $% ar s) ! +onta conta G null; conta.saca(/-); & &
@uan$o ro$armos o c+$i%o acima# teremos uma DullPointerCAception. 2o$e ser 6til nesses casos $ebu%ar e saber on$e a e ce,(o est& ocorren$o $e fato# em qual linha mais especificamente. 2ara fazermos isso po$emos criar um / ception BreaGpoint# que $ebu%ar& c+$i%os que eventualmente lancem uma DullPointerCAception# por e emplo. Basta abrirmos a aba PreaMpoints e clicarmos no cone abai o:
*er& aberta uma janela on$e po$emos buscar por uma e ce,(o especfica.
2o$emos $efinir um breaGpoint que ) ativa$o ou antes ou $epois que o m)to$o ) chama$o. 2ara $efinirmos ele# basta estar em qualquer parte $o m)to$o que $esejamos $ebu%ar# clicar no menu ;un -Q &oo#le 0et$od PreaMpoint. 2o$emos e$itar as proprie$a$es $esse breaGpoint $izen$o se queremos que ele seja ativa$o antes9$efault: ou $epois $a e ecu,(o $o m)to$o. Basta acessar as proprie$a$es $o metho$ breaGpoint e alter&-las.
L util quan$o $esejamos que um breaGpoint seja ativa$o quan$o uma classe especfica for carre%a$a pela primeira vez# chamamos esse breaGpoint $e Class PreaMpoint. Basta clicarmos no menu ;un -Q Add Class Noad PreaMpoint# uma janela ser& aberta e basta $i%itarmos o nome $a classe e a$icionarmos:
21.9 - Ero-ilin#
8m $os principais h&bitos que n+s $esenvolve$ores $evemos evitar ) a quest(o $a otimiza,(o prematura# ou seja# quan$o $esenvolvemos uma aplica,(o para um cliente# $evemos nos preocupar em atender o requisitos -uncionais de maneira mais r1pida e mais simples poss"vel. 1 passo se%uinte ) refatorar seu c+$i%o para que ele seja melhora$o e para que no futuro possa se a$aptar as possveis mu$an,as. 5 re%ra ): "3ei e os problemas $o futuro# para serem resolvi$os no futuro". 8ma $as ferramentas que nos au iliam na quest(o $e n(o otimizar nosso c+$i%o prematuramente# s(o as ferramentas $e profilin%# que tornam aparentes# por e emplo# os problemas $e mem+ria e cpu# que po$em fazer com que otimizemos nosso c+$i%o. 5tualmente $evi$o as t)cnicas que utilizamos para entre%ar al%o $e valor para o cliente# focamos principalmente na quali$a$e# aspectos funcionais# testes# etc. 2or)m# muitos problemas que n(o fazem parte $os requisitos funcionais po$em acontecer apenas quan$o a aplica,(o est& em pro$u,(o# neste ponto as ferramentas $e profilin% tamb)m nos aju$am.
*e voc! %osta $e estu$ar essa apostila aberta $a Caelum# certamente vai %ostar $os novos cursos online que lan,amos na plataforma Alura. 4oc! estu$a a qualquer momento com a qualidade Caelum. Conhe,a a 5lura.
Basta a$icionar as ferramentas $o H2H2 em nosso eclipse# para isto# selecione o reposit+rio que acabamos $e a$icionar e a vers(o $o H2H2 que queremos instalar# neste caso# a vers(o K.Q.=.
8nstalando pelo Wip 4oc! tem a op,(o $e instalar o H2H2 bai an$o o zip $o projeto e colocan$o manualmente no $iret+rio $e instala,(o $o seu eclipse. "ais informa,-es no linG: http://www.eclipse.or%/tptp/home/$ownloa$s/K.Q.B/$ocuments/install%ui$e/'nstall7ui$eKQ.html 8m problema que po$e acontecer em aplica,-es e que muitas pessoas n(o conhecem a fun$o# ) a quest(o $o pool $e *trin%s que po$e eventualmente ficar muito %ran$e. /ste problema po$e ser causa$o porque objetos $o tipo *trin% s(o imut&veis# sen$o assim# se fizermos concatena,-es $e *trin%s muitas vezes# ca$a uma $essas concatena,-es pro$uzir& uma nova *trin%# que automaticamente ser& coloca$a no pool $a .4". 5 alternativa neste caso# seria trabalhar com objetos $o tipo *trin%Buil$er ou *trin%Buffer que funcionam como *trin%s# mas que n(o pro$uzem *trin%s novas em caso $e uma concatena,(o. "as como me$ir o tamanho $o nosso pool $e *trin%C 1 H2H2 possui uma aba $e estatsticas que nos mostra o tempo que um m)to$o levou para ser
e ecuta$o# quanto processamento esse m)to$o %astou# quanto $e mem+ria foi %asto com ca$a m)to$o. 4amos analisar al%umas $essas estatsticas crian$o um c+$i%o que concatene v&rias *trin%s# $e maneira que sobrecarre%ue o pool# %ere bastante processamento e consumo $e mem+ria.
pu"lic class Peste ! pu"lic static voi# main(Strin $% ar s) ! for (int i G -; i 3 /------; iLL) ! Strin A G "a" L i; System.out.println(A); & & &
2ara analisarmos o resulta$o $o c+$i%o# vamos ro$ar o c+$i%o $o main atrav)s $o menu ,un )B $ro"ile 8s )B Java 8pplication.