Você está na página 1de 12

Capítulo 1

Uma Introdução ao Java


V JAVA COMO PLATAFORMA DE PROGRAMAÇÃO
V As PALAVRAS-CHAVE DO MANIFESTO JAVA
V JAVA E A INTERNET
V UM BREVE HISTÓRICO DO JAVA
V ENGANOS COMUNS SOBRE JAVA

O primeiro lançamento do Java, em 1996, gerou uma agitação incrível, não apenas na
imprensa especializada em informática, mas em grandes veículos da mídia americana, como o
The New York Times, The Washington Post e o Business Week. Java tem a honra de ter sido
a primeira e única linguagem de programação a conseguir uma reportagem de 10 minutos na
rádio pública americana. Foi estabelecido um fundo de capital de empreendimento no valor de
US$100.000,00, exclusivamente para produtos voltados ao uso de uma linguagem de
programação específica. É bem divertido revisitar aqueles tempos vanguardísticos. Assim,
neste capítulo, apresentaremos um breve histórico do Java.

Java como Plataforma de Programação


Na primeira edição deste livro, tínhamos o seguinte a dizer sobre Java:
“Como linguagem de programação, o entusiasmo em torno do Java é exagerado: Java
certamente é uma boa linguagem de programação. Não há dúvida de que se trata de uma das
melhores linguagens disponíveis para programadores sérios. Achamos que ela poderia ter
sido, potencialmente, uma ótima linguagem de programação, mas agora provavelmente é tarde
demais para isso. No momento em que uma linguagem é lançada no mundo, a dura realidade
dos problemas em compatibilizar os novos códigos com os já existentes se apresenta.”
Por causa desse parágrafo, nosso editor ouviu um bocado de um executivo muito importante
da Sun, que permanecerá não identificado. Mas, olhando agora em perspectiva, nosso
prognóstico parece acertado. Java tem várias funções de linguagem interessantes — nós as
examinaremos, em mais detalhes, mais adiante neste capítulo. Possui também os seus
defeitos, e as novas adições à linguagem não são tão elegantes quanto as originais, devido à
dura realidade da questão da compatibilidade.
No entanto, como já tínhamos exposto na primeira edição, Java nunca foi apenas uma
linguagem. Há várias linguagens de programação disponíveis, e poucas delas causam algum
impacto. Java é toda uma plataforma, com uma biblioteca imensa, contendo grandes
quantidades de códigos reaproveitáveis, e é também um ambiente de execução que fornece
serviços como segurança, portabilidade para outros sistemas operacionais e coleta
automática de lixo.
Como programador, você desejará uma linguagem com uma sintaxe agradável e semântica
compreensível (ou seja, não C++). Java se encaixa nesse perfil, como dúzias de outras boas
linguagens. Algumas linguagens lhe fornecem portabilidade, coleta de lixo e coisas do tipo,
mas elas não possuem muitas opções de bibliotecas, forçando você a se virar para programar
sozinho caso queira gráficos bonitos ou acesso a redes ou bancos de dados. Bom, Java tem
tudo — uma boa linguagem, um ambiente de execução de alta qualidade e uma vasta
biblioteca. Essa combinação é o que torna Java uma proposta irresistível para tantos
programadores.

As Palavras-chave do “Manifesto” Java


Os autores do Java escreveram um influente Manifesto que explica os objetivos e os
sucessos na elaboração da linguagem. Publicaram também um resumo menor, organizado em
torno das seguintes 11 palavras-chave:
Simples Portável
Orientada a Objetos Interpretada
Distribuída Alto Desempenho
Robusta Multithreaded
Segura Dinâmica
Neutra em Relação à Arquitetura

Nesta seção, nós iremos:

1 • Uma introdução ao Java


Se estiver vindo de uma linguagem como o Visual Basic, que não usa ponteiros explicitamente,
você provavelmente está se perguntando por que isso é tão importante. Os programadores
em C não têm essa sorte. Eles precisam de ponteiros para acessar strings, arrays, objetos e
até mesmo arquivos. No Visual Basic, não se usam ponteiros para nenhuma dessas entidades,
nem é preciso se preocupar com alocação de memória para elas. Por outro lado, muitas
estruturas de dados são difíceis de implementar em uma linguagem sem ponteiros. Java lhe
oferece o melhor dos dois mundos. Você não precisa de ponteiros para elementos simples
como strings e arrays. Você tem o poder dos ponteiros à disposição se precisar dele, por
exemplo, para listas encadeadas. E você sempre tem segurança total, porque nunca pode
acessar um ponteiro inválido, cometer erros de alocação de memória, nem precisa se
proteger contra vazamentos de memória.

