Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

53
Pensando em Java, 3ª ed. Revisão 4.0 [ Viewing Hints ] [ Book Home Page ] [ Free Newsletter ] [ Seminars ] [ Seminars on CD ROM ] [ Consulting ]  1: Introdução a Objetos [en-usa] [Traduzir] [+ Trad.]  “Dividimos a natureza em partes, org anizando-a em conceitos, e atribuimos significados como o fazemos, principalmente por sermos as partes de um acordo que se sustenta na nossa comunidade verbal e está codificado em nossos padrões lingüísticos ... não podemos conversar senão obedecendo à organização e classificação de dados que o acordo determina.” Benjamin Lee Whorf (1897-1941) [en-usa] [Traduzir] [+ Trad.] A gênese da revolução dos computadores foi numa máquina. A gênese de nossas linguagens de programação portanto tende a parecer com essa máquina. [en-usa] [Traduzir] [+ Trad.] Mas os computadores não são mais máquinas do que ferramentas de amplificação da mente (“bicicletas para a mente,” como Steve Jobs gosta de dizer) e um ti po diferente de meio de expressão. Conseqüentemente, as ferramentas estão começando a parecer menos com máquinas e mais com partes de nossas mentes, e também com outras formas de e xpressão como a escrita, a pintura, a escultura, a animação e o cinema. A programação orientada a objetos (POO) é parte desse movimento em direção ao uso do computador como um meio de expressão. Comentários (em inglês) [en-usa] [Traduzir] Este capítulo introduzirá os conceitos básicos da POO, incluindo uma visão geral de métodos de desenvolvimento. Este capítulo, Pensando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br /pej/tij2pej/PEJ303.htm 1 of 53 12/02/2013 16:41

Transcript of Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

Page 1: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 1/53

Pensando em Java, 3ª ed. Revisão 4.0

[ Viewing Hints ] [ Book Home Page ] [ Free Newsletter ][ Seminars ] [ Seminars on CD ROM ] [ Consulting ]

 

1: Introduçãoa Objetos

[en-usa][Traduzir]

[+ Trad.]

 “Dividimos a natureza em partes, organizando-a em conceitos,

e atribuimos significados como o fazemos, principalmente porsermos as partes de um acordo que se sustenta na nossacomunidade verbal e está codificado em nossos padrõeslingüísticos ... não podemos conversar senão obedecendo àorganização e classificação de dados que o acordo determina.” Benjamin Lee Whorf (1897-1941)

[en-usa][Traduzir][+ Trad.]

A gênese da revolução dos computadores foi numa máquina. Agênese de nossas linguagens de programação portanto tende aparecer com essa máquina.

[en-usa][Traduzir][+ Trad.]

Mas os computadores não são mais máquinas do queferramentas de amplificação da mente (“bicicletas para amente,” como Steve Jobs gosta de dizer) e um tipo diferente demeio de expressão. Conseqüentemente, as ferramentas estãocomeçando a parecer menos com máquinas e mais com partesde nossas mentes, e também com outras formas de expressãocomo a escrita, a pintura, a escultura, a animação e o cinema.A programação orientada a objetos (POO) é parte desse

movimento em direção ao uso do computador como um meiode expressão. Comentários (em inglês)

[en-usa][Traduzir]

Este capítulo introduzirá os conceitos básicos da POO, incluindouma visão geral de métodos de desenvolvimento. Este capítulo,

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

53 12/02/2013 16:41

Page 2: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 2/53

[+ Trad.] e este livro, assumem que o leitor já tenha tido experiênciacom uma linguagem de programação procedural, embora nãonecessariamente C. Se você acha que precisa de uma melhorpreparação na programação e sintaxe de C antes de explorareste livro, você deve trabalhar com o CD ROM Foundations for 

 Java anexo no final do livro. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Este capítulo apresenta uma base para os estudos, além dematerial suplementar. Muitas pessoa não se sentem confortáveide se aventurar na programação orientada a objetos sem teruma visão mais completa do assunto. Dessa forma, há muitosconceitos introduzidos aqui para dar ao leitor uma visão sólidado que é POO. Entretanto, outras pessoas podem não conseguirentender os conceitos mais gerais antes de ver como amecânica, mais específica funciona; estas pessoas podem ficar

bloqueadas e perdidas sem algum código para mexer. Se vocêfizer parte deste último grupo, e estiver ávido para conhecer alinguagem, fique à vontade para pular este capítulo—pularneste ponto não o impedirá de escrever programas nem deaprender a linguagem. No entanto, em algum ponto, vocêdesejará voltar aqui para completar o seu conhecimento, deforma que possa entender porque os objetos são importantes ecomo desenvolver com eles. Comentários (em inglês)

O progresso da abstração

[en-usa][Traduzir][+ Trad.]

Todas a linguagens de programação provêem abstrações.Pode-se argumentar que a complexidade dos problemaspassíveis de solução está diretamente ligada ao tipo e àqualidade da abstração. Por “tipo” quero dizer, “O que é quevocê está abstraindo?”. A linguagem assembly é uma pequenaabstração da máquina que a suporta. Muitas das chamadas

linguagens “imperativas” que a seguiram (tais como FORTRAN,BASIC, e C) eram abstrações da linguagem assembly. Estaslinguagens são melhorias consideráveis em relação à linguagemassembly, mas sua abstração primária ainda requer que sepense em termos da estrutura do computador em vez daestrutura do problema que se tenta resolver. O programadorprecisa estabelecer a associação entre o modelo da máquina(no “espaço de soluções,” que é onde se modela o problema,no caso um computador) e o modelo do problema que está

efetivamente sendo resolvido (no “espaço de problemas,” que éonde o problema existe). O esforço requerido para realizar estemapeamento, e o fato de ele ser extrínseco à linguagem deprogramação, produz programas difíceis de escrever e caros

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

53 12/02/2013 16:41

Page 3: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 3/53

para manter, e como efeito colateral criou toda a indústria dos “métodos de programação”. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

A alternativa à modelagem da máquina é modelar o problema.Linguagens antigas, como LISP e APL, escolheram visõesparticulares do mundo (“Todos os problemas são, no final dascontas, listas” ou“Todos os problemas são algoritmicos,” respectivamente). PROLOG transforma todos os problemas emcadeias de decisões. Algumas linguagens foram criadas paraprogramação baseada em restrições, outras para programaçãoexclusivamente através da manipulação de símbolos gráficos.(A segunda provadamente restritiva demais.) Cada uma dessasestratégias apresenta uma boa solução para a classe deproblemas para a qual são projetadas, mas quando se pisa foradesse domínio, elas ficam complicadas e ineficazes.Comentários(em inglês)

[en-usa][Traduzir][+ Trad.]

A estratégia da orientação a objetos vai um passo adiante,provendo ferramentas para o programador representarelementos no espaço de problemas. Esta representação é geralo suficiente de forma que o programador não fique restrito anenhum tipo particular de problema. Referimo-nos aoselementos no espaço de problemas e às suas representaçõesno espaço de soluções como “objetos.” (Você também precisaráde outros objetos que não têm análogos no espaço de

problemas.) A idéia é que o programa pode se adaptar àlinguagem do problema adicionando-se novos tipos de objetos,de forma que, quando se lê o código descrevendo a solução,lê-se palavras que também expressam o problema. Essa é umaabstração de linguagem mais flexível e poderosa do que o que

tivemos antes.[2]Assim, a POO permite que se descreva oproblema em termos do problema, em vez de fazê-lo emtermos do computador onde a solução rodará. Mas ainda háuma conexão com o computador: cada objeto parece um poucocom um pequeno computador—ele tem um estado, e temoperações que se pode pedi-lo para realizar. No entanto, istonão parece uma analogia assim tão ruim a objetos no mundoreal—eles têm características e comportamentos. Comentários (eminglês)

[en-usa][Traduzir][+ Trad.]

Alan Kay resumiu as cinco características básicas do Smalltalk,a primeira líguagem orientada a objeto de sucesso e uma daslínguagens no qual o Java foi baseado. Estas características

representam a pura aproximação a programação orientada aobjeto : Comentários (em inglês)

Tudo é um objeto. Pense num objeto como uma variável1.

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

53 12/02/2013 16:41

Page 4: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 4/53

imaginária; este armazena dados, mas você pode fazer requisiçõespara o objeto, requisitando a ela para efetuar operações em simesmo. Em teoria, você pode se apropriar de qualquer componenteconceitual do problema que você esta tentando resolver (cachorros,predios, serviços, etc.) e representar este como um objeto em seuprograma. Feedback 

Um programa é um conjunto de objetos que secomunicam entre eles através da emissão de mensagens.Para fazer a requisição a um objeto, você envia uma mensagem paraaquele objeto. Mais concretamente, você pode pensar numamensagem como a requisição de uma chamada a um método quepertence a um objeto em particular.Feedback 

2.

Cada objeto é composto por outros objetos. De outro pontode vista, você cria um novo tipo de objeto fazendo um pacotecontendo objetos já existentes. Assim, você pode construir umacomplexidade num programa enquanto esconde esta através da

simplicidade dos objetos. Feedback 

3.

Cada objeto tem um tipo. Usando o jargão, cada objeto é umainstância de uma classe, em que “classe” é o sinônimo de “tipo”. A mais distinta característica de uma classe é “Que tipo de mensagens

 você pode enviar para ela?” Feedback 

4.

Todos os objetos de um tipo em particular podem receberas mesmas mensagens. Este é atualmente a indicador carregado,como você irá ver mais tarde. Por isto um objeto do tipo “círculo” étambém um objeto do tipo “figura”, um círculo garante a aceitar asmensagens da figura. Isto significa que você pode escrever código

que fala para a figura e automaticamente interpretar qualquer coisaque se comporte na descrição da figura. Esta substituição é um dosconceitos mais poderosos da POO. Feedback 

5.

[en-usa][Traduzir][+ Trad.]

Booch oferece uma descrição mais sucinta de um objeto:

[en-usa][Traduzir][+ Trad.]

Um objeto tem estado, comportamento e identidade.

[en-usa][Traduzir][+ Trad.]

Isto significa que um objeto tem dados internos (que lhe dáestado), métodos (para criar comportamento), e cada objetopode ser unicamente distingüido de outro objeto—para que istotenha um senso concreto, cada objeto tem um único endereço

de memória.[3] Comentários (em inglês)

Um objeto tem uma interface

[en-usa][Traduzir][+ Trad.]

Aristóteles foi provavelmente o primeiro a iniciar um estudocuidadoso do conceito de tipo; Ele falou "a classe de peixes e aclasse de pássaros.” A ideia que todos os objetos, enquanto

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

53 12/02/2013 16:41

Page 5: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 5/53

únicos, são também parte de uma classe de objetos que temcaracterísticas e comportamentos em comum foi usadadiretamente na primeira línguagem orientada a objeto,Simula-67, onde introduziu uma nova palavra chave class queintroduz um novo tipo num programa. Comentários (em inglês)

[en-usa]

[Traduzir][+ Trad.]

Simula, como o seu nome indica, foi criado para odesenvolvimento de simulações como o clássico “problema docaixa de banco.” Neste, você tem um grupo de caixas, clientes,contas, transações e unidades de dinheiro—um monte de “objetos.” Objetos que são identicos exceto pelo seu estadodurante uma execução de programa são agrupados juntos em “classes de objetos” é dai de onde a palavra chave class veio.Criando tipos abstratos de dados (classes) é o conceitofundamental na programação orientada a objeto. Tipo de dados

abstratos trabalham exatamento como na construção de tiposinternos: Você pode criar variáveis do tipo (chamado objetosou instâncias no jargão da orientação a objetos) e manipularestas variáveis (chamado enviando mensagens ou requisições;você envia uma mensagem e um objeto que a processa). Osmembros (elementos) de cada classe compartinha as mesmascoisas em comum: cada conta tem um balanço, cada caixapode aceitar um depósito, etc. Ao mesmo tempo, cada membrotem seu próprio estado: cada conta tem um diferênte balanço,

cada caixa tem um nome. Assim, os caixas, clientes, contas,transações, etc., podem cada um ser representado com umaúnica entidade num programa de computador. Esta entidade éum objeto, e cada objeto pertence a uma classe particular quedefine suas características e comportamentos. Comentários (eminglês)

[en-usa][Traduzir][+ Trad.]

Portanto, muito embora o que realmente fazemos naprogramação orientada a objetos seja criar novos tipos dedados, virtualmente todas as linguagens orientadas a objetos

usam a palavra-chave “class”. Quando vir a palavra “type” pense em “class” e vice-versa.[4] Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Como uma classe descreve um conjunto de objetos que têmcaracterísticas (elementos de dados) e comportamentos(funcionalidade) idênticos, uma classe é na verdade um tipo dedado porque um número em ponto flutuante, por exemplo,também tem características e comportamento. A diferença éque um programador define uma classe para se adequar a um

problema em vez de ser forçado a usar um tipo de dadoexistente que foi desenvolvido para representar uma unidadede armazenamento numa máquina. Você extende a linguagemde programação adicionando novos tipos de dados específicos

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

53 12/02/2013 16:41

Page 6: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 6/53

às suas necessidades. O sistema de programação recebe asnovas classes e realiza todo o tratamento e verificação de tiposnela que realiza com os tipos internos. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

A abordagem orientada a objetos não se limita à construção desimulações. Quer você concorde ou não que todo programa éuma simulação do sistema que você está desenvolvendo, o usode técnicas de POO podem facilmente reduzir um grandeconjunto de problemas a uma solução simples. Comentários (eminglês)

[en-usa][Traduzir][+ Trad.]

Uma vez estabelecida a classe, você pode fazer quantosobjetos dessa classe quantos quiser, e então manipular essesobjetos como se fossem elementos existentes no problema quevocê está tentando resolver. Na verdade, um dos desafios daprogramação orientada a objetos é criar um mapeamento

um-para-um entre os elementos no espaço do problema eobjetos no espaço de solução. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Mas como fazer um objeto fazer algo de útil para você? Devehaver alguma maneira de fazer umpedido ao objeto de formaque ele faça algo, tal como completar uma transação, desenharalgo na tela, ou ligar um interruptor. E cada objeto só podesatisfazer certos pedidos. Os pedidos que você pode fazer a umobjeto são definidos por sua interface, e o tipo é o quedetermina a interface, Um exemplo simples pode ser a

representação de uma lâmpada:Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Li ght l t = new Li ght ( ) ;l t . on( ) ;

