O que é Java, para que serve e como programar nessa linguagem

Udacity Brasil
4 de mai de 2018

Java é uma linguagem de programação orientada a objetos amplamente utilizada em diversos cenários, seja em aplicações web, aplicações móveis (é utilizado no sistema operacional Android) e mesmo na internet das coisas.

O objetivo deste artigo é dar uma breve introdução sobre:

O que este artigo não traz? Trechos de programação web ou Android ou de JavaScript. Apesar de conter "Java" no nome, JavaScript não é Java: é uma linguagem independente voltada principalmente para programação de aplicações web dinâmicas (sem necessidade de plugins) e, portanto, roda principalmente em um web browser.

O que é Java?

Java é uma linguagem de programação orientada a objetos, mas esta definição acaba abrangendo apenas uma parte do que ela é. A melhor forma de definir o que é Java, como um todo, é a palavra plataforma, ou seja, um conjunto de componentes como uma Máquina Virtual Java para rodar instruções (JVM, explicada mais adiante), a linguagem de programação em si e também plugins para execução de aplicações Java.

A principal premissa de Java à época de sua criação era fornecer uma alta interoperabilidade, visando o princípio de "write once, run anywhere" (tradução literal: escreva uma vez e execute em qualquer lugar).

Isso significa que, ao escrever uma aplicação em Java, ela poderá ser executada independente do sistema operacional ser Windows, Mac ou Linux, já que bastará apenas que um destes sistemas tenha instalado um Java Runtime Environment (JRE) que fornecerá uma JVM para executar a aplicação desenvolvida.

Outro ponto de destaque sobre o que é Java, naquele tempo e hoje em dia, era seu uso independente também do hardware. A ideia era permitir que o Java rodasse também em outros aparelhos, como celulares e qualquer outro dispositivo que comportasse o JRE.

Um exemplo disso é o Java Ring (Anel Java) concebido em um evento Java One de 1998. Ele armazenava as preferências de café do seu portador e era utilizado pelas cafeterias do evento para produzir as bebidas conforme as especificidades de cada Anel Java.

Isso até remete a Internet of Things (Internet das Coisas, ou IoT, na sigla em inglês), termo que se refere a uma rede ainda em construção que conecta dados de máquinas, objetos e pessoas – o que demonstra que Java estava muito à frente do seu tempo.

E por que, afinal, JavaScipt não é Java? Tudo questão de marketing. Em idos dos anos 1990, para aproveitar a popularidade da nova linguagem, os desenvolvedores do LiveScript tomaram uma decisão: trocar o "live" por algo mais atraente. Só isso!

Leia: As linguagens de programação mais populares do momento, por indústria

História de Java

A linguagem Java foi criada pela Sun Microsystems em 1995 e hoje pertence à Oracle, gigante da tecnologia que adquiriu a Sun em 2009 por mais de 7 bilhões de dólares. Dois anos depois, Java já era a segunda linguagem mais utilizada no mundo, utilizada por aproximadamente 400 mil desenvolvedores.

Java se tornou mais popular com a popularização da própria Internet, principalmente pelo fato de permitir que aplicações fossem executadas no browser por meio dos Java Applets.

Em 1999, o Java ganhou sua segunda versão, que abriu espaço para aplicações corporativas através do Java 2 Platform, Enterprise Edition (J2EE) e para dispositivos móveis através do Java 2 Platform, Micro Edition (J2ME).

Cinco anos após sua criação, Java estava presente em diversos tipos de dispositivos. Diversos mesmo, como caixas bancários, pagers, celulares, câmeras, computadores desktops e servidores. Pouco tempo depois, houve até uma batalha entre robô programados em Java – os controladores de cada robô operavam com dispositivos móveis com J2ME instalados.

Em 2006, quando ainda estava sob a tutela da Sun Microsystems, Java teve seu desenvolvimento transformado e foi lançado como open source (código aberto) com o intuito de aumentar a adoção da tecnologia. O código-fonte de Java ficou então disponível sob uma licença GNU (General Public License), a mesma que entidades do governo e o sistema operacional Linux utilizam.