Java foi elaborada para ser usada em ambientes de rede/distribuídos. Com esse fim em
vista, colocou-se muita ênfase na segurança. Java permite a construção de sistemas livres de
vírus e de intrusões.
Na primeira edição de Core Java, dissemos: “Bem, nunca se deve dizer ‘nunca” e, afinal de
contas, estávamos certos. Pouco depois da primeira versão do Java Development Kit ter sido
lançada, um grupo de especialistas em segurança da Princeton University encontrou erros
sutis na segurança do Java 1.0. A Sun Microsystems incentivou pesquisas sobre a segurança
do Java, disponibilizando publicamente a especificação e a implementação da máquina virtual
e as bibliotecas de segurança. Eles rapidamente consertaram todos os erros de segurança
conhecidos. De qualquer forma, o Java torna extremamente difícil vencer os seus
mecanismos de segurança. Os erros encontrados até agora têm sido bastante técnicos e
pouco numerosos.
Desde o começo, Java foi elaborada para tornar certos tipos de ataques impossíveis, entre
os quais:
• Tomar controle da pilha stack de execução — um ataque comum de vermes e vírus
• Corromper a memória fora do seu próprio espaço de processamento
• Ler ou escrever arquivos sem permissão
Ao longo do tempo, várias funções de segurança foram adicionadas ao Java. Desde a versão
1.1, Java possui a noção de classes assinadas digitalmente (ver o Volume 2). Com uma classe
assinada, você pode ter certeza de quem a escreveu. Sempre que você confiar no autor da
classe, essa classe pode receber mais privilégios em sua máquina.
NOTA: Um mecanismo de entrega de código concorrente, produzido pela Microsoft com
base em sua tecnologia ActiveX, confia integralmente a questão da segurança às assinaturas
digitais. Isso claramente não é suficiente — como qualquer usuário dos produtos da própria
Microsoft pode confirmar, até programas de fabricantes famosos travam e causam danos.
Java possui um modelo de segurança muito mais poderoso do que o do ActiveX, porque
controla a aplicação enquanto esta roda e impede que ela cause problemas.

Neutra em Relação àArquitetura


O compilador gera um formato de arquivo de objetos neutro em relação à arquitetura — o
código compilado é executável em vários processadores, desde que haja a presença do
sistema em tempo de execução Java. O compilador Java consegue isso gerando instruções
bytecodes que não têm nada a ver com uma arquitetura computacional específica. Ao
contrário: eles são elaborados para ser de fácil interpretação em qualquer máquina e de fácil
tradução para código de máquina nativo imediatamente.
Essa não é uma idéia nova. Há mais de vinte anos, tanto a implementação original do Pascal de
Niklaus Wirth quanto o sistema Pascal UCSD usavam a mesma técnica.
É claro que interpretar bytecodes é necessariamente mais lento do que rodar instruções de
máquina em velocidade máxima. Então, não é claro se essa sequer é uma boa idéia.
Entretanto, as máquinas virtuais têm a opção de traduzir as seqüências de bytecode mais
freqüentemente executadas para código de máquina, um processo chamado de compilação
just-in-time (imediata). Essa estratégia se revelou tão eficiente que até mesmo a plataforma
.NET da Microsoft se baseia em uma máquina virtual. A máquina virtual tem outras
vantagens. Ela aumenta a segurança, porque pode verificar o comportamento de seqüências
de instruções. Alguns programas até mesmo produzem bytecodes imediatamente,
melhorando dinamicamente as capacidades de um programa em execução.