[en-usa]

[Traduzir][+ Trad.]

A interface estabelece quais pedidos você pode fazer a umobjeto específico. Entretanto, precisa haver código em algumlugar para satisfazer o pedido. Isso, junto com os dadosocultos, compõe a implementação. Do ponto de vista da

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

53 12/02/2013 16:41

Page 7: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 7/53

programação procedural, não é tão complicado. Um tipo temum método associado a cada possível pedido, e quando vocêfaz um dado pedido a um objeto, o método é chamado. Esteprocesso é normalmente sumarizado dizendo que você “enviauma mensagem” (faz um pedido) a um objeto, e o objeto sabeo que fazer com a mensagem (ele executa o código). Comentários

(em inglês)[en-usa][Traduzir][+ Trad.]

Aqui, o nome do tipo/classe é Light o nome deste objeto Lightespecífico é lt, e os pedidos que você pode fazer a um objetoLight são ligar (on), desligar (off), aumentar a intensidade(brighten), ou diminui-la (dim). Você cria um objeto Lightdefinindo uma "referência" (lt) para o objeto e chamando newpara pedir um novo objeto daquele tipo. Para enviar umamensagem ao objeto, você dá o nome do objeto e o conecta àmensagem através de um ponto. Do ponto de vista do usuáriode uma classe pré-definida, basta isso pra programar comobjetos. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

O diagrama acima segue o formato da Linguagem deModelagem Unificada . Cada classe é representada por umacaixa, com o nome do tipo na parte superior da caixa, osmembros de dados (se você decidir descrevê-los) na parte domeio, e os métodos (as funções que pertencem a este objeto,que recebem as mensagens que você enviar ao objeto) na

parte de baixo. É comum mostrar apenas o nome da classe eos métodos públicos nos diagramas de UML, de forma que aperte do meio não é mostrada. Se você só estiver interessadono nome da classe, então a parte de baixo também não precisaser mostrada. Comentários (em inglês)

Um objeto presta serviços

[en-usa][Traduzir][+ Trad.]

Enquanto você está tentando desenvolver ou entender aestrutura de um programa, uma das melhores maneiras depensar sobre objetos é como “prestadores de serviço.” Opróprio programa que você está fazendo prestará serviços aousuário, e ele fará isso usando os serviços oferecidos por outrosobjetos. Seu objetivo é produzir (ou melhor ainda, localizar embibliotecas de código já existentes) um conjunto de objetos queprestem os serviços ideais para resolver o seu problema.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Uma maneira de começar é perguntar “se eu pudesse tirá-losmagicamente de uma cartola, que objetos resolveriam o meuproblema imediatamente?” Por exemplo, suponha que você

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

53 12/02/2013 16:41

Page 8: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 8/53

esteja criando um programa de gerenciamento de livros. Vocêpode imaginar alguns objetos que contenha telas de entradapré-definidas para o gerenciamento de livros, outro conjunto deobjetos que realizem os cálculos do gerenciamento de livros, eum objeto que lide com a impressão de cheques e recibos emvários tipos de impressoras. Talvez alguns desses objetos já

existam, e para os que ainda não existam, como seriam? Queserviços esse objetos prestariam, e que objetos elesprecisariam para completar suas obrigações? Se continuarfazendo isso, você terminará chegando a um ponto ondepoderá dizer “este objeto parece simples o suficiente para eusentar e escrevê-lo” ou “Tenho certeza que este objeto já deveexistir.” Esta é uma maneira razoável de decompor umproblema num conjunto de objetos.Comentários (em inglês)

[en-usa]

[Traduzir][+ Trad.]

Pensar num objeto como um prestador de serviços tem umbenefício adicional: ajuda a melhorar a coesão do objeto. Altacoesão é uma qualidade fundamental do projeto de software:isso significa que os vários aspectos de um componente desoftware (tal como um objeto, embora também possa se referira um método ou a uma biblioteca de objetos) “se combinam”.Um dos problemas que as pessoas têm quando projetam umobjeto é colocar excessivas funcionalidades em um objeto. Porexemplo, no seu módulo de impressão de cheques, você pode

decidir que precisa de um objeto que saiba tudo sobreformatação e impressão. Você provavelmente descobrirá queisso é demais para um único objeto, e que o que você precisasão três ou mais objetos. Um objeto pode ser um catálogo detodos os possíveis layouts de cheques, que possa serperguntado sobre informações de como imprimir um cheque.Um objeto, ou um conjunto de objetos, poderia ser umainterface de de impressão genérica que saiba tudo sobre osdiferentes tipos de impressoras (mas nada sobre

gerenciamento de livros—este é um candidato a ser compradoem vez de você escrevê-lo). E um terceiro objeto poderia usaros serviços dos outros dois para realizar a tarefa. Dessa forma,cada objeto tem um conjunto coeso de serviços que oferece.Em um bom projeto orientado a objetos, cada objeto faz umacoisa bem, mas não tenta fazer muito. Como visto aqui, issonão só permite a descoberta de objetos que poderiam sercomprados (o objeto de interface de impressora), comotambém produz a possibilidade de um objeto que poderia serusado em outro lugar (o catálogo de layouts de cheques).Comentários (em inglês)

[en-usa][Traduzir]

Tratar os objetos como prestadores de serviços é uma ótima

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

53 12/02/2013 16:41

Page 9: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 9/53

[+ Trad.] ferramenta de simplificação, e também é utilíssimo, não só noprocesso de projeto como também quando alguém estivertentando entender o seu código ou reusar um objeto—se apessoa puder ver o valor do objeto baseado nos serviços queele presta, fica muito mais fácil encaixá-lo no projeto. Comentários(em inglês)

A implementação oculta

[en-usa][Traduzir][+ Trad.]

É útil dividir o campo de trabalho em criadores declassescriadores de classes (aqueles que criam novos tipos de

dados) e Programadores de aplicações no lado cliente[5](os

consumidores das classes, que usam os tipos de dados em suasaplicações). O objetivo do client programmer é juntar uma

caixa cheia de classes para usar no desenvolvimento rápido deaplicações. O objetivo do class creator é construir uma classeque exponha somente o que for necessário ao clientprogrammer e mantenha todo o resto oculto. Por quê? Porquese estiver oculto, o client programmer não poderá acessar, oque significa que o class creator pode modificar a porção ocultacomo bem desejar sem se preocupar com o impacto sobrequem quer que seja. A porção oculta normalmente representaas partes internas, mais sensíveis, de um objeto, as quaispoderiam facilmente ser corrompidas por um clientprogrammer descuidado ou desinformado, portanto, ocultar aimplementação reduz bugs no programa. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

O conceito da ocultação da implementação não pode sersuperenfatizado. Em qualquer relação é importante ter limitesque sejam respeitados por todas as partes envolvidas. Quandovocê cria uma biblioteca, estabelece uma relação com o clientprogrammer, que é um programador também, mas um que

está montando uma aplicação usando a sua biblioteca paraisso, possivelmente para montar uma biblioteca maior. Setodos os membros de uma classe estiverem disponíveis paratodos, então o client programmer poderá fazer qualquer coisacom a classe, sem que haja maneiras de forçar regras. Mesmoque você preferisse que o client programmer não manipulassediretamente alguns dos membros de sua classe, não há comoevitar sem um controle de acesso. Tudo está aberto para omundo. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Portanto, a primeira razão para usar controle de acesso émanter as mãos dos client programmers longe das partes quenão devem tocar—partes que sejam necessárias à operação

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

53 12/02/2013 16:41

Page 10: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 10/53

interna do tipo de dado, mas não parte das interface que osusuários precisam para resolver os seus problemas específicos.Isto é na verdade um serviço aos usuários, porque eles podemfacilmente ver o que é importante e do que podem ignorar.Comentários (em inglês)

[en-usa]

[Traduzir][+ Trad.]

A segunda razão para usar controle de acesso é permitir ao

desenvolvedor de bibliotecas modificar o funcionamento internoda classe sem se preocupar como isso afetará o clientprogrammer. Por exemplo, você poderia implementar umadada classe de forma simples para facilitar o desenvolvimento,e depois descobrir que terá que reescrevê-la para fazê-la rodarmais rápido. Se a interface e a implementação estiveremclaramente separadas e protejidas, você poderá fazer asmodificações com facilidade.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

O Java usa três palavras-chave explicitas para definir os limitesem uma classe: public, private, and protected. Seus usos esignificados são bem simples e diretos. Estes especificadores deacesso determinam quem poderá usar as definições que asseguem. public significa que o elemento seguinte estádisponível para todos. A palavra-chave private por outro lado,significa que ninguém mais pode acessar o elemento excetovocê, o criador do tipo, métodos internos do tipo. private é ummuro entre você e o client programmer. Alguém que tente

acessar um membro private receberá um erro de tempo decompilação. A palavra-chave private receberá um erro detempo de compilação. A palavra-chave protected age como oprivate, com a excessão que uma classe herdeira tem acessoaos membros protected, mas não aos membros private. Aherança será introduzida em breve. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Java também possui um acesso “padrão”, que entra em açãose não for utilizado nenhum dos especificadores mencionadosacima. Este normalmente é chamado de package access(acesso de pacote) porque as classes podem acessar osmembros de outras classes no mesmo pacote, mas fora dopacote aqueles membros parecerão ser private. Comentários (eminglês)

Reutilizando a implementação

[en-usa]

[Traduzir][+ Trad.]

Uma vez criada e testada a classe, ela deve (idealmente)

representar uma unidade de código útil. Acontece que essareusabilidade não é assim tão fácil de se atingir como muitosesperariam; é preciso experiência e visão para produzir um

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 11: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 11/53

projeto de objeto reusável. Uma vez que você tenha esteprojeto, ele pedirá para ser reusado. O reuso de código é umadas maiores vantagens que as linguagens de programaçãoorientadas a objetos têm. Comentários (em inglês)

[en-usa][Traduzir]

[+ Trad.]

A forma mais simples de reutilizar uma classe é usar um objetoda classe diretamente, mas você pode também incluir umobjeto de uma classe em uma nova classe. Nós denominamosesta ação de "criar um objeto membro." Sua nova classe podeser formada por quaisquer quantidades e tipos de objetos,combinados livremente da maneira que você necessite paraconferir à sua nova classe a funcionalidade desejada. Comovocê está compondo uma nova classe a partir de classesexistentes, este conceito é denominado composição(costumamos chamar de agregação as composições que

ocorrem dinamicamente). A composição é comumentereferenciada como uma relação "tem-um", como em "um carrotem um motor." Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

(Este diagrama UML indica a composição com um losangopreenchido, o que indica que existe um carro. Eu usareitipicamente uma forma mais simples: apenas uma linha, sem o

losango, para indicar uma associação.[6]) Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

A composição trás grande flexibilidade. Os objetos membros dasua nova classe são tipicamente privados, deixando-osinacessíveis aos client programmers que estiverem usando aclasse. Isto permite que você modifique esses membros semafetar código já existente dos usuários. Você também podemodificar os objetos membros em tempo de execução, paramodificar dinamicamente o comportamento do seu programa. Aherança, que será descrita a seguir, não tem esta flexibilidade, já que o compilador precisa colocar restrições de tempo decompilação em classes criadas com herança. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Devido à herança ser tão importante na programação orientadaa objetos, ela é com freqüência muito enfatizada, e oprogramador novato pode ter a idéia de que a herança deve ser

usada em todo lugar. Isto pode resultar em projetos ineficazese muito complicados. Em vez da herança, você deve olharprimeiro para a composição quando estiver criando classes, jáque é mais simples e mais flexível. Se você tomar essa

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 12: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 12/53

estratégia, seus projetos ficarão mais claros. Quando você tivertido mais experiência, será razoavelmente óbvio quando estiverprecisando de herança. Comentários (em inglês)

Herança:

reusando a interface[en-usa][Traduzir][+ Trad.]

Sozinha, a idéia de um objeto é uma ferramenta conveniente.Ela permite a você empacotar dados e funcionalidade juntosconceitualmente, assim você pode representar uma idéia doespaço do problema apropriadamente em lugar de ser forçadoa usar os idiomas do mecanismo de sustentação. Estesconceitos são expressados com unidades funcionais nalinguagem de programação através da utilização da palavrachave class.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Seria uma pena, entretanto, ter todo o trabalho de criar umaclasse e então ser forçado a criar uma outra, nova, comfuncionalidade similar. Seria melhor se pudéssemos pegar aclasse existente, cloná-la, e então fazer adições oumodificações ao clone. Isto é efetivamente o que você obtémcom a herança, com a exceção de que se a classe original(diz-se a classe base ou superclasse ou classe  pai ) for

modificada, o “clone” alterado (diz-se a classe derivada ouclasse herdeira ou subclasse ou classe filha) também refleteessas mudanças. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

(A seta neste diagrama UML aponta de uma classe derivadapara uma classe base. Como você irá ver, existe maisfrequentemente do que uma classe derivada.) Comentários (eminglês)

[en-usa]

[Traduzir][+ Trad.]

Um tipo de dado realiza mais do que simplesmente descreveras restrições em um conjunto de objetos; ele também possuium relacionamento com outros tipos de dados. Dois tipos dedados podem ter características e comportamentos em comum,

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 13: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 13/53

mas um tipo pode ter mais características do que outro e podetambém manipular mais mensagens (ou manipulá-las de mododiferente). A herança expressa esta semelhança entre tipos dedados pelo uso dos conceitos de tipos base e tipos derivados.Um tipo base contém todas as características ecomportamentos que são compartilhados pelos tipos derivados

a partir dele. Você cria um tipo base para representar suasidéias centrais sobre algum objeto de seu sistema. Do tipobase, você deriva outros tipos para expressar as diferentesmaneiras pelas quais aquelas idéias centrais seconcretizam.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Por exemplo, uma máquina de reciclagem de lixo classificapedaços de lixo. O tipo base é "lixo", e cada pedaço de lixo temseu peso, valor, e assim por diante, e cada pedaço de lixo pode