Logo antes da aquisição da Oracle veio o JavaFX, um novo produto focado em construir websites dinâmicos e também aplicações Java para diversos tipos de dispositivos.

As evoluções não pararam com um novo proprietário. O Java 7 foi lançado em 2011, trazendo novidades como o suporte a strings nas instruções switch, inferência de tipos genéricos, múltiplas instruções catch em um único bloco try … catch, entre outras.

Em 2012, o Hadoop – um framework de código aberto desenvolvido, mantido pela Apache Software Foundation e inspirado pelo Google – ganhou o prêmio Duke's Choice Award, solidificando a revolução trazida pelo Big Data na plataforma Java.

Em 2013, o Java EE 7 foi lançado e trouxe uma estrutura escalável para facilitar o desenvolvimento de aplicações HTML5 através de tempos de resposta reduzidos e comunicação bidirecional com Websockets. Também facilitava o parsing de dados JSON e a utilização de webservices RESTful com o JAX-RS 2.0.

Por fim, em 2014, mais uma versão de Java é lançada: o Java 8, que traz novidades como recursos de programação funcional (lambdas), novas formas de efetuar processamento paralelo com Streams e melhorias na integração com JavaScript, entre outras novidades.

Hoje, mais de vinte anos depois de sua criação, Java é uma linguagem utilizada por 45.3% dos desenvolvedores consultados pela Stack Overflow, a maior comunidade do tipo do mundo. É uma das cinco linguagens mais populares do mundo.

Por que instalar Java?

O programa pediu para você instalar o Java? Não feche este pop-up. O principal motivo para se instalar Java é ser capaz de executar aplicações em Java escritas de forma independente do sistema operacional em questão, o que tem uma série de vantagens importantes: o uso de aplicações não é restrito a um OS ou outro e, portanto, seu alcance é maior.

Um bom exemplo no cenário brasileiro é a aplicação de declaração de Imposto de Renda (IRPF), que permite que o cidadão escreva toda sua declaração de imposto de renda independente de sistema operacional – e, para tanto, exige que Java esteja instalado no computador.

A instalação do Java é bem simples: ao entrar no site oficial basta fazer o download do instalador do JRE (Java Runtime Environment) para o seu sistema operacional e executá-lo. O próprio wizard guiará o passo a passo até a conclusão.

Para testar se o Java foi instalado corretamente, abra uma linha de comando e digite:

java -version

Se a saída for conforme a seguir, Java está instalado com sucesso!

java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

Vale lembrar que para desenvolver algo com Java será necessário fazer o download do JDK (Java Development Kit), que está disponível para download neste link.

Outro ponto importante tem a ver com o Google.

Quando introduziu o sistema operacional Android, o Google escolheu apresentar ao mundo algo que utilizava Java para funcionar.

Há muitas teorias e rumores sobre o que motivou essa escolha,, que hoje resulta numa grande batalha legal entre o Google e a Oracle, que adquiriu a tecnologia depois dessa nova implementação e acusou a gigante de violar seus direitos e patentes.

Há algum consenso no barulho. Por ser uma linguagem que já era conhecida, Java facilitava o trabalho de desenvolver apps e games para o novo sistema: há uma infinidade de informações e ferramentas disponíveis.

Outra vantagem seria sua máquina virtual (JVM), que não exige que o código seja recompilado para cada telefone e traz segurança. Por fim, muitos telefones já utilizavam Java ME, o que também trazia familiaridade na indústria.

Seja qual for a motivação, funcionou: hoje, mais de 85% dos smartphones utilizam Android, que tem também um ecossistema de desenvolvimento vibrante.

Para que serve Java?

O princípio de Java, como dito anteriormente, é ser interoperável, o que permite que as aplicações Java sejam executadas em qualquer sistema operacional, bastando apenas que o usuário tenha o JRE (Java Runtime Environment) instalado em seu computador.

Mas apenas isso não define para que serve Java. É possível, por exemplo, escrever em Java aplicações web, aplicações corporativas (J2EE) e aplicações móveis (Android).