Portável
Ao contrário do C e C+ +, não existem aspectos da especificação que sejam “dependentes da
implementação “. Os tamanhos dos tipos de dados primitivos são especificados, bem como o
comportamento da aritmética neles.
Por exemplo, um int em Java é sempre um número inteiro de 32 bits. Em C/C++, int pode
significar um inteiro de 16 bits, um inteiro de 32 bits, ou qualquer outro tamanho que o
fabricante do compilador prefira. A única restrição é que o tipo int deve ter pelo menos a
mesma quantidade de bytes que um short int e não pode ter mais bytes que um long int. Com
um tamanho fixo para tipos numéricos, elimina-se a causa de grandes dores de cabeça
relacionadas à portabilidade. Os dados binários são armazenados e transmitidos em um
formato fixo, eliminando-se a confusão sobre a ordenação de bytes. Strings são salvas em
um formato Unicode padrão.
As bibliotecas que fazem parte do sistema definem interfaces portáveis. Por exemplo, há
uma classe Window abstrata e implementações dela para UNIX, Windows e Macintosh.
Como qualquer pessoa que tenha tentado sabe, é um esforço de proporções heróicas
escrever um programa que tenha boa aparência no Windows, no Macintosh e em dez versões
diferentes do UNIX. Java 1.0 fez o esforço heróico, oferecendo um kit de ferramentas
simples que mapeava elementos comuns de interfaces de usuário para várias plataformas
diferentes. Infelizmente, o resultado foi uma biblioteca que, com muito trabalho, gerava
resultados apenas ligeiramente aceitáveis em diferentes sistemas (e freqüentemente havia
diferentes erros nas diferentes implementações gráficas de cada plataforma). Mas já era
um começo. Há muitas aplicações em que a portabilidade é mais importante do que a boa
aparência da interface de usuário, e essas aplicações, de fato, se beneficiaram das versões
anteriores do Java. Hoje em dia, o kit de ferramentas para interfaces de usuário está
totalmente reescrito, de modo que não depende mais da interface de

Core Java 2

usuário da máquima hospedeira. Os resultados são muito mais consistentes e, em nossa


opinião, mais atraentes do que em versões anteriores do Java.

Interpretada
O interpretador Java pode executar bytecodes Java diretamente em qualquer máquina para
qual o interpretador tenha sido portado. Uma vez que a ligação é um processo muito mais
incrementador e leve, o processo de desenvolvimento pode ser muito mais rápido e
exploratório.
A ligação incremental tem vantagens, mas o seu benefício para o processo de
desenvolvimento está claramente exagerado. De qualquer forma, consideramos as
ferramentas de desenvolvimento Java um tanto lentas. Se estiver acostumado com a
velocidade do clássico ambiente Microsoft Visual C++, você provavelmente ficará
desapontado com o desempenho dos ambientes de desenvolvimento Java (no entanto, a
versão corrente do Visual Studio ainda não é ligeira como os ambientes clássicos.
Independentemente de qual linguagem use para programar, você definitivamente deveria
pedir ao seu chefe um computador mais rápido para rodar os ambientes de desenvolvimento
mais atuais).
Alto Desempenho
Embora o desempenho dos bytecodes interpretados seja normalmente mais do que adequado,
há situações em que é preciso um desempenho melhor. Os bytecodes podem ser traduzidos
imediatamente (em tempo de execução) para código de máquina, para a CPU específica em
que a aplicação está rodando.
Se estiver usando um interpretador para executar os bytecodes, “alto desempenho” não é a
expressão que usaríamos. Entretanto, em muitas plataformas, há também outra forma de
compilação, os compiladores just-in-time (JIT). Estes funcionam compilando os bytecodes
em código nativo uma vez, armazenando os resultados em cache, e depois chamando-os
novamente, se necessário. Esta abordagem acelera os códigos freqüentemente usados
tremendamente, porque só é preciso fazer a interpretação uma vez. Embora ainda
ligeiramente mais lento do que um compilador de código nativo verdadeiro, um compilador
JIT pode dar-lhe uma aceleração de dez a vinte vezes para alguns programas, e quase
sempre será significativamente mais rápido do que um interpretador. Essa tecnologia está
sendo continuamente melhorada e poderá algum dia render resultados melhores do que os
sistemas de compilação tradicionais. Por exemplo, um compilador JIT pode monitorar quais
códigos são executados freqüentemente e otimizar apenas esses códigos para maior
velocidade.