ser triturado, fundido, ou decomposto. Deste tipo básico, tiposmais específicos de lixo são derivados, os quais podem tercaracterísticas adicionais (uma garrafa tem uma cor) oucomportamentos (alumínio pode ser compactado, aço émagnetizável). Além disso, alguns comportamentos podem serdiferentes (o valor do papel depende de seu tipo e condição).Usando herança, você pode construir uma hierarquia de tiposque expresse o problema que você esta tentando resolver emtermos dos tipos existentes no problema.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Um segundo exemplo é o clássico exemplo da "forma",possivelmente usado em um sistema de desenho com auxíliodo computador (CAD) ou simulação de jogos. O tipo base é"forma", e cada forma tem uma medida, uma cor, uma posiçãoe assim por diante. Cada forma pode ser desenhada, apagada,movida, colorida, etc. Deste tipo básico, tipos específicos deformas são derivados (herdados) - círculo, quadrado, triângulo,e assim por diante - cada um dos quais pode ter característicase comportamentos adicionais. Certas formas podem serinvertidas, por exemplo. Alguns comportamentos podem serdiferentes, como quando você tenta calcular a área de umaforma. A hierarquia de tipos incorpora e expressa a ambas,similaridades e diferenças entre as formas. Comentários (em inglês)

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 14: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 14/53

[en-usa]

[Traduzir][+ Trad.]

Modelar a solução nos mesmos termos do problema étremendamente benéfico porque você não precisa de umaporção de modelos intermediários para ir da descrição doproblema à descrição da solução. Com os objetos, a hierarquiade tipos é o modelo primário, de modo que você vaidiretamente da descrição do sistema no mundo real para adescrição do sistema em código. De fato, uma das dificuladadesque as pessoas têm com o design orientado a objetos é quecom ele é muito simples ir do ponto de partida ao ponto final.

Uma mente treinada para procurar por soluções complexaspode inicialmente ficar embaraçada com estasimplicidade.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Quando você herda de um tipo existente, você cria um novotipo. Este novo tipo contém não somente todos os membros dotipo existente (embora aqueles declarados como privateestejam ocultos e inacessíveis), mas, o que é mais importante,ele duplica a interface da classe base. Quer dizer, todas asmensagens que você pode enviar para objetos da classe base

você também pode enviar para objetos da classe derivada.Visto que conhecemos o tipo de uma classe através dasmensagens que podemos enviar para ela, isto significa que aclasse derivada é do mesmo tipo da classe base. Estaequivalência entre tipos via herança é um dos portais de acessofundamentais para a compreensão do significado daprogramação orientada a objetos.Comentários (em inglês)

[en-usa][Traduzir]

[+ Trad.]

Visto que a classe base e a classe derivada têm a mesma

interface fundamental, deve haver alguma implementação queacompanhe esta interface. Ou seja, tem que existir algumcódigo para ser executado quando um objeto recebe umadeterminada mensagem. Se você simplesmente herda uma

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 15: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 15/53

classe e não faz nada além disso, os métodos da interface daclasse base vêm junto, direto para dentro da classe derivada. Oque significa que objetos da classe derivada não têm somente omesmo tipo, eles também têm o mesmo comportamento, o quenão é particularmente interessante.Comentários (em inglês)

[en-usa]

[Traduzir][+ Trad.]

Você tem duas maneiras de diferenciar sua nova classederivada da classe base original. A primeira é absolutamenteclara: Você simplesmente adiciona métodos novos à classederivada. Estes novos métodos não fazem parte da interface daclasse base. Isto significa que a classe base simplesmente nãofaz tudo o que você gostaria que ela fizesse, logo vocêadicionou mais métodos. Este uso simples e primitivo para aherança é, às vezes, a solução perfeita para o seu problema.Entretanto, você deveria considerar atentamente a

possibilidade que que a sua classe base talvez necessite destesmétodos adicionais. Este processo de descoberta e repeticão deseu projeto acontece regularmente na programação orientada aobjetos.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Embora a herança possa às vezes significar (especialmente emJava, em que a palavra reservada para herança é extends)que você vá adicionar novos métodos à interface, isto não énecessariamente verdade. A segunda e mais importantemaneira de diferenciar sua nova classe é mudar ocomportamento de um método já existente de uma classebase. Isto é conhecido como uma sobrecarga daquelemétodo.Comentários (em inglês)

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 16: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 16/53

[en-usa][Traduzir][+ Trad.]

Para sobreescrever um método, você simplesmente cria umanova definição para o método numa classe derivada. Você estadizendo, “Eu estou usando a mesma método da interface aqui,mas eu quero que isto faça algo diferente para o meu novotipo.” Comentários (em inglês)

Relacionamentos é um vs. é como um

[en-usa][Traduzir][+ Trad.]

Existe uma certa polêmica que pode acontecer quando se tratade herança: A herança deveria sobrecarregar apenas métodosda classe base (e não adicionar novos métodos que nãoestejam na classe base)? Isto significaria que o tipo derivado éexatamente o mesmo tipo da classe base já que ele temexatamente a mesma interface. Como resultado, você podesubstituir um objeto da classe derivada exatamente por umobjeto da classe base. Isto pode ser encarado como pura

substituição, e é frequentemente referido como o princípio dasubstituição. Em um certo sentido, esta é a maneira ideal detratar a herança. Nós frequentemente nos referimos à relaçãoentre a classe base e a classe derivada, neste caso, como umarelação é-um, porque você pode dizer "um círculo é umaforma." Um teste para a herança é determinar se faz sentidovocê expressar como é-um ou é-uma a relação entre asclasses. Comentários (em inglês)

[en-usa]

[Traduzir][+ Trad.]

Há vezes em que você deve adicionar novos elementos deinterface à uma classe derivada, deste modo estendendo ainterface e criando um novo tipo. O novo tipo pode ainda sersubstituído pelo tipo base, mas a substituição não é perfeita

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 17: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 17/53

porque seus novos métodos não são acessíveis a partir daclasse base. Isto pode ser descrito como uma relaçãoé-como-um (minha terminologia). O novo tipo tem a interfacedo antigo tipo mas ele também contém outros métodos, assim,você não pode realmente dizer que ele é exatamente a mesmacoisa. Por exemplo, considere um refrigerador de ar. Suponha

que sua casa tem instalados todos os controles pararefrigeração; quer dizer, ela tem uma interface que permiteque você controle a refrigeração. Imagine que o refrigerador dear quebre e que você o substitua por um condicionador de ar,que pode tanto refrigerar quanto aquecer. O condicionador dear é-como-um refrigerador de ar, mas ele pode fazer mais. Jáque o sistema de controle da sua casa é projetado somentepara controlar a refrigeração, ele está restrito a se comunicarapenas com a parte refrigeradora do novo objeto. A interface

do novo objeto foi estendida, e o sistema existente nãoreconhece nada além da interface original. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Naturalmente, uma vez que você olhe para este projeto, setorna claro que a classe base "cooling system" (sistema de

refrigeração) não é suficientemente genérica, e deveria serrenomeada como "temperature control system" (sistema decontrole de temperatura) de maneira que pudesse incluirtambém o aquecimento - ponto no qual o princípio dasubstituição vai funcionar. Entretanto, este diagrama é umexemplo do que pode acontecer com projetos no mundo real.Comentários (em inglês)

[en-usa][Traduzir]

[+ Trad.]

Quando você vê o princípio da substituição, é natural ter apercepção como se esta técnica (substituição pura) fosse aúnica maneira de fazer as coisas e, de fato, é legal se seuprojeto funcionar desta maneira. Mas você vai descobrir que hávezes em que é igualmente claro que você deve adicionar

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 18: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 18/53

novos métodos à interface de uma classe derivada. Com ainspeção ambos os casos deveriam ficar razoavelmente óbvios.Comentários (em inglês)

Objetos intercambiáveis

através do polimorfismo[en-usa][Traduzir][+ Trad.]

Quando estiver lidando com hieraquia de tipos, vocêfrequentemente precisará tratar um objeto não como do tipoespecífico dele, mas, em vez disso, como de seu tipo base. Istopermite a você escrever código que não depende de tiposespecíficos. No exemplo da forma, métodos manipulam formasgenéricas sem levar em conta que sejam círculos, quadrados,triângulos, ou alguma outra forma que sequer tenha sido

definida ainda. Todas as formas podem ser desenhadas,apagadas e movidas, assim, esses métodos simplesmenteenviam uma mensagem para um objeto forma, sem sepreocupar sobre como o objeto lida com a mensagem.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Tal código não é afetado pela adição de novos tipos, e adicionarnovos tipos é o modo mais comum de estender um programaorientado a objetos para que ele manipule novas situações. Porexemplo, você pode derivar um novo subtipo de formachamado pentágono sem modificar os métodos que lidamsomente com formas genéricas. Esta habilidade de facilmenteestender um projeto derivando novos subtipos é uma dasmaneiras essenciais de encapsular alterações. Isto melhoraconsideravelmente os projetos ao mesmo tempo que reduz ocusto de manutenção de software. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Há um problema, entretanto, com a tentativa de tratar objetosde tipos derivados como seus tipos básicos genéricos (círculos

como formas, bicicletas como veículos, cormorões comopássaros, etc.). Se um método vai pedir para uma formagenérica desenhar-se a si mesma, ou para que um veículogenérico tome direções, ou a um pássaro genérico para semover, o compilador não tem como saber em tempo decompilação exatamente qual pedaço de código será executado.Esta é toda a questão - quando a mensagem é enviada, oprogramador não precisa saber qual pedaço de código seráexecutado; o método desenhar pode ser aplicado igualmente aum círculo, um quadrado ou um triângulo, e o objeto executaráo código apropriado dependendo de seu tipo específico. Se vocênão tem que saber qual pedaço de código será executado,

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 19: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 19/53

então quando você adiciona um novo subtipo, o código que eleexecuta pode ser diferente sem que isso requeira mudanças nachamada do método. Assim, o compilador não precisa saberexatamente qual pedaço de código é executado, então, o queele faz? Por exemplo, no diagrama seguinte o objetoBirdController simplesmente funciona com objetos Bird

genéricos e não sabe de que tipo eles são exatamente. Isto éconveniente do ponto de vista de BirdController porque elenão tem que escrever código específico para determinar o tipoexato de Bird com que ele está trabalhando ou qual ocomportamento daquele Bird. Assim, como isso se dá, quandomove( ) é chamado enquanto ignora o tipo específico de Bird,o comportamento correto irá ocorrer (um Ganso corre, voa ounada, e um Pinguim corre ou nada)? Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

A resposta é a trança primária na programação orientada aobjetos: o compilador não pode fazer uma chamada de funçãoda forma tradicional. A chamada de função gerada por umcompilador não-POO causa o que chamamos de early binding(ligação atual), um termo que talvez você ainda não conheçapor nunca ter pensado nisto de qualquer outra forma. Significa

que o compilador gera uma chamada a um nome de funçãoespecífico e o linker traduz esta chamada ao endereço absolutodo código a ser executado. Em POO, o programa não podedeterminar o endereço do código antes do tempo de execução,então algum outro esquema é necessário quando umamensagem é enviada para um objeto genérico.Comentários (eminglês)

[en-usa][Traduzir]

[+ Trad.]

Para resolver o problema, linguagens orientadas a objetoutilizam o conceito de late binding (ligação tardia). Quandovocê envia uma mensagem para um objeto, o códigoinicialmente chamado não é determinado antes do tempo deexecução. O compilador se assegura que o método existe e

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 20: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 20/53

executa checagem de tipo nos argumentos e valor de retorno(uma linguagem na qual isto não é verdade é chamada defracamente tipada), mas não sabe qual seria o codigo exato aser executado. Comentários (em inglês)

[en-usa][Traduzir]

[+ Trad.]

Para realizar ligação tardia, Java usa um pedaço especial decódigo em lugar da chamada absoluta. Este código calcula oendereço do corpo do método, usando informaçõesarmazenadas no objeto (este processo é coberto com grandedetalhamento no Capítulo 7). Deste modo, cada objeto pode secomportar de maneira diferente, de acordo com o conteúdodaquele pedaço especial de código. Quando você envia umamensagem para um objeto, o objeto realmente não tem idéiado que fazer com aquela mensagem. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Em algumas linguagens você tem que declarar explicitamente

que você quer que um método tenha a flexibilidade dapropriedade da ligação tardia (C++ usa a palavra reservadavirtual para fazer isto). Nestas linguagens, por padrão, osmétodos não são dinamicamente ligados. Em Java, ligaçãodinâmica é o comportamento padrão e você não precisalembrar de adicionar qualquer palavra reservada extra paraobter polimorfismo. Comentários (em inglês)

[en-usa][Traduzir]

[+ Trad.]

Considere o exemplo da forma. A família de classes (todasbaseadas na mesma interface uniforme) foi desenhadaanteriormente neste capítulo. Para demonstrar o polimorfismo,precisamos escrever um único pedaço de código que ignora osdetalhes específicos de tipo e que somente se comunica com aclasse base. Este código é despido de informações específicasdo tipo e assim é mais simples de escrever e mais fácil deentender. E, se um novo tipo - um Hexágono, por exemplo -for adicionado através de herança, o código que você escreversimplesmente funcionará tão bem para o novo tipo de Forma

quanto funcionou nos tipos que já existiam. Deste modo, oprograma é extensível . Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Se você escrever um método em Java (o que você logoaprenderá a fazer):Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

voi d doSt uf f ( Shape s) {s. erase( ) ;

  / / . . .s. dr aw( ) ;

}

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 21: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 21/53

[en-usa][Traduzir][+ Trad.]

Este método fala com qualquer Shape, assim é independentedo tipo específico de objeto que ele desenha ou apaga. Seoutras partes do programa utilizarem o método doStuff( ):Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Ci rcl e c = new Ci rc l e( ) ; Tr i angl e t = new Tri angl e( ) ;

Li ne l = new Li ne() ;doSt uf f ( c);doSt uf f ( t ) ;doSt uf f ( l ) ;

[en-usa][Traduzir][+ Trad.]

as chamadas para doStuff( ) automaticamente funcionamcorretamente, sem levar em consideração o tipo exato do

objeto. Comentários (em inglês)[en-usa][Traduzir][+ Trad.]

Isto é um truque particular inacreditável. Considere a linha:

[en-usa][Traduzir][+ Trad.]

doSt uf f ( c);

[en-usa][Traduzir][+ Trad.]

Oque acontece aqui é que um Circle está sendo passado paraum método que está aguardando um Shape. Como um Circleé um Shape ele pode ser tratado como um por doStuff( ).Isto é, qualquer mensagem que doStuff( ) puder remeter paraum Shape, um Circle pode aceitar. Assim é completamenteseguro e a coisa lógica a fazer. Comentários (em inglês)

[en-usa][Traduzir]

[+ Trad.]

