O documento discute as principais mudanças nas versões Java 7 e Java 8, incluindo:
1) Melhorias na linguagem Java como separadores de dígitos em literais numéricos e string no switch;
2) Novas funcionalidades na API como o gerenciamento automático de recursos e o NIO.2;
3) O projeto Coin para simplificar a linguagem e o Jigsaw para modularização no Java 8.
1. 2012
As modificações na linguagem:
Java 7 e 8
Eder Magalhães
@edermag
www.yaw.com.br
Globalcode
–
Open4education
Saturday, May 19, 12
2. Agenda
Expectativa na evolução da Linguagem Java
Dolphin: o Java 7
Mudanças na linguagem: Projeto Coin
New IO no Java 7 (NIO.2)
JDBC 4.1;
Outras características do Java 7;
Conclusão do plano B: Java 8;
Type Annotations + Jigsaw + Lambda;
Links
Globalcode
–
Open4education
Saturday, May 19, 12
3. Histórico
Última versão com mudanças na linguagem:
Java 5 (Tiger) – 30/09/2004;
Java 6 (Mustang) foi disponibilizado em 11/12/2006;
Java 7 (Dolphin) começou em 08/2006 e foi
disponibilizado em 07/2011;
Globalcode
–
Open4education
Saturday, May 19, 12
4. Durante esses 5 anos
Expectativa por novas funcionalidades;
Oracle adquire a Sun;
Novo planejamento de entrega:
Plano A:
JDK 7 completo com previsão para 2012;
Plano B:
JDK 7 com algumas features com previsão para 2011;
JDK 8 com funcionalidades complementares com previsão para o
final de 2012;
Globalcode
–
Open4education
Saturday, May 19, 12
5. Dolphin, o Java 7 !
Globalcode
–
Open4education
Saturday, May 19, 12
6. Java 7 (JSR 336)
Melhorias:
Linguagem;
Virtual Machine;
Class loader;
I/O, Rede e Concorrência;
JDBC;
Swing;
Web;
Javadoc;
Globalcode
–
Open4education
Saturday, May 19, 12
7. Projeto Coin
Implementa a especificação JSR 334;
O objetivo do projeto é prover melhorias para a
linguagem Java;
Reduz, um pouco, a verbosidade da linguagem;
Subprojeto do OpenJDK;
Globalcode
–
Open4education
Saturday, May 19, 12
8. Separador de dígitos e literal binária
// isso é esquisito... mas compila!
int i = 1_234_567_890;
Integer i1 = new Integer(12_34_56_78_90);
float f1 = 123_456.7_5F;
double d1 = 12____345D;
double d2 = 0x1.ffff_ffff_ffff_fP1_023;
// isso não compila:
int intRuim1 = _1234, intRuim2 = 1234_;
float outroRuim = 123_456.75_F;
// literal binária:
int x = 0b001; // o valor é 1
int y = 0b010; // o valor é 2
Globalcode
–
Open4education
Saturday, May 19, 12
9. String na condição do switch
public static void main(String[] args) {
String msg = "oi";
switch(msg) {
case "oi":
System.out.println("Ola, bem vindo");
break;
case "tchau":
System.out.println("Tchau, ate mais");
break;
default:
System.out.println("mal educado...");
}
}
O compilador realiza a comparação pelo hashcode!
Globalcode
–
Open4education
Saturday, May 19, 12
10. Tipos genéricos sem operador Diamond
Map<Integer, Set<Integer>> mapOfIntegers =
new HashMap<Integer, Set<Integer>>();
Integer aKey = 10;
Set<Integer> aSet = new HashSet<Integer>();
mapOfIntegers.put(aKey, aSet);
Globalcode
–
Open4education
Saturday, May 19, 12
11. Tipos genéricos com operador Diamond
Map<Integer, Set<Integer>> mapOfIntegers = new HashMap<>();
Integer aKey = 10;
Set<Integer> aSet = new HashSet<>();
mapOfIntegers.put(aKey, aSet);
Globalcode
–
Open4education
Saturday, May 19, 12
12. Tipos genéricos com operador Diamond
Map<Integer, Set<Integer>> mapOfIntegers = new HashMap<>();
Integer aKey = 10;
Set<Integer> aSet;
mapOfIntegers.put(aKey, aSet = new HashSet<>());
// a instrução a seguir não compila!
mapOfIntegers.put(aKey, new HashSet<>());
Globalcode
–
Open4education
Saturday, May 19, 12
13. Simplificação na chamada de métodos
com varargs
Método asList da classe Arrays:
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
O warning é gerado para qualquer método com esse tipo
de assinatura:
<T> Tipo<T> nomeDoMetodo(T... params)
Globalcode
–
Open4education
Saturday, May 19, 12
14. Simplificação na chamada de métodos
com varargs
Solução: criar uma forma de informar o compilador que a
chamada ao método asList não corre risco de problemas
com tipo de dado!
@SafeVarargs
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
Globalcode
–
Open4education
Saturday, May 19, 12
15. Gerenciamento automático de recursos
Nova interface java.lang.AutoCloseable;
Bibliotecas adaptadas para implementar essa
nova interface;
Mudanças em java.lang.Throwable:
Novo construtor;
Dois novos métodos;
Globalcode
–
Open4education
Saturday, May 19, 12
16. Sem o gerenciamento automático…
public void lerArquivo() {
FileReader reader = null;
try {
reader = new FileReader("arquivo");
// faz o processamento do arquivo
} catch (IOException e) {
// trata a exceção
} finally {
if(reader != null) {
try {
reader.close();
} catch (IOException e) {
// tenta fazer alguma outra coisa aqui!
}
}
}
}
Globalcode
–
Open4education
Saturday, May 19, 12
17. Sem o gerenciamento automático...
public void lerArquivo() {
FileReader reader = null;
try {
reader = new FileReader("arquivo");
// faz o processamento do arquivo
} catch (IOException e) {
// trata a exceção
} finally {
if(reader != null) {
try {
reader.close();
} catch (IOException e) {
// tenta fazer alguma outra coisa aqui!
}
}
}
}
Globalcode
–
Open4education
Saturday, May 19, 12
18. Com o gerenciamento automático!
public void lerArquivo() {
try (FileReader reader = new FileReader("arquivo”)) {
// faz o processamento do arquivo
} catch (IOException e) {
// trata a exceção
}
}
Globalcode
–
Open4education
Saturday, May 19, 12
19. Gerenciamento automático de recursos
Throwable passa a suportar exceções
suprimidas:
protected Throwable(String message,
Throwable cause,
boolean enableSuppresion,
boolean writableStackTrace)
public final void addSuppressed(Throwable exception)
public final Throwable[] getSuppressed()
Globalcode
–
Open4education
Saturday, May 19, 12
20. Multicatch
A cláusula catch está habilitada para uma série
de tipos exceções separadas pelo operador
“OR”, símbolo “|”, na declaração do paramêtro
(tipo da exceção);
Dessa forma diferentes tipos de exceções podem
ser tratados da mesma forma;
Globalcode
–
Open4education
Saturday, May 19, 12
21. Sem o Multicatch
private Object novoObjeto(Class<?> clazz) {
try {
Object o = clazz.newInstance();
return o;
} catch (InstantiationException e) {
System.err.println("Erro na criação do objeto");
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
System.err.println("Erro na criação do objeto");
throw new RuntimeException(e);
}
}
Globalcode
–
Open4education
Saturday, May 19, 12
22. Com Multicatch
private Object novoObjeto(Class<?> clazz) {
try {
Object o = clazz.newInstance();
return o;
} catch (InstantiationException | IllegalAccessException e) {
System.err.println("Erro na criação do objeto");
throw new RuntimeException(e);
}
}
Globalcode
–
Open4education
Saturday, May 19, 12
23. Rethrow
Se o parâmetro de uma exceção não for
modificado e for relançado dentro do bloco catch,
o compilador aplica uma análise mais precisa dos
tipos que podem ser lançados;
Globalcode
–
Open4education
Saturday, May 19, 12
24. Rethrow específico
private Object novoObjeto(Class<?> clazz)
throws InstantiationException, IllegalAccessException {
try {
Object o = clazz.newInstance();
return o;
} catch (Exception e) {
System.err.println("Erro na criação do objeto");
throw e;
}
}
Globalcode
–
Open4education
Saturday, May 19, 12
25. Novidades na API do Java 7
Globalcode
–
Open4education
Saturday, May 19, 12
26. Novidades na API do Java 7
Globalcode
–
Open4education
Saturday, May 19, 12
27. New I/O do Java 7
JSR 203: Nova API para New I/O (“NIO.2”):
FileSystem, Path
FileSystems, Files, Paths;
FileStore;
BasicFileAttributes;
Melhorias na infra-estrutura I/O:
Acesso assíncrono a sockets e arquivos;
API para socket endereçado a multicasting;
Suporte a multitarefa com sockets;
Globalcode
–
Open4education
Saturday, May 19, 12
28. NIO.2: API de I/O + eficaz
Path home = Paths.get("/home/yaw");
Path foto = home.resolve("foto.jpg");
Path backup = home.resolve("foto_backup.jpg");
//backup de um aquivo
Files.copy(foto, backup);
//move o arquivo para outro diretório
Path destino = Paths.get("/home/yaw/backup");
Files.move(backup, destino.resolve(backup.getFileName()));
//lista e imprime o conteúdo do diretório
DirectoryStream<Path> stream = Files.newDirectoryStream(home);
for (Path p : stream) {
System.out.println("t -" + p );
}
Globalcode
–
Open4education
Saturday, May 19, 12
29. JDBC 4.1
Suporte a AutoCloseable;
Nova interface: RowSetProvider;
String query = "select nome, cpf from pessoa";
try (Connection con = DriverManager.getConnection(...);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query)) {
while (rs.next()) {
String nome = rs.getString("nome");
String cpf = rs.getString("cpf");
System.out.printf("Nome:%st Cpf:%s %n", nome, cpf);
}
}
Globalcode
–
Open4education
Saturday, May 19, 12
30. Outras melhorias
Fork/Join framework (JSR 166)
Melhorias em alguns componentes Swing;
Ajustes na arquitetura do Class loader;
Javadoc com visual mais interessante;
Internacionalização:
Suporte a Unicode 6.0, IETF BCP47 e UTR35;
Re-organização nas formas de locale;
Melhorias na JVM:
Invoke Dynamic (JSR 292);
G1: Garbage First;
Globalcode
–
Open4education
Saturday, May 19, 12
31. Atualizações recentes do Java 7
JDK 7 update 4
Kit do Java 7 disponível para Mac OS;
Termino da fusão entre JRockit e HotSpot;
Globalcode
–
Open4education
Saturday, May 19, 12
32. Fechando o plano B: Java 8!
Globalcode
–
Open4education
Saturday, May 19, 12
33. Fechando o plano B: Java 8!
Globalcode
–
Open4education
Saturday, May 19, 12
34. Java 8 (JSR 338)
Conclusão do Projeto Coin;
Nova API para datas no Java;
Type Annotations;
Projeto Jigsaw: suporte a definição de módulos;
Projeto Lambda: uma linguagem mais eficiente;
Globalcode
–
Open4education
Saturday, May 19, 12
35. Type Annotations (JSR 308)
Utilizar anotações em outros trechos do código;
Criar um mecanismo eficiente com regras e
validação de tipos do Java baseado em
anotações. A evolução da idéia implementada
com @Override;
Globalcode
–
Open4education
Saturday, May 19, 12
37. Projeto Jigsaw
Suporte a modularização da linguagem Java;
Tornar o modelo de distribuição e execução do
Java mais eficaz;
Cada módulo:
é formado por conjunto de classes e interfaces;
pode determinar sua versão;
mantém arquivos de configurações/recursos;
indica dependência a outros módulos, se
existir;
Globalcode
–
Open4education
Saturday, May 19, 12
39. Projeto Lambda (JSR 335)
O Java mais poderoso em ambientes multi-core;
Emprega ao Java um modelo de programação
funcional;
Definição de funções anônimas;
Permite a referência a métodos;
Interfaces com default methods;
SAM são consideradas interfaces funcionais;
Mudanças na bibliotecas do Java (Collection)
para se adequar ao Lambda;
Globalcode
–
Open4education
Saturday, May 19, 12
42. Rumores sobre o Java 9
VM auto ajustável (self tuning);
Suporte a Big Data;
Reificação dos tipos genéricos;
Criar um protocolo de meta-objetos para
comunicação com outras linguagens;
Suporte a continuations;
Globalcode
–
Open4education
Saturday, May 19, 12
43. Rumores sobre o Java 9
VM auto ajustável (self tuning);
Suporte a Big Data;
Reificação dos tipos genéricos;
Criar um protocolo de meta-objetos para
comunicação com outras linguagens;
Suporte a continuations;
Globalcode
–
Open4education
Saturday, May 19, 12
44. Blog
http://blog.globalcode.com.br/search/label/java
Vídeos
http://www.yaw.com.br/screencast/tag/JDK7/
Minicurso
http://www.globalcode.com.br/gratuitos/minicursos/
minicurso-JDK7-modificacoes-na-linguagem
Projeto com exemplos
https://github.com/edermag/jdk7.minicurso/
#open4education
Globalcode
–
Open4education
Saturday, May 19, 12