Multithreaded
Os benefícios de multithreading são melhor responsividade interativa e comportamento em
tempo-real.
Se já tentou realizar multithreading (múltiplas linhas de execução) em outra linguagem, você
terá uma surpresa agradável ao ver como é fácil fazê-lo em Java. Linhas de execução em
Java podem também beneficiar-se de sistemas multiprocessadores se o sistema operacional
de base o fizer. O lado ruim é que as implementações de linhas de execução nas plataformas
mais importantes diferem radicalmente, e o Java não faz nenhum esforço para ser neutro
em relação às plataformas nesse aspecto. Somente o código para chamar o multithreading
permanece o mesmo para todas as máquinas; o Java delega a implementação de
multithreading para o sistema operacional subjacente ou para uma biblioteca de threads
(Linhas de execução são abordadas no Volume 2). De qualquer forma, a facilidade no uso de
multithreading é uma das principais razões pelas quais Java é uma linguagem tão atraente
para desenvolvimento server-side (lado do servidor).

Dinâmica
Em vários sentidos, Java é uma linguagem mais dinâmica do que C ou C+ +. Ela foi elaborada
para adaptar-se a um ambiente em evolução. As bibliotecas podem adicionar livremente novos
métodos e variáveis de instâncias sem qualquer efeito em seus clientes. Em Java, descobrir
informações de tipos em tempo de execução é uma tarefa fácil.
Esta é uma característica importante nas situações em que é preciso adicionar código a um
programa em execução. Um exemplo típico éo de códigos que são baixados da Internet para
rodar em um navegador. No Java 1.0, descobrir informações de tipos em tempo de execução
era menos fácil, mas as versões correntes de Java dão ao programador uma visão completa
tanto da estrutura quanto do comportamento de seus objetos. Isso é extremamente útil
para sistemas que precisem analisar objetos em tempo de execução, tais como construtores
de GUI Java, depuradores inteligentes, componentes inseríveis e bancos de dados de
objetos.
NOTA: A Microsoft lançou um produto chamado J++ que tem uma relação familiar com o
Java. Como esta última, o J++ é executado por uma máquina virtual que é compatível com a
máquina virtual Java para executar bytecodes Java, mas há diferenças substanciais ao se
fazer interface com códigos externos. A sintaxe básica da linguagem é quase idêntica à do
Java. Entretanto, a Microsoft adicionou elementos de linguagem que são de utilidade
duvidosa, exceto para a tarefa de interagir com a API do Windows. Além de o Java e o J++
terem uma sintaxe em comum, as suas bibliotecas fundamentais (strings, utilitários, funções
de rede, multithreading, matemática etc.) são essencialmente idênticas. Entretanto, as
bibliotecas para gráficos, interfaces de usuário e acesso remoto são completamente
diferentes. Atualmente, a Microsoft não oferece mais suporte a J++, tendo introduzido uma
outra linguagem, chamada C#, que também possui muitas semelhanças com Java, mas usa uma
máquina virtual diferente. Existe até mesmo um J# para migrar aplicações J++ para a
máquina virtual usada pelo C#. Não abordamos J++, C# nem J# neste livro.

Java e a Internet
A idéia aqui é simples: os usuários baixam bytecodes Java da Internet e os rodam em suas
próprias máquinas. Os programas Java que rodam em páginas web são chamados applets. Para
usar um applet, você precisa de um navegador web habilitado para Java, o qual executará os
bytecodes para você. Pelo fato de a Sun estar licenciando o código-fonte do Java e
insistindo em que não sejam feitas modificações na linguagem nem na estrutura básica das
bibliotecas, um applet Java deveria rodar em qualquer navegador que seja anunciado como
habilitado para Java. Infelizmente, a realidade tem sido diferente. Diferentes versões do
Netscape e do Internet Explorer

1 e Uma introdução ao Java