Nós chamamos este processo de tratar um tipo derivado comose ele fosse seu tipo base de upcasting. O nome cast é usadono sentido de atirar em um molde e o up vem da maneira comoo diagrama de herança é normalmente arrumado, com o tipobase no topo e as classes derivadas distribuidas mais abaixo.Então, converter para um tipo base é mover para cima nodiagrama de herança: “upcasting.” Comentários (em inglês)

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 22: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 22/53

[en-usa][Traduzir][+ Trad.]

Um programa orientado a objeto contêm alguns upcasting emalgum lugar, porque estes são como você amaina exigênciascom você mesmo do conhecimento a cerca do tipo exato com oqual está trabalhando. Observe o código em in doStuff( ):Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

s. erase( ) ;  / / . . .

s. dr aw( ) ;

[en-usa][Traduzir]

[+ Trad.]

Observe que não diz “Se você é um Circle, faça isso, se vocêfor um Square, faça aquilo, etc.” Se você escreve este tipo decódigo, o qual verifica por todos os tipos possíveis que umShape pode ser no momento, é confuso e você precisaalterá-lo toda vez que você adiciona um novo tipo de Shape.Aqui, você só diz “Você é um shape, Eu sei que você podeerase( ) e draw( ) a você mesmo, faça isso, e tome cuidadodos detalhes corretamente.” Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Oque é impressionante sobre o código em doStuff( ) é que, decerto modo, a coisa certa acontece. Chamando draw( ) para

Circle causa código diferente a ser executado que quandochamando draw( ) para um Square ou um Line, mas quandoa mensagem draw( ) é remetida para um Shape anônimo, ocomportamento correto ocorre baseado no tipo atual deShape. Isto é incrível porque, como mencionado mais cedo,quando o compilador Java está compilando o código paradoStuff( ), ele não pode saber exatamente com que tipos estánegociando. Assim ordinariamente, você aguardaria o fim parachamar a versão de erase( ) e draw( ) para a classe baseShape, e não para um específico Circle, Square, ou Line. Eainda a coisa certa acontece por causa do polimorfismo. Ocompilador e o sistema de execução manuseiam os detalhes;

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 23: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 23/53

tudo que você precisa por agora é saber que ele faz acontecer,e mais importante, como projetar com ele. Quando você enviauma mensagem para um objeto, o objeto fará a coisa certa,mesmo quando um upcasting estiver envolvido. Comentários (eminglês)

Classes base abstratas e interfaces

[en-usa][Traduzir][+ Trad.]

Frequentemente em um projeto, você quer a classe baseapresente somente uma interface para suas classes derivadas.Isto é, você não quer que alguém crie agora um objeto daclasse base, somente para moldá-la assim como sua interfacepode ser usada. Isto é complementado por tornar aquela classeabstract pelo uso da palavra chave abstract . Se alguémtentar fazer um objeto de uma classe abstract, o compilador oprevine. Esta é uma ferramenta para reforçar um projetoparticular. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Você pode também usar a palavra chave abstract paradescrever um método que ainda não foi implementado—comouma seta indicando “aqui está um método de interface paratodos os tipos herdados desta classe, mas até este momentoeu não tenho qualquer implementação para ele.” Um métodoabstract pode ser criado somente dentro de uma classe

abstract . Quando a classe é herdada, aquele método deve serimplementado, ou a classe herdante se torna abstracttambém. Criar um método abstract permite a você colocar ummétodo em uma interface sem ser forçado a providenciar umpossível corpo de código sem significado para aquele método.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

A palavra chave interface leva o conceito de uma classeabstract um passo adiante para prevenção de quaisquerdefinições de método como um todo. A interface é uma

ferramenta muito útil e comumente usada, pois ela provê aseparação perfeita da interface e da implementação. Emadição, você pode combinar muitas interfaces juntas, se vocêdesejar, enquanto que herança de múltiplas classes regularesou abstratas não é possível. Comentários (em inglês)

Criação de objetos, uso e tempo devida

[en-usa][Traduzir][+ Trad.]

Tipicamente a Programação Orientada a Objetos abordaassuntos como tipo de dados abstratos, herança e

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 24: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 24/53

polimorfismo, bem como outras características importantes.Esta seção cobrirá essas características.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Um dos fatores mais importantes sobre objetos é a maneiraque eles são criados e distribuídos. Onde está o dado de umobjeto e como é controlado o tempo de vida do objeto? Hádiferentes filosofias no trabalho aqui. C++ tem uma abordagemonde o controle de performance é a mais importantecaracterística, então C++ dá ao programador uma opção deescolha. Para otimizar a velocidade de execução, oarmazenamento e o tempo de vida podem ser determinadoenquanto o programa está sendo escrito, através da alocação(criação) dos objetos na memória (estes são algumas vezeschamados automáticos ou variáveis de escopo) ou em umaárea estática de armazenamento. Isto coloca uma prioridade na

velocidade de alocação e liberação de armazenamento, e ocontrole da alocação e desalocação podem ser muito válido emalgumas situações. Entretanto, a flexibilidade pode serprejudicada porque é necessário saber a quantidade exata,tempo de vida, e tipo dos objetos enquanto você estáescrevendo o programa. Se você estiver tentando resolver umproblema mais geral como o desenvolvimento auxiliado porcomputador, gerenciamento de estoque, ou o controle detráfego aéreo, isto é também específico.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Uma segunda característica é a criação de objetosdinamicamente em um pool de memória chamada de “memóriaheap”. Nesta abordagem, você não sabe até o momento daexecução quantos objetos você precisará, qual o tempo devida, ou quais os tipos exatos destes objetos. Tudo isso édeterminado exatamente no momento da execução. Se vocêprecisar de um novo objeto, você simplesmente o aloca na “memória heap” na hora que o objeto for necessário. Pelomotivo de o armazenamento ser gerenciado dinamicamente, notempo de execução, a quantidade de tempo necessário paraalocar na “memória heap” pode ser notavelmente maior que otempo para criar armazenamento no “memória stack”. (Criaçãode armazenamento na “memória stack”é frequentemente umaúnica montagem de instrução para mover o ponteiro da “memória stack” para baixo e outra para volta-lo ao início. Otempo de criação do armazenamento na “memória heap” depende do mecanismo de armazenamento projetado). A

abordagem dinâmica geralmente supõe que os objetos tendema ser complicados, então o esforço extra de encontrar oarmazenamento e liberá-lo não terá um impacto importante nacriação do objeto. Em adição, uma maior flexibilidade é

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 25: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 25/53

essencial para resolver os problemas gerais deprogramação.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Java usa a segunda abordagem, exclusivamente. [7]Cada vezque você quer criar um objeto, você usa a palavra reservadanew para criar uma instância do objeto.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Há outra característica, que é o tempo de vida de um objeto.Como em linguagens que permitem que o objeto seja criado na “memória stack”, o compilador determina em quanto tempo osúltimos objetos serão automaticamente destruídos. Entretantose você criá-los na “memória heap” o compilador não temconhecimento do tempo de vida destes objetos. Em umalinguagem como C++, você deve determinarprogramaticamente quando destruir o objeto, o que pode levara uma invasão de memória se você não fizer corretamente (e

isto é um problema comum em programas C++). Java forneceuma característica chamada garbage collector queautomaticamente descobre quando um objeto não está maisem uso e o destrói. O “garbage collector” é muito maisconveniente porque ele reduz o número de casos que vocêpode acompanhar e o código que você deve escrever. Maisimportante, o "garbage collector" fornece um nível muito altode segurança que vai de encontro ao problema de invasão dememória (que tem levado muitos projetos em C++ aofracasso).Comentários (em inglês)

Coleções e iterações

[en-usa][Traduzir][+ Trad.]

Se você não sabe quantos objetos você precisará parasolucionar um problema em particular ou qual o tempo de vidadeles, você também não saberá como armazená-los. Comovocê pode saber qual o espaço necessário para criar tais

objetos? Você não pode, levando em conta que esta informaçãonão é conhecida até o momento da execução. Comentários (eminglês)

[en-usa][Traduzir][+ Trad.]

A solução para a maioria dos problemas em desenvolvimentoorientado a objetos parece impertinente: você cria outro tipode objeto. O novo tipo de objeto que resolve este problema emparticular manipula a referência para outros objetos.Naturalmente, você pode fazer a mesma coisa com “array”, queexiste na maioria das linguagens. Mas este novo objeto,

chamado de container (também chamado de collection, mas abiblioteca Java usa este termo de uma forma diferente entãoneste livro usaremos "container"), irá se expandir sempre que

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 26: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 26/53

necessário para acomodar tudo que você acrescentar nele.Então você não precisa saber quantos objetos você vaimanipular em um “container”. É só criar um objeto “container” e deixá-lo cuidar dos detalhes.Comentários (em inglês)

[en-usa][Traduzir]

[+ Trad.]

Felizmente, uma boa linguagem de Programação Orientada aObjetos vem com um conjunto de “containers” como parte dopacote. Em C++, é parte da Biblioteca Padrão C++ e algumasvezes chamado de “Standard Template Library (STL)”. ObjectPascal tem “containers” na “Visual Component Library (VCL)”.Smaltalk tem um conjunto muito completo de “containers”.Java também tem “containers” em sua biblioteca padrão. Emalgumas bibliotecas, um “container” genérico é consideradobom o suficiente para tudo o que for necessário, e em outras(Java, por exemplo) a biblioteca tem diferentes tipos de

 “containers” para diferentes necessidades: vários tiposdiferentes de classes List (para manipular seqüências), Map(também conhecidos como arrays associativos, para associarobjetos com outros objetos), e classes Set (para manipularcada um dos tipos de objetos). As bibliotecas de “container” também devem incluir “queues” (filas), “trees” (árvores), “stacks” (pilhas), etc.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Todos os “containers” disponibilizam maneiras de se colocarcoisas nele e recuperá-las; normalmente através de métodos

que adicionam elementos ao “container”, e outros queremovem elementos do “container”. A recuperação deelementos pode ser mais problemático, porque o método deseleção simples é restritivo. O que fazer se você quisermanipular ou comparar um conjunto de elementos em um “container” ao invés de somente um elemento?Comentários (eminglês)

[en-usa][Traduzir]

[+ Trad.]

A solução é um iterador , que é um objeto que tem como funçãoselecionar os elementos em um container e apresentá-los aousuário do iterador. Como uma classe, ele também provê umnível de abstração. Esta abstração pode ser utilizada paraseparar os detalhes do container dos detalhes do código queestão acessando o container. O container, via iterador, éabstraído para ser simplesmente uma seqüência. O iteradorpermite percorrer uma seqüência sem se preocupar com aestrutura base — isto é, será um ArrayList, um LinkedList,um Stack, ou algo parecido. Isto dá flexibilidade para

facilmente mudar a estrutura base de dados sem interferir nocódigo de seu programa. Java iniciou (nas versões 1.0 e 1.1)com um padrão de iterador, chamado Enumeration, paratodas as classes container. Java 2 incluiu uma biblioteca

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 27: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 27/53

container muito mais completa, que contém um iteradorchamado Iterator, que faz mais que o velho Enumeration.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Do ponto de vista de projeto, tudo que você realmente quer éuma seqüência que pode ser manipulada para resolver seuproblema. Se um tipo simples de seqüência satisfizer tudo o

que você precisar, não haverá razão para ter tipos diferentes.Há 2 razões que podem levar você a escolher entre “containers”. Primeiro, os “containers” fornecem diferentestipos de interface e comportamento externo. Uma “stack” (pilha) tem uma interface diferente de uma “queue” (fila), queé diferente do “set” ou da “list”. Um deles pode fornecer umasolução mais flexível para resolver seu problema que outra.Segundo, “containers” diferentes têm performances diferentespara certas operações. O melhor exemplo compara dois tiposde List: um ArrayList e um LinkedList. Ambos sãoseqüências simples que podem ter interfaces idênticas ecomportamentos externos. Mas certas operações podem tercustos radicalmente diferentes. Aleatoriamente acessandoelemento em um ArrayList é uma operação de tempoconstante; ele gasta o mesmo tempo desconsiderando oelemento que você seleciona. Porém, um LinkedList éexpansivo para percorres a lista a fim de randomicamente

selecionar um elemento, e demora para encontrar um elementoque está mais no final da lista. Em contrapartida, se vocêquiser inserir um elemento no meio da seqüência, isto é maisfácil em um LinkedList que em um ArrayList. Essas e outrasopções têm diferentes performances dependendo da estruturabase da seqüência. Na fase de projeto, você pode iniciar comuma LinkedList e, quando buscando melhorar a performance,alterar para um ArrayList. Por causa da abstração da classebase List e dos “iterators”, você pode mudar de um para o

outro com impacto mínimo no seu código.Comentários (em inglês)

Fundamentos de hierarquia

[en-usa][Traduzir][+ Trad.]

Uma das características da Programação Orientada a Objetoque tem sido especialmente destacada desde a introdução doC++ é que todas as classes devem herdar de uma única classebase. Em Java (bem como todas as outras linguagens deProgramação Orientada a Objeto, exceto para C++) a respostaé sim, e o nome desta classe base é Object. Isto demonstraque os benefícios da hierarquia são muitos.Comentários (em inglês)

[en-usa] Todos os objetos na árvore hierárquica têm uma interface em

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 28: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 28/53

[Traduzir][+ Trad.]

comum, então todos eles são, no final das contas, os mesmostipos base. Uma alternativa (fornecida por C++) é que vocênão sabe que todos possuem o mesmo tipo base. Do ponto devista de compatibilidade interna isto cabe no módulo C melhore pode ser considerado menos restritivo, mas quando énecessário que a programação seja completamente orientado a

objeto você deve construir sua própria hierarquia para fornecera mesma conveniência que usa em outras linguagens deProgramação Orientada a Objeto. E em qualquer biblioteca declasse nova que você adquire, algumas outras interfacesincompatíveis serão usadas. É necessário esforçar(possivelmente como herança múltipla) para funcionar comnova interface no seu projeto. É uma “flexibilidade” extra devalor de C++? Se você precisar - um grande investimento emC - é bastante válido. Se você estiver começando a arriscar,

outras alternativas como Java podem ser maisprodutivas.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Todos os objetos em uma árvore hierárquica (como fornecidopor Java) garantidamente possue certas funcionalidades. Vocêsabe pode executar algumas operações básicas em todo objetono seu sistema. Uma árvore hierárquica, quando cria todos osobjetos na memória, simplifica extremamente a passagem deargumentos (um dos tópicos mais complexos em

C++).Comentários (em inglês)[en-usa][Traduzir][+ Trad.]

