Arquivo por Autor

FEA-JV8-001 – Novidades Java 8: porque tanta expectativas?

Publicado: 04/03/2014 por Guilherme Weizenmann em Básico, java
Tags:,

Olá Pessoal.

Estive olhando as novidades do Java 8 e resolvi reportar um pequeno resumo. Desde o Java 5, uma nova versão do Java nã era tão aguardada. No Java 5 foram aicionados Annotations e Generics. O Java 8 irá estreiar Lambdas e Streams.

Gordan Freeman, at Black Mesa, Lambda Core

Lambdas são um rescurso genérico, derivado de conceitos funcionais, e muito similar a Scala (outra lingagem que roda na JVM). A descrição do recurso é a seguinte:

Expressões Lambda são uma nova e importante funcionalidade no Java SE 8. Elas provêm uma forma clara e concisa de representar 1 método de uma interface usando uma expressão. Expressões Lambda também melhoram as bibliotecas Collection fazendo com que seja fácil iterar sobre, filtrar e extrair dados de uma Collection. Adicionalmtente, novas funcionalidades de concorrência melhoram a performance em ambientes multiprocessados.
Java SE 8: Lambda Quick Start em 04/03/2014 em inglês. Tradução do autor.

A idéia básica é facilitar o desenvolvimento, principalmente de códigos que iteram sobre collections, baseado em interfaces, que também trazem novidades, devido aos Lambdas. A parte da concorrência é implementada por “debaixo dos panos”, pra você não ter que se preocupar com isso.

Olhando através do espelho

As interfaces, até o Java 7, serviam para criar assinaturas de métodos, sem implementação padrão. Mas com o surgimento dos Lambdas, e a necessidade de manutenção de código legado temos o seguinte problema:

Se alterarmos uma interface em um projeto já existente, e adicionarmos um método a ela, obrigaremos todas as classes que implementam essa interface a implementar esse novo método, quebrando assim o código existente.

Visando resolver esse problema, no Java 8 foram introduzidos os “métodos padrões” (Default Methods, também chamados “virtual extension methods” ou “defender methods”). São métodos com implementação padrão em Interfaces. Esses métodos com implementação padrão não precisam ser implementados pelas subclasses, mas podem ser sobrescritos se preciso. Assim é possível alterar um interface sem quebrar compatibilidade. Como as interfaces dos Collection foram modificadas com o adventos dos Lambda, foi preciso a criação dos métodos padrões para evitar a quebra de código ou o mega trabalho para ajustar tudo.

Mas lembre-se, as interfaces não guardam estados e não são, portanto, substitutas das classes abstratas. Classes abstratas e interfaces ainda são diferentes e tem funções diferentes.

Outra coisa importante: múltiplas heranças. Com os métodos padrões surge um problema. Dadas duas interfaces com métodos de mesmas assinatura, com implementação padrão, qual deverá ser escolhido? O problema, no Java, é resolvido em tempo de compilação. A classe deverá implementar (sobrescrever o método em questão, mesmo que seja chamando a implementação default de uma das interfaces implementadas) ou o compilador irá gerar uma mensagem de erro e não compilará a classe.

Seguindo o fluxo do rio

Aleḿ das alterações em interfaces e surgimento dos Lambdas, surgem também os Streams. Mas o que são?

Wrappers sobre coleções que suportam várias operações convenientes e de alta performance expressadas sucintamente com Lambdas.
Java 8 Tutorial: Lambda Expressions, Streams, and More – Java 8 Streams Part 1 em 04/03/2014 em inglês. Tradução do autor.

Streams não guardam dados, mas possuem uma entrada de dados baseada, por exemplo, em um ArrayList. Recuperando o stream dessa lista, pode-se facilmente aplicar operações em cada elemento (forEach), como aplicar filtros (filter), entre outras. O importante de lembrar é que esses métodos foram feitos para se trabalhar com Lambdas.

Pequenos detalhes

Além dessas grandes mudanças, outras pequenas serão adicionadas. Citarei apenas algumas:

  • Nashorn JavaScript Engine: suporte a javascript embarcado e disponível para qualquer aplicação
  • Repeating Annotations: atualmente cada anotação somente pode ser usada uma vez (na classe, método, prorpiedade). O Java 8 terá suporte a repetição de anotaçãoes!
  • Java Time API: nova api para trabalhar com datas e horas, substituindo o velho e proplemático java.util.Date