rodam diferentes versões de Java, algumas das quais estão plenamente desatualizadas. Essa
triste situação tem tornado cada vez mais difícil desenvolver applets que aproveitem os
recursos da versão mais atual do Java. Para remediar esse problema, a Sun desenvolveu o
Java Plug-in, uma ferramenta que disponibiliza o mais recente ambiente em tempo de
execução Java, tanto para o Netscape como para o Internet Explorer (ver o Capítulo 10).
Quando o usuário baixa um applet, o processo funciona praticamente da mesma forma que a
inserção de uma imagem em uma página web. O applet se torna parte da página, e o texto flui
ao redor do espaço usado para o applet. A questão é que se trata de uma imagem viva. Ela
reage a comandos do usuário, muda sua própria aparência e envia dados entre o computador
que apresenta o applet e o computador que o está servindo.
A Figura 1-1 mostra um bom exemplo de uma página web dinâmica — um applet para visualizar
moléculas — que executa cálculos sofisticados. Usando o mouse, você pode rodar e ampliar
cada molécula para entender melhor a sua estrutura. Esse tipo de manipulação direta não é
possível com páginas web estáticas, mas os applets a tornam possível (você poderá encontrar
esse applet em http:// j mol.sourceforge.net).
Applets podem ser usados para adicionar botões e campos de entrada de dados a uma página
web. Mas baixar esses applets através de uma conexão discada é muito lento, e você pode
fazer praticamente o mesmo com DHTML, formulários HTML e uma linguagem de script
como o JavaScript. E, é claro, os primeiros applets eram usados para animações: os
familiares globos giratórios, personagens de desenhos animados dançando, texto em
movimento e assim por diante. Mas GIFs animados podem fazer praticamente o mesmo.
Assim, os applets somente são necessários para interações complexas, não para projetos web
em geral.
Como resultado das incompatibilidades dos navegadores e da inconveniência de se baixar o
código através de conexões lentas, os applets em páginas web não se tornaram um grande
sucesso na Internet. A situação é inteiramente diferente em intranets. Normalmente não há
problemas com largura de banda, então o tempo de download dos applets não é um empecilho.
E, em uma intranet, é possível controlar qual navegador está sendo usado ou usar o Java
Plug-in consistentemente. Usuários não podem desconfigurar ou sumir com programas que
são entregues através da Web a cada uso, e o administrador do sistema nunca precisa sair
por aí atualizando códigos nas máquinas clientes.
Muitas empresas têm lançado programas como verificação de inventário, planejamento de
férias, reembolso de viagens e assim por diante, como applets que usam o navegador como
plataforma de execução.

x;0]

Figura 1-1: Uapplet Jmol _________________________________________

No momento em que escrevemos o foco saiu dos programas baseados no cliente e


passou a apontar para a programação server-side (lado servidor). Em particular,
servidores de aplicações podem usar as capacidades de monitoramento da
máquina virtual Java para realizar equilíbrio automático de carga, controle de
conexões a bancos de dados, sincronização de objetos, desligamento e
reinicialização seguros, além de outros serviços necessários para aplicações
escaláveis de servidor, mas que são notoriamente difíceis de se implementar corretamente.
Assim, os programadores de aplicações podem comprar, ao invés de
construir, esses mecanismos sofisticados. Isso aumenta a produtividade do
programador — os programadores podem concentrar-se na questão principal de seu
trabalho, a lógica de negócios dos seus programas, e não em ajustar o desempenho
do servidor.
Um Breve Histórico do Java
Esta seção apresenta um pequeno histórico da evolução do Java. Ela se baseia em
várias fontes publicadas (e principalmente em uma entrevista com os criadores do Java na
edição de julho de 1995 da revista eletrônica SunWorld). O Java começa em 1991, quando um
grupo de engenheiros da Sun, liderados por Patrick Naughton e seu colega na Sun (e gênio da
informática em geral), James Gosling, queriam elaborar uma pequena uma

linguagem de programação que pudesse ser usada para dispositivos eletrodomésticos, como
decodificadores de TV a cabo. Pelo fato de esses dispositivos não terem muito poder de
processamento nem memória, a linguagem tinha de ser pequena e gerar código bastante
otimizado. Além disso, pelo fato de diferentes fabricantes poderem escolher diferentes
unidades centrais de processamento (CPUs), era importante que a linguagem não fosse
vinculada a qualquer arquitetura em especial. O projeto recebeu o nome-código “Green”
(“Verde”).
Os requerimentos de um código pequeno, otimizado e neutro em relação à plataforma levou a
equipe a ressuscitar o modelo que algumas implementações de Pascal tentaram no início da
história dos PCs. Niklaus Wirth, o inventor da linguagem Pascal, fora pioneiro na elaboração
de uma linguagem portável que gerasse código intermediário para uma máquina hipotética
(essas são freqüentemente chamadas de máquinas virtuais — daí a máquina virtual Java, ou
JVM). Esse código intermediário poderia então ser usado em qualquer máquina que tivesse o
interpretador correto. Os engenheiros do projeto Green também usavam uma máquina
virtual, então isso resolvia o principal problema deles.
O pessoal da Sun, no entanto, vinha de um passado em UNIX; dessa forma, eles basearam a
sua linguagem em C++, ao invés de em Pascal. Em particular, eles fizeram a linguagem
orientada a objetos, ao invés de orientada a procedimentos. Mas, como Gosling diz na
entrevista, “O tempo todo a linguagem era uma ferramenta, não um fim em si mesmo”.
Gosling decidiu chamar sua linguagem de “Oak” (“carvalho”, em inglês, presumivelmente
porque ele gostava da aparência de um carvalho que ele via de sua janela, no escritório da
Sun). Mais tarde, o pessoal da Sun descobriu que já havia uma linguagem de programação
chamada Oak, então mudaram o nome para Java. Isso acabou sendo uma escolha bastante
feliz.
Em 1992, o projeto Green lançou o seu primeiro produto, chamado “*7” Tratava-se de um
controle remoto extremamente inteligente (ele tinha o poder de processamento de uma
SPARCstation em uma caixa de 6 polegadas de comprimento por 4 de altura e 4 de largura).