Uma árvore hierárquica torna muito mais fácil a implementaçãode um “garbage collector” (que já é convenientementeimplementado em Java). O suporte necessário pode serinstalado na classe base, e o ”garbage collector” pode entãoenviar as mensagens apropriadas para todos os objetos nosistema. Sem a árvore hierárquica em um sistema quemanipula um objeto através da referência, é difícil implementaro “garbage collector” Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

No tempo de execução, a informação do tipo é garantida emtodos os objetos, você nunca finalizará os objetos sem que elestenham seus tipos definidos. Isto é importante especialmentecom operações de nível de sistema, como a manipulação deexceção, a fim de permitir maior flexibilidade noprograma.Comentários (em inglês)

Conversões versus genéricos

[en-usa][Traduzir][+ Trad.]

Para tornar esses “containers” reutilizáveis, eles manipulam otipo universal em Java: Object. A árvore hierárquica significa

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 29: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 29/53

que tudo herda de Object, então o “container” que manipula

Object pode manipular qualquer outra classe.[8]Isto torna os “containers” fáceis de reutilizar.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Para usar um “container”, você simplesmente acrescentareferências para objetos e mais tarde solicita a remoção dos

mesmos. Mas, desde que o “container” manipula somenteObject, quando você adiciona sua referência no “container” eleé promovido para Object, perdendo assim a identidade.Quando você recupera o objeto, você obtém uma referência deObject, e não a referência para o tipo que você colocou. Entãocomo você recupera alguma coisa que tem uma interface útildo objeto que você colocou no container?Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Aqui, o “cast” (conversão) é usado novamente, mas desta vezvocê não está elevando a herança para um tipo mais geral. Ao

contrário, você está convertendo para um tipo mais específico.Esta maneira de conversão é chamada downcasting(conversãop/ mais específico). Com a conversão para mais genérico, vocêsabe, por exemplo que um Circle (círculo) é um tipo de Shape(forma geométrica) então é seguro uma conversão para o maisgenérico, mas você não sabe se um Object é necessariamenteum Circleou um Shape então não é seguro fazer umaconversão para o específico, a menos que você saibaexatamente com o que você está lidando.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Isto não é completamente impraticável, entretanto, se vocêfizer uma conversão para o específico para um tipo errado vocêterá um erro em tempo de execução chamado exception,, queserá descrito brevemente. Quando você recupera referências deobjeto de um container, então, você deve ter alguma maneirade lembrar exatamente o que eles são e como você podeexecutar uma conversão para o tipo específico de formaapropriada. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

A conversão para o tipo específico e a verificação em tempo deexecução necessita de tempo extra para executar o programa eesforço extra do programador. Não teria problema se quandocriar o “container”, ele souber os tipos que ele manipula,eliminando a necessidade de conversão para o tipo específicocomo possível engano? A solução é chamada como mecanismode tipo parametrizado. Um tipo parametrizado é uma classeque o compilador pode automaticamente ser customizado parafuncionar com tipos particulares. Por exemplo, com um “container” parametrizado, o compilador deve customizar o “container” para que ele aceite só Shapee recupere somenteShapes. Comentários (em inglês)

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 30: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 30/53

[en-usa][Traduzir][+ Trad.]

Tipos parametrizados é uma parte importante de C++,principalmente porque C++ não tem hierarquia. Em C++, apalavra chave que implementa tipos parametrizados é “template”. Java atualmente não tem tipos parametrizadosdesde que seja possível ser recuperado usando herançasimples. Entretanto, o propósito atual dos tipos parametrizados

usa uma sintaxe que é extremamente similar a C++, e nóspodemos esperar que tipos parametrizados (que serãochamados genéricos) na própria versão de Java. Comentários (eminglês)

Assegurando uma limpeza apropriada

[en-usa][Traduzir]

[+ Trad.]

Todo objeto requer recursos a fim de existir, sendo o principaldeles memória. Quando o objeto não é mais necessário omesmo deve ser extinto (retirado ou limpado da memória) paraque estes recursos sejam liberados para reuso. Em situaçõesde programação a questão sobre como um objeto é retirado(limpado) não parece muito desafiador: você cria um objeto,usa o objeto enquanto for necessário, então o mesmo deve serdestruído. Entretanto, não é difícil de encontrar situações quesão mais complexas.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Suponha, por exemplo, que você esteja projetando um sistema

para gerenciar o tráfico aéreo para um aeroporto. (O mesmomodelo deve também funcionar para outros exemplos.)Inicialmente isto parece simples: Faça um contêiner paragerenciar os aviões, então crie um novo avião e coloque omesmo no contêiner para cada avião que entrar na zona decontrole de tráfego aéreo. Para limpar, simplesmente delete oobjeto avião apropriado quando a aeronave deixar azona.Comentários (em inglês)

[en-usa]

[Traduzir][+ Trad.]

Mas quem sabe você tem algum outro sistema para gravardados sobre as aeronaves; quem sabe dados que nãorequerem atenção imediata como a função de controleprincipal. Talvez estes registros são de todas as pequenasaeronaves que deixam o aeroporto. Então você tem umcontêiner secundário para aeronaves pequenas, e a qualquermomento em que você criar um objeto aeronave você tambémo colocará no contêiner secundário se este é uma aeronavepequena. Então alguns processos secundários executam

operações nos objetos neste contêiner durante momentosociosos.Comentários (em inglês)

[en-usa][Traduzir]

Agora o problema é mais difícil: Como você pode possivelmentesaber quando destruir os objetos? Quando você tiver parado de

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 31: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 31/53

[+ Trad.] usar o objeto, alguma outra parte do sistema poderia ainda oestar usando. O mesmo problema pode ser levantado em umnúmero de outras situações, e na programação de sistemas(como os em C++) nos quais você deve excluir explicitamenteum objeto quando você tiver terminado e isto pode se tornarbastante complexo. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Com Java, o coletor de lixo é projetado para tomar conta doproblema da liberação de memória (embora isto não incluaoutros aspectos da limpeza de objetos). O coletor de lixo “sabe” quando um objeto não é usado a muito, e então liberaautomaticamente a memória daquele objeto. Isto (combinadocom o fato de que todos os objetos são herdados da classe raizúnica Object e que você pode criar objetos somente de umamaneira—na pilha) torna o processo de programação em Java

muito mais simples que a programação em C++. Você tempoucas e distantes decisões por tomar e obstáculos aultrapassar. Comentários (em inglês)

Coletores de lixo x eficiência e flexibilidade

[en-usa][Traduzir][+ Trad.]

Se todas estas são boas idéias, por que eles não fizeram amesma coisa em C++? Bem, naturalmente, há um preço apagar por toda esta conveniência de programação, e este preço

é o tempo de execução elevado. Como mencionado antes, emC++ você pode criar objetos no stack, e neste caso eles sãoautomaticamente limpos (mas você não tem a flexibilidadecriação tão grande quanto você gostaria em tempo deexecução). Criar objetos no stack é a maneira mais eficientepara alocar memória para objetos e liberar aquela memória.Criar objetos na pilha pode ser muito mais custoso. Sempreherdando da classe base e tornando polimórficos todos osmétodos chamados também cobra um pequeno pedágio. Mas ocoletor de lixo é um problema particular porque você nuncasabe o suficiente quando será iniciado ou quanto irá demorar.Isto significa que há uma inconsistência na taxa de execuçãode um programa Java, assim você não pode usá-lo em certassituações, como quando a taxa de execução de um programaestá uniformemente crítica. (Estes são chamados geralmentede programas em tempo real, embora não todos os problemasda programação em tempo real sejam assim estritos.)Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Os projetistas da linguagem C++, tentando atrairprogramadores C (e com muito sucesso, a isso), não quiseramadicionar qualquer artifício a linguagem que pudesse impactar

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 32: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 32/53

na velocidade ou no uso do C++ em qualquer situação ondeprogramadores devessem escolher outro que C. Este objetivofoi alcançado, mas ao preço da grande complexidade daprogramação em C++. Java é mais simples que C++, mas oprejuízo está na eficiência e algumas vezes na aplicabilidade.Para uma parte significativa de problemas de programação,

contudo, Java é a opção superior. Comentários (em inglês)

Manuseio de exceções: Negociandocom erros

[en-usa][Traduzir][+ Trad.]

Desde o inicio das linguagens de programação, tratamento deerros tem sido um dos assuntos mais difíceis. Pelo fato de sermuito difícil projetar um bom esquema de tratamento de erros,muitas linguagens simplesmente ignoram este assunto,passando o problema para os projetistas de bibliotecas quesurgem com soluções que funcionam na maioria das situaçõesmas que podem ser facilmente dribladas. O maior problemacom a maioria dos esquemas de tratamento de erros é que elescontam com a vigilância dos programadores em seguirconvenções que não são forçadas pela linguagem. Se oprogramador não é vigilante o tempo todo ou caso ele esteja

em uma situação de pressão este esquema pode facilmente seresquecido.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Tratamento de exceção liga tratamento de erros diretamentedentro da linguagem de programação e às vezes ao sistemaoperacional. Uma exceção (exception) é um objeto que élançado (thrown) no lugar do erro e pode ser capturado (catch)por um tratador de exceções apropriado que foi projetado paratratar aquele tipo de erro em particular. O tratador de exceçõese como se fosse, um caminho paralelo de execução que pode

ser tomado quando as coisas vão mal. E pelo fato dele usar umcaminho de execução separado, ele não precisa interferir comseu código de execução normal. Isto faz com que o código sejamais simples de ser escrito uma vez que você não éconstantemente forçado a chegar os erros (código dechecagens entre o código normal). Adicionalmente, umaexceção lançada é diferente de um valor de erro que éretornado de um método ou um flag que é setado por um

método com o propósito de indicar uma situação de erro-istopode ser facilmente ignorado. Uma exceção não pode serignorada, então temos a garantia de que a mesma será tratadaem algum ponto. Finalmente, exceções prove uma forma

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 33: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 33/53

confiável de se recuperar de situações ruim (de erro). Ao invésde apenas sair do programa, você é freqüentemente capaz dereorganizar a situação e restaurar a execução, o que produzprogramas muito mais robustos.Comentários (em inglês)

[en-usa][Traduzir]

[+ Trad.]

O tratamento de exceção de Java destaca-se entre aslinguagens de programação, porque em Java, tratamento deexceção foi inserido no inicio e você é forçado a usar. Se vocênão escrever seu código para adequadamente tratar asexceções, você receberá uma mensagem de erro em tempo decompilação. Esta garantia de consistência pode algumas vezestornar o tratamento de erros mais fácil.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

É importante notar que tratamento de exceção não é umacaracterística da orientação a objetos, ainda que em linguagensorientadas a objetos uma exceção seja normalmente

representada por um objeto. Tratamento de exceção existeantes das linguagens orientadas a objetos.Comentários (em inglês)

Concorrência

[en-usa][Traduzir][+ Trad.]

Um conceito fundamental na programação de computadores éa idéia de manusear mais de uma tarefa ao mesmo tempo.Vários problemas de programação requer que o programa seja

capaz de parar o que ele está fazendo, lidar com algum outroproblema, e então retornar para o processo principal.Aproximou-se da solução de várias formar. Inicialmente,programadores com conhecimento em baixo-nível (low-level)da máquina escreveram rotinas de serviço de interrupção, e asuspensão do processo principal era iniciado através dohardware. Apesar de funcionar bem, isto era difícil e nãoportável, então se tornava demorado e caro a transferência deum programa para um novo tipo de máquina.Comentários (em

inglês)[en-usa][Traduzir][+ Trad.]

As vezes, interrupções são necessárias para lidar com tarefasde tempo-critico (time-critical), mas há uma grande classe deproblemas em que você está apenas tentando particionar oproblema em pedaços de execução separados então oprograma como um todo pode ser mais rápido na resposta ouusuário. Em programas, estes pedaços de execução separadossão chamados threads, e o conceito geral é chamado deconcorrência ou multithreading. Um exemplo simples demultithreading é a interface de usuário. Usando threads, umusuário pode pressionar um botão e receber uma respostarápida ao invés de ser forçado a esperar até que o programa

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 34: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 34/53

finalize sua tarefa atual.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Geralmente, thread é apenas uma maneira de alocar o tempode um único processador. Mas se o sistema operacionalsuportar múltiplos processadores, cada thread pode seratribuída para um processador diferente, e elas podemverdadeiramente executar em paralelo. Uma das característicasconvenientes de multithreading em nível de linguagem deprogramação é que o programador não precisa se preocupar sehá muitos processos ou apenas um. O programa é logicamentedividido em threads e se a máquina tem mais de umprocessador, então o programa executa mais rápido, sem anecessidade de ajustes especiais.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Tudo isso faz com que threading pareça um tanto simples. Háum complicador: recursos compartilhados. Se você tem mais

de uma thread em execução que irá acessar o mesmo recurso,você tem um problema. Por exemplo, dois processos nãopodem simultaneamente enviar informações para umimpressora. Para resolver o problema, recursos que podem sercompartilhados, como uma impressora, devem estar trancados(locked) enquanto eles estão sendo usados. Então uma threadtranca (lock) um recurso, completa sua tarefa, e então libera atranca para que outros possam usar o recurso.Comentários (eminglês)

[en-usa][Traduzir][+ Trad.]

Threading em Java é construído dentro da linguagem, o que fazde um assunto complicado muito mais simples. Threading ésuportado a nível de objetos, então uma thread de execução érepresentada por um objeto. Java também provê recursos paralock de recursos. Podendo fazer lock de memória de qualquerobjeto (este é, um tido de recurso compartilhado) então apenasuma thread pode usar este recurso em um momento. Isto éalcançado com a utilização da palavra chave synchronized.Outros tipos de recursos devem ser travados explicitamentepelo programador, tipicamente criando um objeto pararepresentar o lock que todas threads devem checar antes deacessar aquele recurso específico.Comentários (em inglês)

Persistência

[en-usa][Traduzir]

[+ Trad.]

Quando você cria um objeto, o mesmo existe enquanto vocêprecisa dele, mas em nenhuma circunstância o mesmo existirádepois que o programa terminar. Mesmo que isto não façasentido inicialmente, há situações em que seria útil se umobjeto pudesse existir e manipular suas informações mesmo

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 35: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 35/53