E se eu encontrar outra que vale a pena postar, eu atualizo o post…..

Going back home

Pra terminar, fazendo um resumo do resumo, Lambdas são a grande novidade, trazendo mudanças em várias outras estruturas do Java. Com isso, será mais rápido desenvolver, sem perder compatibilidade com o que já existe, e mais rápido operar sobre collections.

Até mais e obrigado pelos peixes!

Anúncios

Organização dos POST

Publicado: 22/01/2014 por Guilherme Weizenmann em Organização dos POST

Depois de uma pequena faxina e uma pensadinha em como montar as coisas, decidimos o seguinte:

  • os posts terão prefixos e serão numerados por assunto, de forma a mostrar qual a ordem deles. Essa ordem não necessariamente seja cronológica, mas sim a nível de conteúdo. Sendo assim, se você leu o post 2 de uma série, o próximo conteúdo desse tema é o 3, e o 1 seria o pré-requisito.
  • os post poderão ter sufixos. Caso não haja sufixo (após o número do post) não ha uma variação do tema. Caso haja, poderá haver um post com o mesmo tema sendo tratado em linux e windows, por exemplo. Os sufixos utilizados serão catalogados aqui:
    • L: linux
    • W: windows

Temas abordados por prefixo

ENV – Temas relacionados à ambiente necessário para trabalhar com Java

ENV-001 – Variáveis de ambiente

Publicado: 21/01/2014 por Guilherme Weizenmann em Básico, java
Tags:, , ,

Olá pessoal. Eu sei que esse, na ordem de temas vem antes do post ENV-001L, mas eu escrevi aquele primeiro…..

Este é apenas a respostas para as seguintes peeguntas:

  • O que são variáveis de ambiente?
  • Pra que servem variáveis de ambiente?

Vamos lá…..

O que são variáveis de ambiente

São variáveis fora dos programas e aplicações que são acessíveis pelos programas e aplicativos e guardam informações sobre o ambiente em que eles se encontram.

Pra que servem variáveis de ambiente

As variáveis de ambiente guardam informações sobre o ambiente atual, tanto pode ser do console/terminal em uso, como do usuário ou do sistema. Olhe os exemplos:

COMPUTER
MINHA_MAQUINA
USER
devjava
AMBIENTE
PRODUCAO
PATH
C:\windows;C:\windows\system (windows)
/bin:/usr/bin (Linux, Unix)

Traduzindo em miúdos, as variveis de ambiente são placas em uma cidade grande, dizendo aos programas e aplicativos alguns dados básicos para que possam se localizar.

Como configurá-las

Isso depende do sistema operacional. Veja os posts ENV-001L e ENV-001W.

Isso é tudo pessoal!

ENV-002 – Instalação e configuração da JVM e JDK

Publicado: 21/01/2014 por Guilherme Weizenmann em Básico, java
Tags:, , ,

Olá pessoal. Hoje falarei da instalação do Java. O Java vem em dois sabores:

JRE
Java Runtime Environment (Ambiente de tempo de execução Java – tradução meia boca 😛 )
JDK
Java Development Kit (Kit de desenvolvimento Java – tradução boa 😀 )

Então, se você for desenvolver uma aplicação em Java precisará do JDK. Se for usar ou distribuir uma aplicação para o usuário final, precisará do JRE, que por “coincidência”, faz parte do JDK.

Além desses dois sabores do Java, ele também tem 2 fornecedores. Se você pensava que Java era só da Oracle (antigamente Sun), se enganou. Na época em que a Sun não tinha sido comprada pela Oracle, a própria Sun começou um projeto junto à comunidade Java para a disponibilização de um Java 100% open source. Então, se você pensava também que o Java era 100% open source, se enganou. O Java da oracle possui algumas partes fechadas, mas que estão em processo de abertura de código. Então, existem 2 fornecedores do Java: a Oracle e ………… (suspense) ……………. o projeto OpenJDK.