Core Java 2
Infelizmente, ninguém na Sun estava interessado em produzir esse aparelho, e o pessoal do
projeto Green teve de eiieuiiu maneiras de vender a sua tecnologia. Entretanto, nenhuma das
principais companhias de eletrodomésticos se interessou. O grupo então candidatou-se a um
projeto destinado a elaborar um decodificador de TV a cabo que lidasse com novos serviços
de cabo, tais como vídeo on-demand (sob demanda). Eles não conseguiram o contrato
(interessantemente, a companhia que o conseguiu era liderada pelo mesmo Jim Clark, que
fundou a Netscape — uma empresa que teve papel importante para o sucesso do Java).
O projeto Green (com o novo nome de “First Person, mc.”) passou todo o ano de 1993 e
metade de 1994 procurando quem comprasse a
sua tecnologia — não acharam ninguém (Patrick Naughton, um dos fundadores do grupo e a
pessoa que acabou fazendo a maior parte de marketing, diz ter acumulado 300.000 milhas
aéreas tentando vender a tecnologia). A First Person foi dissolvida em 1994.
Enquanto tudo isso acontecia na Sun, a parte World Wide Web da Internet crescia cada vez
mais. A chave para a Web é o navegador que traduz a página de hipertexto para a tela. Em
1994, a maioria das pessoas estava usando o Mosaic, um navegador web não-comercial que
surgiu do centro de supercomputação da University of Illinois, em 1993 (o Mosaic foi
parcialmente escrito por Marc Andreessen, por Us$6.85 a hora, como estudante de
graduação em um projeto de estágio. Ele seguiu para a fama e a fortuna como um dos co-
fundadores chefe de tecnologia da Netscape).
Na entrevista para Sun World, Gosling diz que, em meados de 1994, os desenvolvedores da
linguagem perceberam que poderiam “desenvolver um navegador muito bom. Era uma das
poucas coisas na área de cliente/servidor que precisavam de algumas das coisas estranhas
que tínhamos desenvolvido: neutralidade de arquitetura, execução em tempo real,
confiabilidade, segurança — questões que não eram terrivelmente importantes no mundo das
estações de trabalho. Então fizemos um navegador”.
O navegador propriamente dito foi construído por Patrick Naughton e Jonathan Payne
evoluiu para o navegador HotJava. O navegador HotJava foi escrito em Java para
demonstrar o poder da linguagem. Mas os projetistas também tinham em mente o poder dos
agora chamados applets. Então, fizeram o navegador capaz de executar código dentro de
páginas web. Essa “prova de tecnologia” foi exibida na SunWorld ‘95, em 23 de maio de 1995,
e inspirou a febre de Java que continua até hoje.
A Sun lançou a primeira versão do Java no início de 1996. As pessoas rapidamente
perceberam que o Java 1.0 não iria dar conta do desenvolvimento sério de aplicações.
Certamente, era possível usar o Java 1.0 para criar um applet de texto vivo que se movesse
ao acaso dentro de uma tela. Mas não era possível nem imprimir em Java 1.0. Para ser claro, o
Java 1.0 ainda não estava pronto para a estréia. Seu sucessor, a versão 1.1, preencheu as
lacunas mais óbvias, melhorou significativamente a capacidade de reflexão e adicionou um
novo modelo de eventos para a programação de GUI. Entretanto, ainda era bastante limitada.