Além disso, existem também pontos interessantes que podem motivar iniciantes a aprender e programar em Java:

1. Java é open source

A linguagem Java é open source e distribuída de forma gratuita para os desenvolvedores, mas existem algumas confusões neste conceito. As especificações fornecidas pela Sun Microsystem e pela Oracle são open-source. Já as implementações da Java Virtual Machine podem ser ou não ser open source – a OpenJDK (Java Development Kit), por exemplo, é uma implementação open source da JVM.

2. Java é uma linguagem difundida

Java é uma linguagem difundida entre os desenvolvedores, amplamente utilizada em diversos cenários e por isso possui uma comunidade grande e ativa. O ranking Tiobe demonstra em números que Java é a linguagem mais utilizada pelo mundo:

Dessa forma, um desenvolvedor iniciante consegue achar facilmente materiais e recursos para começar a programar nessa linguagem, assim como obter ajuda da comunidade em caso de erros.

3. Java tem ferramentas e frameworks para diversos tipos de situações

Quando se aprende Java, há a possibilidade de utilizá-la não só em aplicações desktop, mas também em aplicações servidoras (aplicações web), assim como em aplicações móveis (como na plataforma Android) – na próxima vez que perguntarem para que serve Java, você já saberá responder: para muita coisa.

Em cada um desses cenários, Java também possui uma gama de ferramentas e frameworks para facilitar a vida dos desenvolvedores. Considere o cenário web: existem frameworks como o Spring MVC e o poderoso RxJava, da iniciativa Rx (Reactive Extensions).

O mesmo RxJava também funciona em aplicações Android, já que o projeto é focado no desenvolvimento de aplicações como um todo e não apenas aplicações para dispositivos móveis.

Formação em Java

A formação em Java pode envolver tópicos distintos e, dependendo do foco do desenvolvedor, existirão diferenças no desenvolvimento de aplicações web e mobile.

Independente da escolha, existem muitos materiais disponíveis para introdução a esta linguagem – de apostilas como Java e Orientação a Objetos, feita pela Caelum e disponível para download gratuito, a cursos estruturados.

A Udacity possui as seguintes opções de formação em Java:

Introdução à Programação Java

Neste curso online gratuito de 6 semanas, você aprende os fundamentos da sintaxe de Java com vídeos de instrutores e exercícios práticos. Saiba mais aqui.

Nanodegree Android Basics

Neste programa Nanodegree feito em parceria com o Google, a Udacity ensina o passo a passo para que você possa criar seus primeiros apps. Ao todo, são 5 meses. O aluno também tem apoio de revisores e especialistas na área. Saiba mais sobre esse curso de desenvolvimento Android online.

Como programar em Java

Se você já está convencido de que realmente vale a pena aprender Java, agora vem a parte interessante: como programar, de fato, em Java? Saiba mais aqui.

A tradição dos programadores pede a criação de um "Olá Mundo" sempre que formos aprender uma nova linguagem de programação. Um "Olá Mundo" em Java se parece com o seguinte:

public class OlaMundo {
    public static void main(String[] args) {
        System.out.println("Ola Mundo");
    }
}

Sintaxe de Java

Neste trecho, já se pode notar alguns pontos da sintaxe do Java:

O uso de class na definição inicial do bloco de código

Isto identifica o nome da Classe do arquivo atual e o conjunto de comportamentos (métodos, atributos) da mesma. Ao utilizar essa classe posteriormente, este nome será referenciado na hora da instanciação, que nada mais é do que alocar em memória a instrução que permitirá executar os métodos e atributos do bloco de código definido.

O uso da função definida dentro de uma classe

Na programação orientada a objetos, o uso da função dentro de uma classe é chamada de método. Um método existe no escopo da classe no qual foi declarado, ou seja, o main() é um método da classe OlaMundo.

System.out.println() é uma chamada de método da classe PrintStream

Essa chamada de método imprimirá na saída do console da aplicação o texto “Ola Mundo”. Note que a classe System possui o atributo out. Este atributo é do tipo PrintStream e portanto temos acesso aos métodos desta classe.