que o programa não esteja mais em execução. Então dapróxima vez que você iniciar o programa, o objeto estaria lá eele teria as mesmas informações que tinha no momento emque o programa executou da última vez. É claro, você pode terum efeito similar escrevendo a informação para um arquivo oupara um banco de dados, mas no espírito de fazer tudo um

objeto, seria um tanto conveniente ser capaz de declarar umobjeto persistente e ter todos os detalhes sobre a recuperaçãodos dados cuidados para você.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Java prove suporte para "persistência leve," o que significa quevocê pode facilmente armazenar objetos em um disco e maistarde recuperar o mesmo. A razão para "leve" é que vocêcontinua sendo forçado a fazer chamadas explícitas paraproceder a persistência e a recuperação dos objetos.

Persistência leve pode ser implementada de ambas as formas,através de serialização de objetos (mostrado no capitulo 12) eatravés de Java Data Objects (JDO, mostrado em pensando em

 Java Enterprise). Comentários (em inglês)

Java e a Internet

[en-usa][Traduzir]

[+ Trad.]

Se Java é, de fato, mais uma linguagem de programação decomputadores, você pode questionar porque ela é tãoimportante e porque tem sido propalada como um passorevolucionário em programação de computadores. A respostanão é imediatamente óbvia se você está vindo de umaperspectiva de programação tradicional. Ainda que Java sejamuito útil para solucionar problemas tradicionais deprogramação "standalone", ela também é importante porquevai solucionar problemas na World Wide Web. Comentários (eminglês)

O que é a Web?

[en-usa][Traduzir][+ Trad.]

A Web pode parecer ligeiramente misteriosa, com toda essaconversa de "surfar", "navegar", e "estar na web". É de grandeajuda dar um passo atrás e olhar para o que ela realmente é,mas para fazer isso você precisa compreender os sistemascliente/servidor, um outro aspecto de computação recheado dequestões confusas.Comentários (em inglês)

Sitemas Cliente/Servidor

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 36: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 36/53

[en-usa][Traduzir][+ Trad.]

A idéia básica de um sistma cliente/servidor é que você tenhaum repositório central de informações - dados de alugum tipo,muitas vezes em um banco de dados - que você precisadistribuir para um grupo de pessoas ou máquinas, sobdemanda. Uma idéia chave para o conceito cliente/servidor éque o repositório de informações está geograficamente

centralizado, de modo que ele possa ser mudado e assim essasmudanças sejam propagadas para os consumidores dasinformações. Juntando tudo, o repositório de informação, oprograma que distribui a informação e a máquina (oumáquinas) onde a informação e o programa residem échamado de servidor. O programa que reside na máquinaremota, comunica-se com o servidor, traz a informação,processa-a, e então a exibe na máquina remota é chamado decliente. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Assim, o conceito básico de computação cliente/servidor não étão complicado. O problema aparece quando você tem umúnico servidor tentando atender a muitos clientes ao mesmotempo. Geralmente, há também um banco de dados, em que oprojetista distribui a informação em tabelas para uso otimizado.E mais, os sistemas geralmente permitem a um cliente inserirnovas informações no servidor. Isto significa que você deveassegurar que os novos dados de um cliente não se

sobreponham aos novos dados de outro cliente, ou que dadosnão sejam perdidos no processo de sua adição à base de dados(isto é chamado processamento da transação). Conforme oprograma cliente muda, ele deve ser construído, depurado einstalado nas máquinas clientes, o que acaba sendo maiscomplicado e dispendioso do que você imagina. Ainda maisdifícil é o suporte a múltiplos tipos de computadores e sistemasoperacionais. E há também a questão importantíssima daperformance: você pode ter centenas de clientes fazendo

solicitações ao servidor simultaneamente em determinadomomento, de modo que mesmo um pequeno atraso é crucial.Para minimizar a latência, os programadores se empenham emredirecionar a carga das tarefas de processamento, geralmentepara a máquina cliente, mas também às vezes para outrasmáquinas no site do servidor, usando o assim chamadomiddleware (o middleware é também utilizado para facilitar amanutenção). Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

A simples idéia de distribuição de informações apresenta tantosníveis de complexidade que o problema como um todo podeparecer desesperadoramente enigmático. E ainda assim écrucial: a computação cliente/servidor corresponde a

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 37: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 37/53

aproximadamente metade das atividades de programação. Éusada em tudo, de transações com cartões de crédito até adistribuição de diversos tipo de dados - mercado de ações,pesquisas científicas, informações governamentais, e por aí vai.O que se tinha no passado eram soluções individuais paraproblemas individuais, com uma nova solução sendo inventada

a cada vez. Estas eram difíceis de criar e difíceis de usar, tendoo usuário que aprender uma nova interface para cada umadelas. A questão cliente/servidor precisa ser resolvida demaneira ampla.Comentários (em inglês)

A Web como um servidor gigante

[en-usa][Traduzir]

[+ Trad.]

A Web é na verdade um sistema cliente/servidor gigante. É um

pouquinho pior que isto, já que você tem todos os servidores eclientes co-existindo ao mesmo tempo em uma única rede.Você não precisa saber disto, porque tudo o que tem a fazer ése preocupar em conectar e interagir com um servidor de cadavez (embora você tenha que circular por toda a terra em suabusca pelo servidor correto).Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Inicialmente o processo era simples e unidirecional. Você faziauma requisição ao servidor e ele lhe entregava um arquivo, oqual o seu software navegador (i.e., o cliente) interpretaria,

formatando-o localmente na sua máquina. Mas em poucotempo as pessoas começaram a querer fazer mais do quesimplesmente entregar páginas com um servidor. Elasquiseram a funcionalidade cliente/servidor completa, tal que ocliente pudesse alimentar o servidor com informações para, porexemplo, realizar consultas a bancos de dados, adicionar novasinformações ao servidor, ou para fazer um pedido (o querequeria mais segurança do que os sistemas originaisofereciam). Estas são as mudanças que temos visto nodesenvolvimento da Web.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

O navegador Web (browser) foi um grande passo adiante: anoção de que uma informação poderia ser visualizada emqualquer tipo de computador sem ser alterada. Entretanto, osnavagadores ainda eram bastante primitivos e rapidamentesobrecarregados com a demanda que lhes era imposta. Elesnão eram essencialmente interativos, e tendiam a ocupar oservidor e a Internet porque sempre que se precisava fazer

algo que requeria programação, era necessário enviarinformações de volta ao servidor para processamento.Poderia-se levar vários segundos ou minutos para descobrirque houve um erro de digitação na requisição. Como o

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 38: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 38/53

navegador era apenas um visualizador, não poderia executarnem as tarefas computacionais mais simples (por outro lado,ele era seguro, pois não poderia executar nenhum programacontendo erros ou vírus prováveis na máquina local).Comentários(em inglês)

[en-usa]

[Traduzir][+ Trad.]

Para resolver esse problema, diferentes estratégias foram

adotadas. Para começar, padrões gráficos foram melhoradospara permitir melhor capacidade de animação e vídeo aosnavegadores. O resto do problema pode ser resolvido apenaspela incorporação da abilidade de executar programas naextremidade cliente, dentro do navegador. Isso é chamado deprogramação client-side.Comentários (em inglês)

Programação Client-side

[en-usa][Traduzir][+ Trad.]

O projeto inicial servidor-navegador da Web oferecia suportepara conteúdo interativo, mas a interatividade eracompletamente provida pelo servidor. O servidor produziapáginas estáticas para o navegador cliente, que simplesmenteas interpretaria e mostraria. A HyperText Markup Language(HTML) básica inclui mecanismos simples para coleta de dados:caixas de texto, caixas de seleção, botões, listas e áreas tetexto, bem como um botão que serve apenas para reinicializar

os dados do formulário e outro que envia os dados ao servidor.Esse envio passa através da Common Gateway Interface (CGI)provida por todos os servidores Web. O texto contido no envioindica à CGI o que deve ser feito. A ação mais comun éexecutar um programa localizado no servidor em um diretóriotipicamente chamado "cgi-bin" (se você prestar atenção nabarra de endereços no topo do navegador quando pressiona umbotão numa página Web, às vezes você pode distinguir ofragmento "cgi-bin" dentre a sopa de letrinhas encontrada ali).

Esses programas podem ser escritos em várias linguagens. Perltêm sido uma escolha comum, porque ela é projetada paramanipulação de texto e é interpretada, de modo que pode serinstalada em qualquer servidor, independente do processadorou sistema operacional utilizado. Entretanto, Python (minhafavorita — veja www.Python.org) têm feito progresso devido aoseu maior poder computacional e simplicidade.Comentários (eminglês)

[en-usa]

[Traduzir][+ Trad.]

Vários sites na Web de hoje foram construídos exclusivamentecom CGI, e de fato pode-se fazer qualquer coisa com CGI.Entretanto, os sites construídos com programas CGI podemrapidamente se tornar complicados de manter, e há também o

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 39: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 39/53

problema do tempo de resposta. A responsividade de umprograma CGI depende da quantidade de dados a enviar, bemcomo da quantidade de usuários conectadas ao servidor e àInternet (além disso, a inicialização de um programa CGI tendea ser lenta). Os primeiros projetistas da Web não previramquão rapidamente essa largura de banda seria exaurida para os

tipos de aplicativos que as pessoas desenvolviam. Por exemplo,qualquer tipo de geração dinâmica de gráficos é praticamenteimpossível de realizar com consistência, pois um arquivo dotipo Graphics Interchange Format (GIF) deve ser criado emovido do servidor para o cliente para cada versão do gráfico.E com certeza você já teve experiência direta com algo tãosimples como a validação de dados em um formulário Web.Você pressiona o botão "submit" em uma página; os dados sãoenviados ao servidor; o servidor dispara um programa CGI que

descobre um erro, constrói uma página HTML informando-o doerro, e a envia de volta a você; você então deve voltar e tentarnovamente. Além de lento, isso é deselegante.Comentários (eminglês)

[en-usa][Traduzir][+ Trad.]

A solução é a programação client-side. A maioria das máquinasque executam navegadores Web são capazes de realizar muitoprocessamento e, com a estratégia original de HTML estático,elas estão apenas ali, esperando ociosas enquanto o servidor

prepara a próxima resposta. Programação client-side significaaproveitar o navegador Web para fazer o trabalho que puderser feito, resultando em uma experiência menos demorada emais interativa para o usuário do seu site Web.Comentários (eminglês)

[en-usa][Traduzir][+ Trad.]

O problema com discussões sobre programação client-side éque elas não são muito diferentes das discussões sobreprogramação em geral. Os parâmetros são quase os mesmos,mas a plataforma é diferente; um navegador Web é como um

sistema operacional limitado. No fim das contas, você aindaprecisa programar, e isso justifica a vasta quantidade deproblemas e soluções produzidas pela programação client-side.O restante desta seção provê uma discussão geral dosproblemas e estratégias na programação client-side.Comentários(em inglês)

Plug-ins

[en-usa][Traduzir][+ Trad.]

Um dos avanços mais significativos na programação client-sidefoi o desenvolvimento do plug-in. Essa é uma forma deadicionar funcionalidade ao navagador através do download de

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 40: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 40/53

um componente que se acopla no local apropriado dentro donavegador. Ele diz ao navegador: "de agora em diante vocêconsegue realizar esta nova atividade" (o download do plug-inprecisa ser feito apenas uma vez). Alguns comportamentospoderosos podem ser adicionados aos navegadores viaplug-ins, mas construir um plug-in não é uma tarefa trivial, e

não é algo você gostaria de fazer como parte do processo dedesenvolver um site. O valor do plug-in na programaçãoclient-side é que ele permite a um programador experientedesenvolver uma nova linguagem e adicioná-la a um navegadorsem a permissão do fabricante do navegador. Portanto, osplug-ins provêem uma "porta dos fundos" que permite acriação de novas linguagens de programação client-side(embora nem todas as linguagens sejam implementadas comoplug-ins).Comentários (em inglês)

Linguagens de script

[en-usa][Traduzir][+ Trad.]

Os plug-ins resultaram numa explosão das linguagens descript. Com uma linguagem de script, voce insere ocódigo-fonte para o seu programa (que roda no cliente)diretamente na página HTML, e o plug-in que interpreta aquelalinguagem é automaticamente ativado quando a página é

exibida. Linguagens de script costumam ser de fácilentendimento e, por serem simples texto inserido na páginaHTML, carregam rapidamente como parte de um único hitrequerido para carregar a página. A desvantagem é que seucódigo fica exposto a todos para ver (e roubar). Geralmente, noentanto, você não está fazendo nada espantosamentesofisticado com linguagens de script, e essa desvantagem nãoconta muito.Comentários (em inglês)

[en-usa]

[Traduzir][+ Trad.]

Isto levanta a questão de que as linguagens de script usadasnos browsers de Internet têm a intenção de resolver problemasespecíficos, principalmente a criação de uma interface gráfica(GUI) mais rica e interativa. Entretanto, uma linguagem descript pode resolver 80% dos problemas encontrados naprogramação no lado do cliente. Seus problemas podem muitobem se encaixar completamente nesses 80%, e já que aslinguagens de script permitem desenvolvimento mais fácil erápido, você provavelmente deveria considerar uma linguagem

de script antes de olhar para uma solução mais envolventecomo Java ou ActiveX.Comentários (em inglês)

[en-usa][Traduzir]

As linguagens de script para navegadores mais comentadas sãoJavaScript (que não tem nada a ver com Java; só foi batizada

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 41: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 41/53

[+ Trad.] assim para tomar proveito do marketing em torno dalinguagem Java), VBScript (que se parece muito com VisualBASIC), e Tcl/Tk, que vem da popular linguagem multi-plataforma de criação de interfaces gráficas (GUI). Existemoutras por aí, e sem dúvida outras mais em desenvolvimento.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

JavaScript é certamente a de maior aceitação pelosnavegadores. Já vem instalada tanto no Netscape Navigatorcomo no Microsoft Internet Explorer (IE). Infelizmente, nuancesde JavaScript nesses dois navegadores podem variarimensamente (o navegador Mozilla, que pode ser baixadogratuitamente em www.Mozilla.org, oferece suporte ao padrãoECMAScript, o que pode um dia se tornar aceitouniversalmente). Além disso, existem provavelmente maislivros disponíveis sobre JavaScript do que sobre todas as outraslinguagens de navegador, e algumas ferramentas já criamautomaticamente páginas usando JavaScript. Entretanto, sevocê já é fluente em Visual BASIC ou em Tcl/Tk, será maisprodutivo usar estas linguagens de script ao invés de aprendermais uma (você já vai estar bastante ocupado lidando com osdemais problemas da Web).Comentários (em inglês)