A boa notícia da conferência JavaOne de 1998 foi o anúncio do lançamento do Java 1.2, que
substituiu as amadoras ferramentas de GUI de gráficos anteriores por versões sofisticadas
e escaláveis que chegaram muito mais perto de cumprir a promessa de “Escrever Uma Vez e
Rodar Em Qualquer Lugar” do que os seus predecessores. Três dias depois (!) de seu
lançamento em dezembro de 1998, o departamento de marketing da Sun mudou o nome para
o interessante Java 2 Standard Edition Software Development Kit Version 1.2.
Além da “Standard Edition” (“edição padrão”), duas outras edições foram apresentadas: a
“Micro Edition”, para dispositivos como telefones celulares, e a “Enterprise Edition” (“edição
corporativa”), para processamento server-side (lado servidor). Este livro se concentra na
Standard Edition.
As versões 1.3 e 1.4 da Standard Edition representam melhorias incrementais em relação à
versão inicial do Java 2, com uma biblioteca padrão sempre em crescimento, desempenho
melhorado e, é claro, uma boa quantidade de erros reparados. Durante essa época, boa parte
do entusiasmo inicial sobre applets Java e aplicações clientes se enfraqueceu, mas o Java se
tornou a plataforma preferida para aplicações servidoras. A versão 5.0 é o primeiro
lançamento, desde a versão 1.1, que atualiza a linguagem Java de maneira significativa (essa
versão fora originalmente numerada 1.5, mas o número da versão pulou para 5.0 na
conferência JavaOne de 2004). Após muitos anos de pesquisa foram adicionados tipos
genéricos (que são comparáveis, por alto, aos templates do C++) — o desafio era adicionar
essa funcionalidade sem precisar de modificações na máquina virtual. Várias outras
funcionalidades úteis de linguagem foram inspiradas pelo C#; um loop (laço) “for each”,
autoboxing e metadados. Mudanças na linguagem são sempre uma fonte de problemas de
compatibilidade, mas várias dessas novas funções de linguagem são tão sedutoras que
pensamos que os programadores estarão ansiosos para adotá-las. A Tabela 1 mostra a
evolução da linguagem Java.
Tabela 1-1: Evolução da Linguagem Java

A Tabela 1-2 mostra o crescimento da biblioteca Java ao longo dos anos. Como você pode
ver, o tamanho da interface de programação de aplicações (API) cresceu tremendamente.
Tabela 1-2: Crescimento daAPI do Java Standard Edition
Versão Número de Classes e Interfaces
1.0 211
1.1 477

Versão
Funcionalidades de Linguagem
Novas

1.0 A própria linguagem

1.1 Classes Internas

1.2 Nenhuma

1.3 Nenhuma

1.4 Asserções

Classes genéricas, instrução “for each”, varargs, autoboxing, metadados,


5.0
enumerações, importação estática

1 • Uma introdução ao Java 3


1.2 1524
1.3 1840
1.4 2723
5.0 3270

Enganos Comuns Sobre Java


