A versão 9 da plataforma Java está disponível faz alguns
meses, com adição de algumas novas características e a, tradicional, evolução
de sua API, com mudanças importantes, mas nada revolucionário em relação ao que
já existe. Agora é a hora de verificarmos o quanto as novidades são úteis no
dia-a-dia.
A lista de features esperada na versão 9 incluiu elementos
que podem ser organizados em três categorias, conforme seu escopo, ou seja,
aqueles voltados para a linguagem de programação, para o Java Development Kit
(JDK) e para a plataforma em si.
Este post contém comentário gerais sobre os novos elementos plataforma 9, alguns dos quais são tratados com mais detalhes nos seguintes posts complementares:
- Java 9::Métodos Privados em Interfaces
- Java 9::O Console jshell
- Java 9::Melhorias na Stream API
- Java 9::Melhorias no Optional<T>
- Java 9::Jigsaw
Modificações na Linguagem de Programação
As modificações inclusas linguagem de programação, na
verdade, concentram-se no aperfeiçoamento das interfaces, com a adição de
métodos privados.
Métodos privados em interfaces [post]
Recordando rapidamente, o Java 8 introduziu a possibilidade
incluir métodos públicos default e públicos estáticos em interfaces. Estes
novos tipos de métodos exigem implementação na própria interface,
diferentemente dos demais métodos públicos abstratos que devem ser
implementados nas classes que realizam a interface. Na prática, com isso,
permite que interfaces existentes sejam atualizadas, recebendo novas operações,
sem provocar a propagação da mudança, pois as classes que já as implementam não
sofrem qualquer exigência adicional. Detalhes e exemplos do uso dos métodos
default e static em interfaces estão disponíveis no post Interfaces::criação,uso e atualização no Java 8
.
Na versão 9 foram introduzidos os métodos privados nas
interfaces, declarados com o especificador de visibilidade private e,
opcionalmente, com o modificador static. Como outros membros privados, só podem
ser acessados por aqueles presentes em seu tipo.
Um exemplo esquemático de um método privado estático seria:
public interface
J9News {
private
static boolean validate() { ... }
}
O uso de métodos privados, estáticos ou não, numa interface
permite que o programador defina operações auxiliares para os demais métodos
default e estáticos públicos, sem expor tal operação. O post Java 9::MétodosPrivados em Interfaces dá mais detalhes sobre esta nova característica.
Modificações no JDK
Nos próximos dias, serão comentadas algumas das novas
características do Java Develpment Kit, tais como:
- Melhorias na Stream API
- Melhorias em Optional<T>
- Extensões do Javadoc [JEP 221, 224, 225, 261]
- Processador Nashorn [JEP 236]
- Catálogos XML [JEP 268]
- Novo cliente para HTTP 2 [JEP 110]
- Imagens multirresolução [JEP 251]
- I/O para imagens TIFF [JEP 262]
- Suporte para Unicode 7.0 e 8.0 [JEP 227, 267]
Melhorias na Stream API [post]
O Java 9 traz alguns complementos úteis para esta API, como novas fontes de dados para as streams, além de algumas novas características. Além da possibilidade de obter um stream sequencia a partir de qualquer uma das coleções, existia no Java 8 um conjunto limitado de possibilidades obtenção destas streams a partir de elementos de outros tipos externos às coleções, como por exemplo, java.io.BufferedReader.lines().
O Java 9 adiciona algumas novas fontes úteis a esse conjunto, por meio destes novos métodos:
- java.util.Scanner.tokens()
- java.util.regex.Matcher.results()
- java.util.Optional.stream()
Além disso, foram adicionados quatro novos métodos na interface java.util.stream.Stream<T> que são:
- Stream<T> takeWhile(Predicate)
- Stream<T> dropWhile(Predicate)
- Stream<T> ofNullable(T)
- Stream<T> iterate(T, Predicate< T>, UnaryOperator<T>)
Embora pareça pouco, tais métodos são bastante úteis e flexíveis, como discutido no post Java 9::Melhorias na Stream API.
Melhorias em Optional<T> [post]
Para auxiliar no tratamento da exceção NullPointerException, foi introduzido no Java 8 a classe java.util.Optional<T>. Objetos do tipo Optional são como contêineres (i.e., containers) que podem armazenar um valor de qualquer tipo T ou apenas null. A classe Optional também provê alguns métodos úteis que podem eliminar a verificação explícita da presença de null.
Na versão 9 do Java foram introduzidos métodos novos:
- public void ifPresentOrElse(Consumer<T> action, Runnable emptyAction);
- public Optional<T> or(Supplier<Optional<T>> supplier);
O primeiro método, ifPresentOrElse() verifica se um valor está presente na instância de Optional<T>, conduzindo a ação indicada com o valor, ou realizando outra para a situação de vazio (conteúdo null).
Outro método interessante é or(), cujo comportamento é o seguinte: se o valor está presente, retorna um Optional que encapsula tal valor, senão, retorna um outro Optional produzido pela função de geração tomada como argumento.
Modificações na Plataforma
A versão 9 também incorporou várias modificações em nível de plataforma, dentre elas:
- Console Java (jshell) [JEP 222]
- Sistema de modularização (conhecido como Jigsaw) [JSR 376]
- JARs multi-release [JEP 238]
- jlink [JEP 282]
- Registro unificado [JEP 158]
- Microbenchmark Suite [JEP 230]
- Atualização da Process e da Concurrency API [JEP 102 & 266]
- Coletor de lixo G1 como default [JEP 248]
jshell [post]
O jshell é uma nova e interessante ferramenta de linha de comando que corresponde a um console Java. Diferentemente dos IDEs Java, onde devemos construir classes e programas completos que devem ser compilados para poderem ser executados; no jshell é possível avaliar expressões, efetuar declarações e executar diretivas do Java, sem a necessidade de construir um projeto, um programa ou mesmo um método para seu teste.
O fato de constituir um ambiente interativo torna o jshell muito interessante para que iniciantes estudem o Java experimentando suas construções. Ao mesmo tempo é útil para programadores mais experientes, pois é um ambiente de simulação rápido e direto. Mais detalhes sobre o jshell estão no post Java 9::O Console jshell.
Jigsaw [post]
A característica mais esperada da versão 9 do Java é o resultado do projeto Jigsaw, traz um novo sistema de modularidade para plataforma Java. A modularidade é um princípio importante no projeto de software que enfatiza a criação de conjuntos de classes ou componentes que possam ser reutilizados em diferentes contextos. Até a versão 8, os arquivos JAR (Java Archives) eram a unidade básica da modularidade no Java. Os JARs são arquivos compactados contendo uma estrutura de subdiretórios, arquivos de classe Java e outros arquivos usados como recursos da aplicação.
Embora os arquivos JAR sejam capazes de agrupar classes relacionadas, sua organização possui algumas limitações, como o encapsulamento fraco e a existência de dependências explícitas entre seus elementos, além de problemas associados a presença de JARs de versões diferentes no mesmo classpath.
Embora os arquivos JAR sejam capazes de agrupar classes relacionadas, sua organização possui algumas limitações, como o encapsulamento fraco e a existência de dependências explícitas entre seus elementos, além de problemas associados a presença de JARs de versões diferentes no mesmo classpath.
Por conta disso foi criado um novo artefato, o module, que estabelece uma nova unidade de modularização, resolvendo grande parte dos problemas exibidos pelos packages, e ainda mantendo compatibilidade com aplicações de versões anteriores da plataforma. O Jigsaw é apresentado e comentado no post Java 9: Jigsaw.
jlink
O jlink é uma nova ferramenta de linha de comando que faz parte do novo sistema de modularização do Java. Seu propósito é empacotar os diversos módulos de uma aplicação, facilitando sua utilização e, principalmente, sua distribuição. A ferramenta jlink é abordada juntamente com os posts sobre o Jigsaw.
Mais à frente, comentaremos sobre outras das interessantes características adicionadas na plataforma nesta versão 9.
Considerações Finais
Depois de dissecarmos muitas das novas características da
versão 9 do Java, fica claro o seu amadurecimento. É claro que poucos
desenvolvedores utilizarão à fundo todas estas adições, concentrando-se nos
elementos mais próximos à suas áreas de atuação. Além disso, veremos críticas
sobre esta ou aquela característica, assim como elogios sobre outras, mas seria
possível garantir a satisfação de todos em relação a tudo.
O que vale mesmo, é que o Java, a cada versão, mostra seu
valor!
Nenhum comentário:
Postar um comentário