Java

[en-usa][Traduzir][+ Trad.]

Se uma linguagem de script resolve 80% dos problemas deprogramação lado-cliente, o que fazer com os outros 20% — o"osso duro de roer"? Java é uma solução popular. Não apenas éuma linguagem poderosa, construída para ser segura, multi-plataforma e internacional, como também vem sendocontinuamente extendida para prover funções de linguagem ebibliotecas que lidam elegantemente com problemas que sãode difícil resolução em linguagems tradicionais, como

multithreading, acesso a banco de dados, programação derede, e computação distribuída. Java permite a programaçãolado-cliente através do applet e com o Java Web Start .Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Um applet é um mini-programa que roda apenas em umnavegador da Web. O applet é baixado automaticamente comoparte de uma página Web (da mesma maneira, por exemplo,que uma imagem é automaticamente baixada). Quando oapplet é ativado, ele executa um programa. Esta é uma de suasbelezas — proporciona uma maneira de distribuir o programacliente de forma automática no momento em que o usuário onecessita, e não antes. O usuário recebe a versão mais recente

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 42: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 42/53

do programa, sem falha, e sem uma reinstalação dificultosa.Graças à maneira como Java é projetada, o programador sóprecisa criar um único programa, e esse programa vaiautomaticamente funcionar em todos os computadores que têmnavegadores com um interpretador Java embutido (e isso incluiseguramente a vasta maioria dos computadores). Já que Java é

uma linguagem de programação completa, você pode fazer omáximo de trabalho no lado do cliente antes e depois de fazerrequerimento ao servidor. Por exemplo, você não precisasubmeter um formulário através da Internet para descobrir quevocê entrou uma data incorreta ou algum outro parâmetroerrado, e seu computador cliente pode rapidamente gerar umgráfico baseado em seus dados, ao invés de esperar peloservidor para gerar o gráfico e enviar a imagem de volta paravocê. Não somente você tem o ganho imediato da velocidade e

prontas respostas, mas também o tráfego da rede e a carganos servidores pode ser reduzida, prevenindo umavagarosidade na Internet toda.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Uma vantagem que um applet de Java tem sobre umalinguagem de script é ser compilado, portanto o código fontenão está disponível para o cliente. Por outro lado, um applet deJava pode ser descompilado sem muita dificuldade. Esconderseu código, porém, não é geralmente um ponto importante.

Dois outros fatores podem ser de importância. Como você verámais tarde neste livro, um applet de Java compilado poderequerer mais tempo para baixar, se for grande. Umalinguagem de script vai ser integrada na página Web comoparte de seu texto (e em geral vai ser menor e reduzir onúmero de hits ao servidor). Isso pode ser importante para acapacidade do seu site Web de ser responsivo. Outro fator deimportância é a curva de aprendizado. Não importa o que vocêtenha ouvido falar, Java não é uma linguagem tão fácil de se

aprender. Se você é um programador de VISUAL BASIC, mudarpara VBScript será a solução mais rápida (assumindo que vocêpossa limitar seus usuários às plataformas Windows), e já quevai resolver a maioria dos problemas típicos emcliente/servidor, você deve sentir dificuldade em justificar oaprendizado de Java. Se você já tem experiência com umalinguagem de script, certamente se beneficiará em dar umaolhada em JavaScript ou VBScript antes de se envolver comJava, porque essas linguagens podem servir exatamente para oque você precisa e você vai ser mais produtivo, maisrapidamente. Comentários (em inglês)

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 43: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 43/53

.NET e C#

[en-usa][Traduzir][+ Trad.]

Durante muito tempo, o principal competidor dos applets deJava era o ActiveX da Microsoft, apesar de requerer que ocliente rodasse Windows. Desde então, a Microsoft produziu umcompetidor muito mais completo para a linguagem Java: aplataforma .NETe a linguagem C# . A plataforma .NET é agrosso modo o mesmo que a máquina virtual Java e asbibliotecas Java, e C# apresenta similaridades inconfundíveis àlinguagem Java. Este é certamente o melhor que a Microsoft jáfez na área de linguagens e ambientes de programação. Claro,eles tiveram a vantagem considerável de poder ver o quefuncionava bem e o que não deu tão certo em Java, e

construíram a partir daí, mas fizeram. Esta foi a primeira vezdesde seu surgimento que a linguagem Java teve umacompetição para valer, e se tudo der certo, o resultado seráque os designers de Java na Sun vão dar uma olhada séria emC# e nos motivos que levariam os programadores a mudarpara aquela linguagem, e vão reagir fazendo melhoriasfundamentais na linguagem Java. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Atualmente, a principal vulnerabilidade e questão maisimportante em relação à .NET é se a Microsoft vai permitir que

ela seja implementada completamente em outras plataformas.Eles alegam que não há problemas em fazê-lo, e o projetoMono (www.go-mono.com) tem uma implementação parcial de.NET rodando em Linux, mas até a implementação estarcompleta e a Microsoft decidir não espremer fora nenhumaparte, .NET como solução multi-plataforma ainda é um palpitearriscado. Comentários (em inglês)

[en-usa][Traduzir]

[+ Trad.]

Para aprender mais sobre .NET e C#, veja Thinking in C# de

Larry O’Brien e Bruce Eckel, Prentice Hall 2003.

Segurança

[en-usa][Traduzir][+ Trad.]

Baixar e rodar programas automaticamente através da Internetpode parecer o sonho de um criador de vírus. Se você clicarnum site da Web, você pode automaticamente baixar uma sériede coisas junto com o HTML da página: arquivos GIF, código descript, código Java compilado, e componentes ActiveX. Algunsdesses são benignos; arquivos GIF não podem causar mal, elinguagens de script são em geral limitadas no que podemfazer. Java também foi projetada para rodar seus applets em

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 44: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 44/53

um "canteiro" de segurança ("sandbox"), que a impede desalvar dados no disco rígido ou acessar memória fora dasandbox. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

O ActiveX da Microsoft está na extremidade oposta do espectro.Programar com ActiveX é como programar Windows — vocêpode fazer qualquer coisa que quiser. Portanto, se você clicanuma página que baixa um componente ActiveX, essecomponente pode causar danos aos arquivos no seu discorígido. Claro, programas que você carrega no seu computadorque não estão restritos a rodar dentro de um navegador Webpodem fazer o mesmo. Os vírus baixados dos Bulletin-BoardSystems (BBSs) têm sido um problema há tempos, mas avelocidade da Internet amplifica a dificuldade. Comentários (eminglês)

[en-usa][Traduzir][+ Trad.]

A solução parece ser as "assinaturas digitais", em que o códigoapresenta seu autor, e tal informação é verificada. Isso sebaseia na idéia de que um vírus pega porque seu criador podeser anônimo, logo se você remove a anonimidade, os indivíduosserão forçados a ser responsáveis por suas ações. Parece serum bom plano porque permite aos programas ser muito maisfuncionais, e eu imagino que vá eliminar condutas maliciosas.Se, no entanto, um programa tiver um erro destrutivo nãointencional, causará problemas da mesma forma. Comentários (em

inglês)[en-usa][Traduzir][+ Trad.]

A abordagem Java é de prevenir esses problemas através douso do canteiro de segurança. O interpretador Java que resideno seu navegador local examina o applet, procurando pordesconfortáveis, enquanto o applet é carregado. Em particular,o applet não pode gravar arquivos em disco ou apagar arquivos(um dos suportes principais dos vírus). Applets são de modogeral considerados seguros, e como esse é um ponto essencialpara sistemas cliente/servidor confiáveis, quaisquer problemas

na linguagem Java que permitam vírus são rapidamenteresolvidos (vale notar que o programa do navegador naverdade enforça essas restrições de segurança, e algunsnavegadores permitem que o usuário selecione diferentesníveis de segurança para prover diversos graus de acesso a seusistema). Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Talvez você esteja cético quanto a esta restrição um tantodraconiana contra gravar arquivos em seu disco rígido. Por

exemplo, você pode querer criar um banco de dados local ousalvar data para uso posterior, quando desconectado. A visãoinicial parecia ser de que todo mundo iria se conectar parafazer qualquer coisa importante, mas logo se percebeu que isso

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 45: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 45/53

seria impraticável (apesar da possibilidade das "ferramentas daInternet" de baixo custo poderem um dia satisfazer asnecessidades de um segmento significante de usuários). Asolução é o "applet assinado" que usa uma codificação dechave pública para verificar se um applet vem realmente deonde ele diz que vem. Um applet assinado ainda pode danificar

seu disco, mas a teoria é de que já que você poderesponsabilizar os criadores do applet, eles não farãomaldades. Java provê uma estrutura para assinaturas digitais,para que quando necessário você seja capaz de permitir a umapplet pisar fora do canteiro de segurança. O capítulo 14apresenta um exemplo de como assinar um applet. Comentários(em inglês)

[en-usa][Traduzir]

[+ Trad.]

Adicionando-se a isso, o Java Web Start é uma maneirarelativamente nova de distribuir com facilidade programas querodam sozinhos e que não necessitam de um navegador webpara funcionar. Essa tecnologia tem o potencial de resolvermuitos problemas no lado cliente associados a rodar programasdentro de um navegador. Programas Web Start podem serassinados, ou podem pedir ao cliente permissão todas as vezesque fazem alguma coisa potencialmente perigosa para osistema local. O capítulo 14 tem um examplo simples e umaapresentação do Java Web Start. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Assinaturas digitais não estão levando em consideração umponto importante, que é a velocidade com que as pessoas semovem através da Internet. Se você baixa um programa comerros e ele faz algo indesejável, quanto tempo vai levar paravocê descobrir o estrago? Pode ser dias ou até semanas. Aí então, como você vai encontrar o programa que fez o estrago?E que bem vai fazer a essa altura? Comentários (em inglês)

Internet vs. intranet

[en-usa][Traduzir][+ Trad.]

A Web é a solução mais geral para o problema cliente/servidor,portanto faz sentido usar a mesma tecnologia para resolver umsubconjunto do problema - em particular o problema clássicocliente/servidor interno a uma companhia. Nas soluçõescliente/servidor tradicionais há o problema da diversidade detipos de computadores clientes, assim como a dificuldade deinstalação de novos programas no cliente, ambas questões

prontamente resolvidas com os navegadores para Web eprogramação lado-cliente. Quando a tecnologia Web é usadapara uma rede de informações restrita a uma empresa, ela édefinida como uma intranet. Intranets fornecem muito mais

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 46: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 46/53

segurança do que a Internet, já que você pode controlarfisicamente o acesso aos servidores dentro de sua companhia.Em termos de treinamento, parece que uma vez que aspessoas tenham compreendido o conceito geral de navegador,é muito mais fácil para elas lidarem com as diferenças na formaem que as páginas e applets se apresentam, de modo que a

curva de aprendizado para novos tipos de sistemas tende a serreduzida. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

O problema da segurança nos remete a uma das subdivisõesque parecem ter se formado automaticamente no mundo daprogramação no lado-cliente. Se seu programa está rodando naInternet, você não sabe sob que plataforma ele estátrabalhando, e você deseja tomar cuidado extra no sentido denão disseminar código defeituoso. Você precisa de alguma

plataforma cruzada e segura, como uma linguagem de script ouJava.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Se você está rodando em uma intranet, você poderia ter umoutro conjunto de restrições. Não é incomum que suasmáquinas tenham todas a plataforma Intel/Windows. Em umaintranet, você é responsável pela qualidade de seu própriocódigo e pode reparar defeitos quando os mesmos foremdescobertos. Além disto, pode ser que você já tenha um corpode código pronto que era utilizado em uma aproximação

cliente/servidor mais tradicional através da qual você tenha queinstalar fisicamente programas clientes toda vez que você fazuma atualização. O tempo dispendido na instalação deatualizações é a razão mais forte que o compele a migrar paraos navegadores, pois atualizações são invisíveis e automáticas(Java Web Start é também uma solução para este problema).Se você está envolvido com uma intranet deste tipo, oprocedimento mais lógico a adotar é tomar o caminho maiscurto que lhe permita usar sua base de código existente, aoinvés de tentar recodificar seus programas em uma novalinguagem. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Quando confrontado com este conjunto confuso de soluçõespara o problema de programação lado-cliente, o melhor planode ataque é uma análise de custo-benefícios. Considere asrestrições do seu problema e qual seria o caminho mais curtopara solucioná-lo. Como a programação lado-cliente é aindaprogramação, é sempre uma boa idéia adotar a abordagem de

mais rápido desenvolvimento para sua situação particular. Estaé uma postura vigorosa para prepará-lo para os inevitáveisencontros com os problemas de desenvolvimento deprogramas. Comentários (em inglês)

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 47: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 47/53

Programação lado-servidor

[en-usa][Traduzir][+ Trad.]

Toda esta discussão ignorou o tema da programaçãolado-servidor. O que acontece quando você faz uma solicitaçãoao servidor? Na maioria das vezes a solicitação é simplesmente"envie-me este arquivo." Seu navegador então interpreta oarquivo com um tipo apropriado: como uma página HTML, umaimagem gráfica, um applet Java, um programa de script, etc.Uma solicitação ao servidor mais complicada geralmenteenvolve uma transação de banco de dados. Um cenário comumenvolve uma solicitação para uma busca complexa em umbanco de dados, que o servidor então formata como umapágina HTML e envia a você como resultado. (Naturalmente se

o cliente tiver mais capacidade através de Java ou umalinguagem de script, os dados podem ser enviados em suaforma original e formatados na extremidade do cliente, o queserá muito mais rápido e reduzirá a carga no servidor). Ouvocê poderia querer registrar seu nome em um banco de dadosquando se associar a um grupo ou enviar um convite, o queenvolveria alterações naquele banco de dados. Estassolicitações aos bancos de dados devem ser processadas pormeio de algum código no lado servidor, o que é geralmente

denominado programação lado-servidor. Tradicionalmente, aprogramação lado-servidor tem sido executada usando Perl,Python, C++, ou alguma outra linguagem, para criarprogramas CGI, mas sistemas mais sofisticados têm aparecido.Estes incluem servidores Web baseados em Java que permitema você executar toda a sua programação lado-servidor em Javaescrevendo os assim chamados servlets. Servlets e seusdescendentes, JSPs, são duas das razões mais persuasivaspelas quais as companhias que desenvolvem sites Web estão