Fechamos este capítulo com uma lista de alguns enganos comuns sobre Java, junto com
comentários.
Java é uma extensão do HTML.
Java é uma linguagem de programação; HTML é uma maneira de descrever a estrutura de
uma página web. Elas não têm nada em comum,
exceto o fato de haver extensões HTML para colocar applets Java em uma página web.
Eu uso XML, então não preciso de Java.
Java é uma linguagem de programação; XML é uma maneira de descrever dados. Você pode
processar dados XML com qualquer linguagem de programação, mas aAPI Java contém
excelente suporte para o processamento de XML. Além disso, muitas importantes
ferramentas XML de terceiros são implementadas em Java. Consulte o Volume 2 para mais
informações.
Java é uma linguagem de programação fácil de aprender
Nenhuma linguagem de programação tão poderosa como Java é fácil. Você sempre precisa
distinguir entre quão fácil é escrever programas de brinquedo e quão difícil é fazer
trabalhos sérios. Além disso, considere que somente quatro capítulos deste livro discutem a
linguagem Java. Os demais capítulos de ambos os volumes mostram como pôr a linguagem em
ação, usando as bibliotecas Java. As bibliotecas Java contêm milhares de classes e
interfaces, e dezenas de milhares de funções. Felizmente, você não precisa conhecer cada
uma delas, mas precisa conhecer uma quantidade surpreendentemente alta para usar Java
para qualquer trabalho realista.
Java se tornará uma linguagem de programação universal para todas as plataformas.
Isso é possível, em teoria, e certamente é verdade que todos os fabricantes, exceto a
Microsoft, parecem desejar que isso aconteça. Entretanto, muitas aplicações que já
funcionam perfeitamente bem em desktops não funcionariam bem em outros dispositivos,
tampouco dentro de um navegador. Além disso, essas aplicações foram escritas para
aproveitar a velocidade do processador e da biblioteca nativa de interfaces de usuário, e já
foram portadas para todas as plataformas importantes, de qualquer maneira. Dentre esse
tipo de aplicações, estão processadores de texto, editores de fotos e navegadores web. Eles
são normalmente escritos em C ou C++, e não vemos benefício para o usuário final em
reescrevê-los em Java.
Java é apenas mais uma linguagem de programação.
Java é uma boa linguagem de programação; a maioria dos programadores a prefere em
relação a C, C++ ou C#. Enquanto centenas de boas linguagens de programação nunca
obtiveram grande popularidade, linguagens com falhas óbvias, como C++ e Visual Basic, têm
tido enorme sucesso.
Por quê? O sucesso de uma linguagem de programação é determinado muito mais pela
utilidade do sistema de suporte disponível a ela do que pela elegância de sua sintaxe. Existem
bibliotecas úteis, convenientes e padronizadas para as funções que você precisa
implementar? Existem fabricantes de ferramentas que disponibilizam ótimos ambientes de
programação e de depuração?A linguagem e o conjunto de ferramentas se integram com o
resto da infra-estrutura computacional? Java faz sucesso porque as suas bibliotecas de
classes lhe permitem realizar facilmente tarefas que eram difíceis anteriormente, como
funções de rede e multithreading. O fato de Java reduzir erros de ponteiros é um bônus e,
dessa forma, os programadores parecem ser mais produtivos com Java, mas esses fatores
não são a fonte de seu sucesso.
Agora que C# está disponível, Java se tornou obsoleto.
C# tomou emprestadas muitas boas idéias do Java, tais como uma linguagem de programação
descomplicada, uma máquina virtual e coleta de lixo. Mas, pelos motivos que forem, C#
também deixou de fora algumas boas funcionalidades, das quais as mais importantes são
segurança e independência em relação à plataforma. Em nossa visão, a maior vantagem do C#
éo seu excelente ambiente de desenvolvimento. Se você estiver atado ao Windows, faz muito
sentido usar o C#. Mas, julgando pelos anúncios de emprego, Java ainda é a linguagem
preferida pela maioria dos desenvolvedores.
Java é uma linguagem proprietária e, por isso, deveria ser evitada.
Cada um vai ter de se decidir sozinho sobre esta questão. Há situações em que ficamos
frustrados por causa de algum aspecto do Java, e desejamos que uma equipe de código
aberto concorrente pudesse vir em nossa salvação. Mas a situação não é tão simples assim.
Embora a Sun tenha o controle em última instância sobre Java, eles têm, através do “Java
Community Process”, envolvido muitas outras empresas no desenvolvimento de revisões da
linguagem e na elaboração de novas bibliotecas. O código-fonte da máquina virtual e das
bibliotecas está disponível gratuitamente, mas somente para pesquisa, não para modificação
e redistribuição.
Observando as linguagens de código aberto disponíveis, não é claro se elas estão fazendo um
trabalho melhor. As mais populares são os três “Ps” em “LAMP” (Linux, Apache, MySQL e
Perl/PHP/Python). Essas linguagens têm os seus benefícios, mas também têm sofrido com
mudanças abruptas de versões, bibliotecas limitadas e escassez de ferramentas de
desenvolvimento.
Do outro lado do espectro, temos C++ e C#, que foram padronizadas por comitês de padrões
independentes de fabricantes. Concordamos que esse processo é mais transparente do que o
Java Community Process. Entretanto, os resultados não têm sido tão úteis quanto você
poderia pensar. Não é suficiente padronizar apenas a linguagem e as bibliotecas mais básicas.
Para programação real, você rapidamente vai além da manipulação de strings, coletas e
arquivos. No caso do C#, a Microsoft já declarou que irá manter a maioria das bibliotecas
fora do processo de padronização.