As principais diferenças entre o Java da Oracle e o OpenJDK são:

  • o OpenJDK é 100% open source
  • o OpenJDK, atualmete, roda somente em linux, mas se você joga Minecraft em linux, deveria usá-lo, pois é otimizado para linux.

Onde eu consigo o Java

O Java da oracle, você baixa do site da Oracle para qualquer sistema operacional.

Se você usa linux, principalmente derivados do Debian, terá ainda a opção de acesso via repositório oficial ao OpenJDK e ao Java da Sun (5 e 6 antes da venda da Sun), e via repositório PPA (https://launchpad.net/~webupd8team/+archive/java) ao Java da Oracle (Java 6,7 e 8).

O processo de instalação específico para cada S.O. será abordado nos POST ENV-002L e ENV-002W

Eu instalei, e aí……

Depois de instalado, 3 variáveis de ambiente são necessárias:

  • PATH – já existe, mas precisa estar adequada
  • JAVA_HOME
  • CLASPATH

JAVA_HOME e CLASSPATH são abordadas no post ENV-003(L/W).

Quanto PATH, deve ser adicionado o caminha para os executáveis da Java para que o sistema saiba onde procurar os comandos java, javac, javaws, …, sem que você precise colocar o caminho completo.

Bem pessoal, por hoje é só, mas em breve traremos os procedimentos de instalação do Java em cada plataforma.

Vida longa e próspera!

ENV-002L – Instalando o JDK no linux

Publicado: 17/01/2014 por Guilherme Weizenmann em Básico, java
Tags:, , , ,

Olá pessoal. Seguindo com os posts, e em homenagem ao meu colega de blog que se converteu ao linux (=D rsrsrss), agora vamos instalar a JVM e o JDK no linux. Como eu já comentei antes, eu uso Debian e seus derivados. Mais exatamente, tenho um Debian 7 no trabalho e Ubuntu 13.10 no meu notebook. Então, conclui-se que mostrarei como instalar a JVM e o JDK no Debian 7/Ubuntu 13.04.

Instalação de qualquer programa/pacote no linux

Todos os linux possuem algum gerenciador de pacotes. De forma simples, um pacote pode ser um programa, um pedaço de um programa (configurações, bibliotecas, arquivos afins), ou um conjunto de programas. O Debian e seus derivados são equipados com o dpkg e seu irmão mais novo e moderno, o apt-get. Para facilitar, iremos usar o apt-get.

Para instalar um pacote chamado xyz:

apt-get install xyz

O comando deve ser executado como administrador. Caso não saiba como, no terminal, digite sudo antes do comando, e digite a sua senha:

sudo apt-get install xyz

Para remover, troque install por purge. Expurgar um programa/pacote remove inclusive os arquivos de configuração do pacote a nível de sistema. Caso deseje mantê-los, use remove.

Instalando o OpenJDK 7

Existe mais de uma versão do Java, e não estou me referindo a numeração, mas sim, implementação. A mais famosa, no Windows, é a implementação da Sun/Oracle, mas no linux, não é a única. O OpenJDK, implementação totalmente open source do Java, disponível apenas para Linux (roda no BSD tb via port), é otimizada para linux. Ela é dividida em pacotes:

openjdk-?-jre-headless
JRE sem suporte a UI
openjdk-?-jre
JRE com suporte a UI
openjdk-?-jdk
JDK
openjdk-?-sources
código fonte do Java
openjdk-?-docs
documentação do Java (javadocs)
openjdk-?-demo
programas de demonstração
icedtea-?-plugin
plugin Java para applets nos navegadores de internet e suporte a Java Web Start

Onde ? é o número da versão do Java: 5, 6, 7…

Então, para instalar o Java 7 (JRE):

sudo apt-get install openjdk-7-jre

E para instalar o JDK 7:

sudo apt-get install openjdk-7-jdk

E para instalar o JDK 7, com javadocs e fontes:

sudo apt-get install openjdk-7-jdk openjdk-7-docs openjdk-7-sources

Instalando o Java da Oracle

Existem basicamente 2 formas de instalar o Java da Oracle no Debian e seus derivados:

  • baixando do site e instalando manualmenfe (difícil – tente se quiser, mas não vou abordar isso aqui)
  • usando o PPA Webupd8 (facinho facinho)

O PPA Webup8 é um repositório que contém pacotes para serem instalados no Ubuntu (Debian e seus derivados também) que fazem o download do Java da Oracle e instalam ele pra você. O site deles é [https://launchpad.net/~webupd8team/+archive/java]. As instruções estão lá, mas para facilitar, irei colocar aqui as instruções para o Ubuntu.

Basta dar os seguitens comandos e seguir as instruções na tela (dar alguns enters rsrsrsr):

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get install oracle-java7-installer

Múltiplos Javas

No linux é possível manter mais de uma instalação do Java, de diferentes versões e implementações. Por exemplo, você pode definir que o compilador javac será do OpenJDK 6, que o executor java será do OpenJDK 7 e que o executor JWS javaws será o Oracle Java 7. Para selecionar, basta dar o seguinte comando:

sudo update-alternatives --all

Vai aparecer várias coisas, mas o importante é:

  • sempre que aparecer algo que não esteja vinculado com o Java, de um enter que não será alterado.
  • sempre que aparecer algo vinculado ao Java, selecione um opção (número) e dê enter.

Para sair a qualquer momento, dê ctrl + c. Isso irá para o processo de seleção, mas não descartará as alterações, ou seja, o que foi alterado está salvo. Para desfazer, rode o comando novamente e altere a sua escolha.

Qualquer coisa é só perguntar!

Ao infinito e além!

Olá pessoal.

Eu sou novo por aqui, e este será meu primeiro post. Como o nome do blog sugere, este deveria ser um blog sobre Java. Então você deve estar se perguntando: por que diabos a criatura vai começar falando de ariáveis de ambiente em Linux? Resposta: eu uso linux, acho maravilhoso e não troco por Ruindows da Micro$oft, e, esse é um assunto recorrente quando se trata de configuração de ambiente e ferramentas Java (ou qualquer outra linguagem).

No linux existem o que podemos chamar de 3 escopos básicos para definição de variáveis de ambiente: terminal, usuário e sistema ou global. Para ficar mais claro: se você só vai usar na tela preta dos comandos, poderá definir as variáveis a nível de terminal. Se for só você que vai usar as variáveis, ou só vocé usa o computador (é o meu caso), pode definir a nível de usuário. Se precisar de uma variável disponível para vários usuários ou processos que rodam em segundo plano como daemons iniciados automaticamente com o sistema operacional, você precisará usar o escopo global.

Bem, vamos ao trabalho…

Fazendo a variável funcionar no terminal

No linux se usa shell script, e é isso que vamos usar como base para as definições. Para definir uma variável, basta digitar no terminal o seguinte (e apertar ):

NOME_DA_VARIVEL="valor dela"

Para conferir se funcionou, digite (note o $ na frente):

echo $NOME_DA_VARIAVEL

e o resultado que deverá aparecer é

valor dela

Para que a variável fique visível a nível de terminal, o comando deve ser precedido de export:

export NOME_DA_VARIVEL="valor dela"

Definindo a variável na abertura do terminal

Sempre que se abre um terminal, que rode o interpretador bash (caso do Debian e seus derivados, como Ubuntu), o seguinte arquivo é lido:

  • .bashrc

Note o ponto na frente do nome. Isso significa que o arquivo é oculto. Então basta incluir uma linha no arquivo com a definição da variável e voilá, funcionará!

Definindo a variável a nível de sessão

Basta fazer o mesmo que acima, mas no arquivo a seguir:

  • .profile

Definindo a variável a nível de sistema

Agora muda tudo! Brincadeirinha :D….

Basta fazer o mesmo, mas como administrador, no seguinte arquivo:

  • /etc/environment

Para editar como administrador, abra o terminal e digite:

sudo nano /etc/environment

Para salvar, aperte CTRL + O, e para sair, CTRL + X.

Observação

Se você for que nem eu, deve ter tentado fazer sem terminar e ler tudo. Para a mágica funcionar você deve reiniciar escopo:

  • o terminal: fechar e abrir de novo, ou abrir outro
  • a sessão: logou e login
  • o sistema operacional: reboot

Outra coisa, defina em somente um escopo, para poder saber exatamente onde você colocou e poder atualizar ou corrigir, se necessário…..

Até mais e obrigado pelos peixes!