Sintaxe de classes e métodos

Ser uma linguagem orientada a objetos significa que há o conceito de classes e instâncias. A classe será um bloco de código que servirá como um "projeto" e nela serão definidos comportamentos e atributos.

Porém, apenas defini-la não será suficiente para que funcione. Para tanto, é necessário gerar uma instância – a partir daí, os métodos da classe ficam disponíveis para ser executados.

A classe abaixo é um exemplo básico que contém dois atributos e um método:

class Pessoa {
    String nome;
    Integer idade;
    void olaMundo() {
        System.out.println(“Ola Mundo”);
    }
}

Neste caso, "nome" e "idade" são os atributos e "void olaMundo()" é um método.

Agora, para utilizar esta classe, é necessário gerar a instância através da palavra new:

Pessoa pessoa = new Pessoa();
pessoa.olaMundo();
// ola mundo

Isso indica que, a partir de agora, a variável definida representará a classe em questão e desta variável poderão ser executados métodos da classe – assim como acessar os seus respectivos atributos.

Se for declarado um novo atributo com um valor padrão na classe, ele estará disponível na instância. Caso nenhum valor seja atribuído para o atributo, ele ficará null.

Pessoa pessoa = new Pessoa();
System.out.println(pessoa.nome);
// valor padrão: null

Agora, o que acontece ao atribuir um novo valor à este atributo? Este valor estará presente somente na instância. Caso uma nova instância seja feita, ela terá o valor padrão ao invés do valor definido na primeira instância de pessoa:

Pessoa pessoa = new Pessoa();
System.out.println(pessoa.nome); //valor padrão: null
pessoa.nome = "Novo nome";
System.out.println(pessoa.nome); // Novo nome
Pessoa pessoa2 = new Pessoa();
System.out.println(pessoa2.nome); // valor padrão: null
pessoa2.nome = "Nome Pessoa 2";
System.out.println(pessoa2.nome); // Nome pessoa 2

Modificadores de visibilidade

Outro item importante da orientação a objetos é a visibilidade dos métodos e atributos, assim como o encapsulamento.

Por padrão, ao não definir nenhum modificador de visibilidade, os métodos e atributos estarão visíveis no pacote da classe, ou seja, outras classes do mesmo pacote poderão acessar e utilizar estes atributos e métodos.

Também é possível restringir a visibilidade de atributos e métodos através do uso de private: ao defini-lo, a utilização será permitida apenas dentro da própria classe. Qualquer chamada externa lançará um erro na aplicação.

Existe também o modificador protected que possui a mesma restrição do private. A principal diferença envolve a herança. Ou seja, uma classe filha pode acessar o método ou atributo marcado como protected, o que não ocorre com o private onde somente a própria classe poderá utilizá-lo. Mais detalhes sobre herança serão apresentados mais à frente.

Estes modificadores de visibilidade também podem ser utilizados a nível de classes, onde o uso da classe ficará restrita ao escopo da visibilidade escolhida. O trecho de código abaixo apresenta alguns usos desses modificadores de visibilidade.

public class Pessoa {
    public String nome;
    protected Integer idade;
    private String nascimento;

    public void olaMundo() {
    }
    private void aniversario() {
    }
    protected void dizerNome() {
    }
}

Blocos if, loops, switch

Para verificações condicionais, é muito comum utilizar a instrução if, e Java também fornece a instrução switch. Entenda na prática: para permitir a entrada de uma pessoa maior de 18 anos podemos acessar o atributo idade. Caso ele seja maior que 18, a entrada é permitida. Caso contrário, a entrada não é permitida.

if (pessoa.idade > 18) {
    // entrada permitida
} else {
    // entrada proibida
}

Também é possível combinar instruções if else para demais situações verdadeiras, assim como o uso de operadores lógicos para criar situações de E e OU. Imagine o exemplo anterior com uma diferença: a entrada de pessoas de 17 anos acompanhadas pelos pais é permitida:

if (pessoa.idade > 18) {
    // entrada permitida
} else if (pessoa.idade == 17 && pessoa.acompanhadaPelosPais) {
    // entrada permitida
} else {
    // entrada proibida
}

O OU é definido como ||. Poderia-se então redefinir esse conjunto de if else para permitir a entrada se a pessoa tem 18 anos ou se ela está acompanhada pelos pais:

if (pessoa.idade > 18 || pessoa.acompanhadaPelosPais) {
    // entrada permitida
} else {
    // entrada proibida
}

Já o switch é geralmente utilizado para casos onde existem muitas possibilidades baseadas em um denominador comum (variável/atributo). Se, por exemplo, fossemos definir o nome do mês baseado em números de 1 a 12, poderia-se utilizar um bloco switch e, para cada número, definir um bloco case, executado somente quando o valor for igual ao número em questão.

switch (mesAtual) {
    case 1:
        System.out.println("Janeiro");
    case 2:
        System.out.println("Fevereiro");
}

Se você executar o trecho anterior com a variável mesAtual definida como 1, notará que Janeiro e Fevereiro serão impressos. Isso é o comportamento padrão do switch: todos os cases posteriores ao case encontrado como verdadeiro serão executados, por isso Fevereiro também foi impresso.

Para prevenir este comportamento utiliza-se a instrução break, ela fará com que o bloco atual seja terminado prevenindo que as demais instruções case sejam executadas:

switch (mesAtual) {
    case 1:
        System.out.println("Janeiro");
        break;
    case 2:
        System.out.println("Fevereiro");
        break;
}

Outra instrução útil no switch é a instrução default, que é executada quando nenhum outro case satisfaz a condição necessária. Se, por exemplo, mesAtual for 13, 14, 15 ou até 0, pode-se definir um bloco default para informar que é um mês inválido.

switch (mesAtual) {
    case 1:
        System.out.println("Janeiro");
        break;
    case 2:
        System.out.println("Fevereiro");
        break;
    default:
        System.out.println("Mês inválido");
        break;
}

Herança

Nos exemplos até agora, havia a classe Pessoa. Mas considere a Udacity, por exemplo: há Alunos e Professores. Ambos são Pessoas, mas cada um tem sua particularidade. Talvez o caminho inicial seja criar uma classe para o Aluno:

class Aluno {
    String nome;
    Integer idade;
    String curso;
}

E outra classe para o Professor:

class Professor {
    String nome;
    Integer idade;
    String nanodegreeMinistrado;
}

Ao analisar essas linhas, encontram-se aqui repetições de atributos como idade e nome não só entre eles, mas também entre eles e a classe Pessoa. Para evitar esse tipo de repetição é possível utilizar herança.

Com a herança, será criada uma relação de classe-mãe e classe-filha entre as classes definidas. No exemplo abaixo, a classe Aluno herda da classe Pessoa. Nesse caso a classe-filha é Aluno e a classe-mãe é Pessoa:

class Aluno extends Pessoa {
    String curso;
}

A classe-filha herdará os atributos da classe-mãe, ou seja, os atributos nome e idade também estarão presentes em Aluno. Note que o que define que a classe declarada herda de outra classe é o uso da palavra extends – e ela só poderá ser usada para definir a herança de uma única classe, já que não existe o conceito de herança múltipla em Java.

Como mencionado no tópico dos modificadores de visibilidade, existem algumas formas de prevenir que a classe-filha herde certos atributos ou métodos da classe-mãe. Para isso, é possível usar o modificador private.

Outro tópico importante aqui é o conceito de polimorfismo, que permite que classes-filhas modifiquem métodos herdados das classes-mãe. Considere o caso em que Pessoa define um método para se apresentar a outra Pessoa:

class Pessoa {
    String nome;
    Integer idade;
    void apresentacao(Pessoa pessoa) {
        System.out.println(“Ola “ + pessoa.nome + “ eu sou uma Pessoa e me chamo “ + nome);
    }
}

Agora, na classe Aluno, a apresentação deverá indicar que ele é um Aluno, ao invés de Pessoa. Para isso, é possível redefinir o método apresentacao() na classe-filha, modificando seu comportamento:

class Aluno extends Pessoa {
    String curso;
    void apresentacao(Pessoa pessoa) {
        System.out.println(“Ola “ + pessoa.nome + “ eu sou um Aluno e me chamo “ + nome);
    }
}

Se você gerar uma nova instância de Aluno e chamar o método apresentacao(), o resultado será a apresentação como Aluno ao invés de pessoa:

Aluno aluno = new Aluno();
Pessoa pessoa = new Pessoa();
pessoa.nome = "Pessoa";
aluno.nome = "Aluno Udacity";
aluno.apresentacao(pessoa);
// Ola Pessoa eu sou um Aluno e me chamo Aluno Udacity

E existe alguma forma de executar o código de Pessoa mesmo que o de Aluno esteja modificando seu comportamento? Externamente, pela instância que criamos, não. Porém, internamente, pode-se fazer o uso da chave super, que mudará o escopo de chamada para o da classe-mãe.

Se o método apresentacao() devesse chamar a apresentação de Pessoa antes de se apresentar como Aluno, o código poderia ser escrito como:

class Aluno extends Pessoa {
    String curso;
    void apresentacao(Pessoa pessoa) {
        super.apresentacao(pessoa);
        System.out.println(“Ola “ + pessoa.nome + “ eu sou um Aluno e me chamo “ + nome);
    }
}
Aluno aluno = new Aluno();
aluno.nome = “john”;
Pessoa pessoa = new Pessoa();
pessoa.nome = “test”;
aluno.apresentacao(pessoa);

Ao chamar este novo método de apresentação, o resultado será:

Ola test eu sou uma Pessoa e me chamo john
Ola test eu sou um Aluno e me chamo john

O super também pode ser usado para referenciar atributos e construtores. Lembre-se que a regra de visibilidade também se aplica aqui.

Interfaces

O conceito de interface é um pouco diferente, mas parecido, com o de herança: ele define uma forma que cria um vínculo entre uma classe e uma interface.

A principal diferença neste caso é que, ao se utilizar uma interface, não é definido nenhum corpo de método, ou seja, são feitas apenas as declarações e assinaturas dos métodos. A classe que “assinar” a interface que fará a implementação do método em questão.

Considere por exemplo a interface SerVivo:

interface SerVivo {
    public void respirar();
    public void comer();
}

Sabemos que um ser vivo respira e se alimenta, mas cada ser vivo fará isso de uma forma diferente: um peixe precisará respirar de uma maneira diferente que uma pessoa, um cachorro não usará garfo e faca para comer como uma pessoa.

Dessa forma é válido dizer que ficará a critério de Pessoa e Cachorro (ou Peixe) definir estas implementações apesar dos três seguirem a mesma assinatura de um SerVivo:

class  Pessoa implements SerVivo {
    public void respirar() {
        System.out.println(“Usar os pulmões”);
    }
    public void comer() {
        System.out.println(“Usar garfo, faca, boca e dentes”);
    }
}
class  Cachorro implements SerVivo {
    public void respirar() {
        System.out.println(“Usar os pulmões também”);
    }
    public void comer() {
        System.out.println(“Usar o pote, a língua e os dentes”);
    }
}

Note que, para “assinar” uma interface, a palavra utilizada é implements ao invés de extends. extends é exclusiva para a herança entre classes e implements para indicar que a classe deverá seguir determinadas assinaturas de uma interface. Outro ponto: ao assinar uma interface, será necessário implementar todos os métodos da mesma.

Bibliotecas de Classes

A Java Class Library (Biblioteca de Classes Java) é a biblioteca padrão do Java, desenvolvida pela Sun Microsystems em colaboração com outros desenvolvedores para fornecer o suporte principal necessário para desenvolver sistemas em Java.

Empresas ou indivíduos que participam deste processo podem influenciar nas decisões e no desenvolvimento de suas APIs. Atualmente, a biblioteca de classes padrão contém recursos como:

Bibliotecas core, incluindo:

  • IO/NIO
  • Rede
  • Reflexão
  • Concorrência
  • Generics
  • Scripting/Compiler
  • Programação Funcional
  • Bibliotecas de estruturas de dados como listas, dicionários, árvores, etc.
  • Processamento XMl
  • Segurança
  • Internacionalização e Localização

Bibliotecas de integração, que permitem que o desenvolvedor faça o seu sistema se comunicar com sistemas externos, incluindo:

  • O Java Database Connectivity (JDBC), que é uma API para acessar bancos de dados
  • Java Naming and Directory Interface (JNDI) para procura e descoberta
  • RMI e CORBA para o desenvolvimento de aplicações distribuídas
  • JMX para gerenciar e monitorar aplicações

Bibliotecas de interface de usuário como:

  • O Abstract Window Toolkit (AWT), que fornece componentes de interface do usuário e a forma de desenhar e posicionar estes componentes, assim como maneiras de manusear eventos que estes componentes podem gerar Bibliotecas Swing, que são desenvolvidas sob o AWT mas fornecem implementações do AWT em forma de widgets
  • APIs para captura, processamento e execução de áudio
  • JavaFX

Além disso:

  • Uma implementação dependente de plataforma da JVM, que será o responsável por executar os bytecodes Java das bibliotecas padrão assim como das implementações do desenvolvedor
  • Plugins, que habilitam (ou habilitavam) que os browsers executem applets Java Web Start, que permite que aplicações Java sejam distribuídas eficientemente para usuários finais pela internet
  • Licenciamento e documentação

Java é bom? Conheça as críticas e as melhorias

As críticas que assombram Java incluem coisas como a implementação de generics, performance, o manuseio de números unsigned, a implementação aritmética de números de ponto flutuante e um histórico de vulnerabilidades na principal implementação de JVM: a HotSpot.

Além disso também existem as vulnerabilidades já conhecidas de Applets e a descontinuação de seu suporte pelos browsers mais famosos, da mesma forma como ocorreu com o Adobe Flash (lembra dele?).

Apesar disso, pode-se dizer que Java para servidores e para Android tem funcionado muito bem: a linguagem é cada vez mais adotada por empresas e utilizada para diversos tipos de sistemas de diferentes níveis de complexidade.

Outro ponto interessante é que desenvolver e rodar o sistema na Java Virtual Machine não quer necessariamente dizer que o sistema deverá ser escrito em Java. Existem muitas novas linguagens que não são Java e que rodam na JVM como Kotlin, Scala e Groovy.

Ou seja, apesar dos criticismos da linguagem Java, a plataforma Java ainda está muito bem estabelecida e as novas linguagens que surgem visam melhorar ainda mais sua adoção entre os desenvolvedores.

Exemplos de Java: apps, games e ferramentas

Aplicações em Java

IRPF

O programa IRPF (Imposto de Renda Pessoa Física) é utilizado para preenchimento e transmissão das declarações de imposto de renda no Brasil. É uma aplicação desenvolvida em Java e interoperável – um ponto essencial visto que precisa atender milhões de brasileiros com diferentes computadores.

Apache Open Office

O Apache Open Office é uma suíte de escritório escrita em Java e inclui programas como o Writer para escrever documentos, o Calc para planilhas, Impress para criar apresentações, Draw para desenho de diagramas, Base para manipular bancos de dados e Math para equações matemáticas.

Aplicações Android

Muitas das aplicações executadas nos celulares Android são escritas em Java, já que a linguagem é utilizada para desenvolver aplicativos para essa plataforma. Alguns exemplos de aplicativos são do próprio Google: Gmail, Google Calendar e Youtube.

Games em Java

Apesar da linguagem C/C++ ser dominante na plataforma de games, ainda existem alguns casos de games bem conhecidos desenvolvidos na plataforma Java, que utilizam a vantagem da plataforma interoperável para construir uma única base de código e rodá-la em diversos sistemas operacionais.

Minecraft

O clássico Minecraft foi desenvolvido pela empresa Mojang e é um jogo de construção sandbox, permitindo ao jogador construir o que ele imaginar.