migrando para Java, especialmente porque são eliminados osproblemas de lidar com navegadores de capacidades diferentes(estes tópicos são abordados em Thinking in Enterprise Java).Comentários (em inglês)

Aplicações

[en-usa][Traduzir]

[+ Trad.]

Muito do alarido sobre Java gira em torno dos applets. Java éna verdade uma linguagem de programação de objetivos geraisque pode resolver os tipos de problemas que podem serresolvidos com outras linguagens - pelo menos na teoria. Ecomo salientado anteriormente, podem existir maneiras mais

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 48: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 48/53

eficazes de se solucionar a maioria dos problemascliente/servidor. Quando você sai da arena do applet (esimultaneamente libera as restrições, tais como aquela deimpedir que se escreva no disco) você entra no mundo deaplicações gerais que são executadas sem depender de umsistema operacional, sem um navegador para Web, da mesmo

forma como os programas comuns fazem. Neste aspecto, aforça de Java não é apenas sua portabilidade, mas também suaprogramabilidade. Como você verá no decorrer deste livro, Javapossui muitas características que permitem a você criarprogramas robustos em períodos mais curtos do que com aslinguagens de programação anteriores. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Esteja consciente de que este é um benefício relativo. Vocêpaga pelos aperfeiçoamentos através de uma velocidade de

execução mais baixa (embora haja um volume significativo detrabalho sendo desenvolvido nesta área - em particular, osaprimoramentos denominados "hotspots" nas versões de Javamais recentes). Como qualquer linguagem, Java tem limitaçõesde origem que podem torná-la inadequada para resolver certostipos de problemas de programação. Entretanto, Java é umalinguagem que evolui rapidamente e a cada nova liberaçãotorna-se mais e mais atraente para resolver conjuntos maioresde problemas. Comentários (em inglês)

Por quê o sucesso de Java

[en-usa][Traduzir][+ Trad.]

A razão em que Java tem sido assim um sucesso é que oobjetivo foi o de resolver vários dos problemas que encaram osdesenvolvedores de hoje. Um objetivo fundamental do Java éaumentar a produtividade. Esta produtividade vem de váriasmaneiras, mas a linguagem é projetada para ter uma melhoria

significante sobre seus predecessores, e fornecer importantesbenefícios para o programador. Comentários (em inglês)

Sistemas são facilmenteexpressados e entendidos

[en-usa][Traduzir][+ Trad.]

Classes designed to fit the problem tend to express it better.This means that when you write the code, you’re describingyour solution in the terms of the problem space (“Put thegrommet in the bin”) rather than the terms of the computer,which is the solution space (“Set the bit in the chip that meansthat the relay will close”). You deal with higher-level concepts

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 49: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 49/53

and can do much more with a single line of code. Comentários (eminglês)

[en-usa][Traduzir][+ Trad.]

O outro benefício desta facilidade de expressão é a manutençãoque (se pudermos acreditar em relatórios) é uma significativaparcela do custo durante a vida útil do programa. Se umprograma for mais fácil de se compreender, então será mais

fácil de manter. Isto pode também reduzir o custo deelaboração e manutenção da documentação. Comentários (em inglês)

Máximo aproveitamento com bibliotecas

[en-usa][Traduzir][+ Trad.]

A maneira mais rápida de se criar um programa é utilizarcódigo que já esteja escrito: uma biblioteca. Um objetivoimportante em Java é tornar o uso de bibliotecas mais fácil.

Este é atingido moldando-se bibliotecas em novos tipos dedados (classes), de modo que importar uma bibliotecasignifique adicionar novos tipos à linguagem. Como ocompilador Java cuida da forma como a biblioteca é usada -garantindo inicialização adequada e limpeza, e assegurandoque os métodos sejam chamados adequadamente - você podeconcentrar sua atenção naquilo que você deseja que abiblioteca faça, e não em como você deve fazê-lo. Comentários (eminglês)

Manipulando erros

[en-usa][Traduzir][+ Trad.]

O tratamento de erros em C é um problema notório, e um queé freqüentemente ignorado -cruzar os dedos estáfreqüentemente envolvido. Se você está construindo umprograma grande, complexo, não há nada pior que ter um erroenterrado em algum lugar sem nenhuma pista de onde possater vindo. O tratamento de exceções do Java é um modo de

garantir que um erro foi notado, e que algo acontece comoresultado.Comentários (em inglês)

Programando em larga escala

[en-usa][Traduzir][+ Trad.]

Muitas linguagens tradicionais trazem em seu cerne limitaçõesquanto ao tamanho e complexidade do programa. BASIC, porexemplo, pode ser excelente para reunir soluções rápidas para

certas classes de problemas, mas se o programa atingir maisde algumas páginas de tamanho, ou se aventurar além dodomínio normal de problemas daquela linguagem, é comotentar nadar através de um fluido cada vez mais viscoso. Não

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 50: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 50/53

há uma linha clara para informá-lo de que sua linguagem estáfalhando, e mesmo que tivesse, você a ignoraria. Você nãodiria. "Meu programa em BASIC ficou grande demais; terei quereescrevê-lo em C!" Ao invés disto, você iria tentar acrescentaralgumas linhas a mais para adicionar uma nova funcionalidade.Então os custos extras viriam sobre você. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Java é projetada para auxiliar a programação em grande escala- isto é, para apagar aqueles limites de complexidade entre umprograma pequeno e um grande. Você certamente não precisausar POO quando está escrevendo um programa utilitário dotipo "hello, world", mas as características estão lá para quandovocê necessitar delas. E o compilador é eficiente em barrarerros que produzem defeitos em programas pequenos damesma forma que em grandes. Comentários (em inglês)

Java vs. C++?

[en-usa][Traduzir][+ Trad.]

Java se parece bastante com C++, então naturalmente pareceque C++ vai ser substituido por Java. Mas eu estou começandoa questionar esta lógica. Por um motivo, C++ ainda possuialgumas características que Java não possui, e embora hajamuitas promessas sobre algum dia Java ser tão rápido quanto,ou mais que C++, nós temos visto constantesaperfeiçoamentos mas nenhuma mudança drástica. Além disso,parece haver um continuo interesse por C++, portanto eu nãoacho que aquela linguagem irá desaparecer tão cedo.Comentários(em inglês)

[en-usa][Traduzir][+ Trad.]

Eu estou começando a pensar que a força de Java reside emuma arena ligeiramente diferente da de C++, que é umalinguagem que não tenta se ajustar a um molde. Certamenteela foi adaptada em numerosas vezes para resolver problemas

particulares. Algumas ferramentas C++ combinam bibliotecas,modelos de componentes e ferramentas de geração de códigopara resolver o problema do desenvolvimento de aplicaçõeswindows para usuário final (para o Microsoft Windows). Eainda, o que é que a grande maioria dos desenvolvedoresWindows utilizam? Microsoft Visual BASIC (VB). Isto apesar dofato de que VB produz código que se torna intratável quando oprograma tem apenas algumas páginas de extensão (e sintaxeque pode ser absolutamente enganadora). Tão bem sucedida e

popular quanto é VB, não é um bom exemplo de projeto delinguagem. Seria mais agradável ter a facilidade epotencialidade de VB sem o código intratável resultante. E é aí 

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 51: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 51/53

que eu penso que Java irá brilhar: como o "próximo VB.[9]” Você pode tremer ou não ao ouvir isto, mas pense a respeito: amaior parte de Java tem como objetivo tornar fácil para oprogramador resolver problemas no nível de aplicação comoredes e UI multi-plataformas, e ainda tem um projeto delinguagem que permite a criação de corpos de código muitograndes e flexíveis. Adicione a isto o fato de que a verificaçãode tipos e manipulação de erros em Java é um grandeaprimoramento em relação à maioria das linguagens e vocêterá a estrutura de um salto significativo em direção àprodutividade de programação. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Se você está desenvolvendo todo o seu código antes de maisnada, a partir do zero, então a simplicidade de Java sobre C++reduzirá significativamente seu tempo de desenvolvimento-as

lendas (estórias contadas por equipes de C++, com as quaisconversei, que migraram para Java) sugerem o dobro davelocidade em relação a C++. Se a performance de Java nãoimportar ou se você encontrar alguma forma decontrabalançá-la, questões de tempo para colocar o produto nomercado tornarão difícil a escolha de C++ ao invés de Java.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

A maior questão é a performance. Nos interpretadoresoriginais, Java imterpretada pode ser lenta, até 20 a 50 vezes

mais lenta que C. Com o tempo, este desempenho melhorousignificativamente (especialmente com as versões maisrecentes de Java), mas ainda permanece um númerosignificativo. Em computadores a velocidade é determinante; senão fosse significativamente mais rápido fazer algo nocomputador então você o faria a mão. (Eu já ouvi a sugestãode se começar com Java, para ganhar no tempo dedesenvolvimento mais curto, então usar uma ferramenta ebibliotecas de suporte para traduzir seu código para C++, sevocê necessitar de maior velocidade de execução.) Comentários(em inglês)

[en-usa][Traduzir][+ Trad.]

A chave para tornar Java possível em muitos projetos é aaparente velocidade de melhorias como os chamadoscompiladores "just-in-time" (JIT), a tecnologia "hotspot" daSun, e ainda compiladores de código nativo. Claro que,compiladores de código nativo eliminarão a perseguidaexecução multi-plataforma dos programas compilados, mas

eles também trarão a velocidade de execução para pertodaquela em C e C++. E compilações cruzadas (cross-compiling)em Java deverão ser muito mais fáceis do que em C ou C++.(Em teoria, você apenas recompila, mas essa promessa já foi

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 52: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 52/53

feita antes em outras linguagens.)Comentários (em inglês)

Summary

[en-usa][Traduzir]

[+ Trad.]

Este capítulo tentou lhe dar uma visão geral da programação

orientada a objetos e de Java, incluindo o porquê de POO serdiferente, e o porquê de Java em particular ser diferente.Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

POO e Java não podem ser para todos. É importante avaliarsuas próprias necessidades e decidir se Java satisfará essasnecessidades a contento ou se seria melhor para você adotarum outro sistema de programação (inclusive o que você estáusando atualmente). Se você souber que suas necessidadesserão muito especializadas em um futuro próximo e se você

tiver restrições específicas que poderão não ser satisfeitas porJava, então é recomendável que você investigue as alternativas(Em particular, eu recomendo que você verifique em Python;veja www.Python.org). Mesmo se você eventualmente escolherJava como sua linguagem, você pelo menos terá compreendidoquais eram as opções e terá uma visão clara das razões pelasquais você tomou aquela direção. Comentários (em inglês)

[en-usa][Traduzir]

[+ Trad.]

Você sabe como é a estrutura de um programa procedural:

definições de dados e chamadas de funções. Para descobrir osignificado de tal programa, você tem que trabalhar um pouco,procurando as chamadas de funções e conceitos de baixo-nívelpara criar um modelo em sua mente. Esta é a razão pela qualnós precisamos de representações intermediárias quandodesenhamos programas procedurais-por si só, estes programastendem a ser confusos porque os termos e expressões sãomuito mais orientados para o computador do que para oproblema que você está resolvendo. Comentários (em inglês)

[en-usa][Traduzir][+ Trad.]

Devido ao fato de Java introduzir muitos conceitos novos alémdo que você encontra em uma linguagem procedural, é naturalque você imagine que a main( ) de um programa Java sejamuito mais complicada do que a de um programa Cequivalente. Aqui você terá uma agradável surpresa: Umprograma Java bem-escrito será em geral muito mais simples emuito mais fácil de se compreender do que um programa Cequivalente. O que você verá são as definições dos objetos querepresentam conceitos no espaço do seu problema (ao invés derepresentações do computador) e mensagens enviadas paraesses objetos para representar as atividades naquele espaço.Um dos prazeres da programação orientada a objetos é que,

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm

f 53 12/02/2013 16:41

Page 53: Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

7/16/2019 Pensando em Java, 3ª ed. Revisão 4.0_ 1_ Introdução a Objetos

http://slidepdf.com/reader/full/pensando-em-java-3a-ed-revisao-40-1-introducao-a-objetos 53/53

com um programa bem-desenhado é fácil entender o códigopela sua simples leitura. Usualmente, há também muito menoscódigo, porque muitos dos seus problemas serão resolvidospela reutilização de código existente na biblioteca. Comentários (eminglês)

[en-usa][Traduzir][+ Trad.]

[2] Alguns projetistas de linguagem decidiram que programaçãoorientada a objetos por si só não é adequada para resolver deforma fácil todos os problemas de programação, e defendem acombinação de várias abordagens em uma Linguagem deProgramação Multiparadigma. Veja ProgramaçãoMultiparadigma em Leda por Timothy Budd (Addison-Wesley1995).

[en-usa]

[Traduzir][+ Trad.]

[3]

Na verdade isto é um pouco restritivo, já que é concebívelque objetos existam em diferentes máquinas e espaços deendereçamento, além de poderem ser armazenados em disco.Nestes casos, a identidade do objeto deve ser determinada poralgo distinto do endereço de memória.

[en-usa][Traduzir][+ Trad.]

[4] Algumas pessoas fazem uma distinção, dizendo que tipodetermina a interface, enquanto classe é uma implementaçãoparticular daquela interface.

[en-usa][Traduzir][+ Trad.]

[5] Eu estou agradecido ao meu amigo Scott Meyers por estetermo.

[en-usa][Traduzir][+ Trad.]

[6] Isto é, na verdade, detalhe suficiente para a maioria dosdiagramas e você não precisa especificar se está usandoagregação ou composição.

[en-usa][Traduzir][+ Trad.]

[7] Tipos primitivos, que você irá aprender mais tarde, são umcaso especial.

[en-usa][Traduzir][+ Trad.]

[8] Exceto, desafortunadamente, para primitivos. Isto édiscutido em detalhes depois neste livro.

[en-usa][Traduzir][+ Trad.]

[9] O que a Microsoft está dizendo efetivamente é "não tãorápido" com C# e .NET. Muitas pessoas levantaram a questãosobre se programadores VB desejam mudar para qualquer outra coisa, se esta seria Java, C#, ou até VB.NET.

sando em Java, 3ª ed. Revisão 4.0: 1: Introdução a Objetos http://www.hwn.com.br/pej/tij2pej/PEJ303.htm