RuneScape

RuneScape é um jogo de MMORPG produzido pela empresa britânica Jagex. Foi criado oficialmente em 1998 por Andrew Gower.

Ferramentas em Java

IntelliJ IDEA

IntelliJ IDEA é uma IDE escrita em Java e possui suporte para o desenvolvimento de aplicações em diversas linguagens e plataformas. Alguns de seus recursos incluem assistente de código, ecossistema de plugins e software de controle de versão, entre outros.

Jenkins CI

O Jenkins é um servidor de integração e entrega contínua. É escrito em Java e é uma ferramenta essencial no dia a dia dos desenvolvedores, pois permite a execução de suíte de testes de acordo com triggers dos repositórios de controle de versões e gerenciamento de builds, entre outras funcionalidades.

Materiais e documentações sobre Java

Documentação

Criado pela Sun Microsystems, o JavaDoc é um excelente sistema de documentação e utilizado por muitos desenvolvedores Java. Ele fornece aos desenvolvedores um sistema organizado para documentar o código desenvolvido e, também, gerar arquivos de documentação baseados nessas documentações de código.

Em tempo: para adicionar comentários no código, há dois caminhos:

  • O uso de duas barras (//)
  • O uso de uma barra com asterisco (/*)

A segunda forma é recomendada para comentar mais de uma linha de comentário e deverá ser fechada com */:

// uma linha de comentário
/* uma linha de comentário
    Outra linha de comentário
    Fim */

O JavaDoc se difere destas duas formas de comentar/documentar o código primeiramente pela sintaxe: ele exige que a linha inicie com um asterisco extra (/**).

No caso de utilizar um Integrated Development Environment (IDEs ou Ambientes Integrados de Desenvolvimento), cada nova linha também conterá um (*) no início.

Considere o exemplo abaixo de JavaDoc de um método:

/** 
 * Método de exemplo que imprimirá Teste
 * @param String parametro
 */
void metodo(String parametro) {
    System.out.println(“Teste”);
}

O @param será mapeado pelo JavaDoc e aparecerá na documentação gerada, informando o uso do parâmetro em questão. Para conferir um exemplo de JavaDoc gerado para a classe String da API do Java, clique aqui.

Existem outros marcadores especiais, como de retornos de métodos, referências para classes externas e etc. Você pode encontrar mais informações sobre o JavaDoc aqui.

Cursos de Java

Introdução à Programação Java – Udacity

Neste curso online gratuito de 6 semanas, você aprende os fundamentos da sintaxe de Java com vídeos de instrutores e exercícios práticos. Saiba mais aqui.

Nanodegree Android Basics – Udacity

Neste programa Nanodegree feito em parceria com o Google, a Udacity ensina o passo a passo para que você possa criar seus primeiros apps. Ao todo, são 5 meses. O aluno também tem apoio de revisores e especialistas na área. Graduados ganham um certificado reconhecido pela indústria. Saiba mais aqui.

Apostilas Java

Apostila Java e Orientação a Objetos – Caelum

A Caelum é uma das pioneiras de cursos de Java no Brasil e desenvolveu essa apostila para seu próprio curso de formação Java. Inicialmente, ela era utilizada como um material interno es estava disponível somente para alunos do curso. Hoje tem download aberto e gratuito.

Sites

Tutoriais – Oracle

Os tutoriais oficiais sobre Java disponibilizados pela Oracle, proprietária da tecnologia, contam com exemplos de orientação a objetos, sintaxe da linguagem, tipos de variáveis, uso de generics, entre outros.

Elements of Programming – Princeton University

Exemplos de programas escritos em Java do curso de introdução à ciência da computação da Princeton, apresenta exemplos de como trabalhar com Strings, primeiros passos com a linguagem Java, loops, condicionais etc.

Essentials of the Java Programming Language – Oracle

Lições sobre Java da própria Oracle. Há diversos capítulos abordando tópicos como configurando o computador, executando programas em Java, estrutura da linguagem, applets, interfaces desktop, Java web, acesso a bancos de dados e RMI.

Leia também: