1. JDK 7 – Modificações na Linguagem
Eder Magalhães
@edermag
www.yaw.com.br
Globalcode
–
Open4education
2. Agenda
! Expectativa na evolução da Linguagem Java
! Qual o papel do OpenJDK ?
! Especificação do Java 7
! Mudanças na linguagem (Projeto Coin)
! New IO no Java 7 (NIO.2)
! Suporte a linguagens com tipagem dinâmica
! Fork/Join Framework;
! JDBC 4.1;
! Planejamento do Java 8;
Globalcode
–
Open4education
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 28/07/2011;
Globalcode
–
Open4education
4. Durante esses 5 anos
! Grande 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
fim de 2012;
Globalcode
–
Open4education
5. Qual papel do OpenJDK?
! Tornar o desenvolvimento do JDK open source
(código aberto e livre);
! Criado pela Sun em 2007;
! JDK 7 foi o segundo projeto do OpenJDK;
! Organiza a evolução do JDK em sub-projetos;
! Pode ser visto com uma opção mais agíl na
evolução do Java, em relação demora/burocrácia
do JCP;
Globalcode
–
Open4education
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
8. Separador de dígitos em literais numéricos
int i = 1_234_567_890;!
!
// isso eh esquisito...mas compila!!
Integer i1 = new Integer(12_34_56_78_90);!
Integer i2 = new Integer(1_2_3_4_5_6_7_8_9_0);
System.out.println(i == i1); // imprime true
System.out.println(i1.equals(i2)); // imprime true!
float f1 = 123_456.7_5F;!
double d1 = 12____345D;!
double d2 = 0x1.ffff_ffff_ffff_fP1_023;!
!
// isso nao compila:!
int intRuim1 = _1234;!
int intRuim2 = 1234_;!
float zuado = 123_456.75_F;!
!
Globalcode
–
Open4education
9. Literais binários
public static final int ALARME = 0b001; // o valor é 1 !
public static final int FECHADA = 0b010; // o valor é 2 !
public static final int ABERTA = 0b100; // o valor é 4 !
!
public void mostraEstado(int ultimaLeitura) { !
final int[] mascaras = {ALARME, FECHADA, ABERTA}; !
final String[] mensagens = {"alarme", "fechada", "aberta"};!
!
for (int i = 0; i < mascaras.length; i++) { !
if ((ultimaLeitura & mascaras[i]) == mascaras[i]) !
System.out.println(mensagens[i]);!
}!
}!
Globalcode
–
Open4education
10. String na condição do switch
public static void main(String[] args) {!
for (String arg : args) {!
switch(arg) {!
case "-o1”:!
System.out.println("modo de alta otimização (+lento)");!
break;!
case "-o0":!
System.out.println("modo de baixa otimização (+rápido)");!
break;!
default:!
System.err.printf("Parâmetro %s inválido. n", param);!
System.exit(-1);!
}!
}!
}!
O compilador considera comparação via hashcode!
Globalcode
–
Open4education
11. Inferência na criação de objetos com
tipos genéricos
! Desde sua introdução, construções com tipos
genéricos explícitos podem ser atribuídos à
variáveis raw type (sem generics) ou com um
wildcard:
// Java 5+!
List rawList = new ArrayList<Object>();!
List<?> wildList = new ArrayList<Object>();!
!
// consequentemente, no Java 7 c/ diamond:!
List rawList = new ArrayList<>();!
List<?> wildList = new ArrayList<>();!
Globalcode
–
Open4education
12. 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
13. 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
14. 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 instrucao a seguir nao compila! !
mapOfIntegers.put(aKey, new HashSet<>());!
Globalcode
–
Open4education
15. Simplificação na chamada de métodos
com varargs
! Considere o seguinte trecho de código:
Set<Integer> aSet = new HashSet<Integer>();!
aSet.add(100);!
aSet.add(150);!
!
List<Set<Integer>> listOfSets = Arrays.asList(aSet);!
! Esse warning é apresentado ao compilar (-Xlint) a classe:
creation of type java.util.Set<java.lang.Integer>[]
for varargs parameter List<Set<Integer>> listOfSets = Arrays.asList(aSet);
Globalcode
–
Open4education
16. Simplificação na chamada de métodos
com varargs
! Considere o seguinte trecho de código:
Set<Integer> aSet = new HashSet<Integer>();!
aSet.add(100);!
aSet.add(150);!
!
List<Set<Integer>> listOfSets = Arrays.asList(aSet);!
! Código antes compilação, com a opção –XD-printflat:
...!
List<Set<Integer>> listOfSets = Arrays.asList(new Set[]{aSet});!
Globalcode
–
Open4education
17. 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
18. 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
19. Simplificação na chamada de métodos
com varargs
! Alguns métodos do Java anotados com @SafeVarargs:
public static <T> List<T> java.util.Arrays.asList(T... A)!
!
public static <T> boolean !
java.util.Collections.addAll(Collection<? super T>, !
c, T ... Elements)!
!
public static <E extends Enum<E>> !
java.util.EnumSet<E> EnumSet.of(E first, E ... Rest)!
!
protected final void !
javax.swing.SwingWorker.publish(V ... Chunks)!
Globalcode
–
Open4education
20. 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
21. 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
22. Sem o gerenciamento automático…
public void lerArzquivo() {!
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
23. 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 !
}!
}!
Qualquer classe que implementa a interface
java.lang.AutoCloseable
pode ser gerenciada pelo try!
Globalcode
–
Open4education
24. 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
25. 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
26. Antes do 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
27. 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
28. 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
29. Rethrow opção 1
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
30. Rethrow opção 2
private Object novoObjeto(Class<?> clazz)!
throws InstantiationException, IllegalAccessException {!
try {!
Object o = clazz.newInstance();!
return o;!
} catch (InstantiationException | IllegalAccessException e) {!
System.err.println("Erro na criação do objeto");!
throw e; !
}!
}!
Globalcode
–
Open4education
31. Rethrow novo
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
32. New I/O no Java 7
! JSR 203: Nova API para New I/O (“NIO.2”):
! FileSystem, Path
! FileSystems, Files, Paths;
! FileStore;
! BasicFileAttributes;
! Novo pacote: java.nio.file
! Resolve algumas limitações da classe File:
! Manipulação de arquivo (File system);
! Suporte a links simbólicos;
Globalcode
–
Open4education
33. New I/O no Java 7 – Demo I
! Fazer backup e mover arquivo:
Path home = Paths.get(/home/usuario);!
Path foto = home.resolve(”foto.jpg);!
Path backup = home.resolve(”foto.jpg.backup);!
!
//faz a copia!
Files.copy(foto, backup);!
!
//move o arquivo!
Files.move(backup, home.resolve(”back/+backup.getFileName()));!
Globalcode
–
Open4education
34. New I/O no Java 7 – Demo II
! Iterar em arquivos de uma pasta e verificar quais
arquivos são links:
Path dir = Paths.get(/home/usuario);!
String filter = *.jpg;!
!
//busca por arquivos com extensao jpg!
DirectoryStreamPath st = Files.newDirectoryStream(dir,filter);!
!
for (Path p: st) {!
boolean isLink = Files.isSymbolicLink(p);!
System.out.println(p + (isLink ? “ (link)”:””));!
if (isLink) {!
System.out.println(“t link p/ ”+Files.readSymbolicLink(p));!
}!
}!
Globalcode
–
Open4education
35. Ainda sobre I/O: mudanças em Sockets
! API para socket endereçado a multicasting;
! Acesso assíncrono para sockets e arquivos;
! Suporte a multitarefa com sockets;
! Sockets Direct Protocol (SDP):
! Maior performance em Infiniband connections (Linux e
Solaris);
! Stream Control Transmisson Protocol;
! API especifica para Solaris;
! Suporte a (Windows) Vista Ipv6 stack;
Globalcode
–
Open4education
36. Suporte a linguagens com tipagem
dinâmica (JSR 292)
! Desde de o Java 6, outras linguagens podem ser
utilizadas na plataforma (JSR 223):
! Jython, JRuby, Groovy, Rhino;
! Problema:
! Ao invocar um método, por exemplo, a VM precisa de
todas as informações sobre tipagem no bytecode.
Mas linguagens dinâmicas não forçam uso do tipo!
Globalcode
–
Open4education
37. Suporte a linguagens com tipagem
dinâmica (JSR 292)
Exemplo Java Exemplo JavaScript
int tamanho(String p){! function tamanho() {!
return p.length();! return p.length;!
} ! }!
! O compilador JavaScript deve fazer uma pré-
compilação transformando o programa JS em
algo completamente tipado!
Globalcode
–
Open4education
38. Suporte a linguagens com tipagem
dinâmica (JSR 292)
! Solução:
! Adicionar uma instrução na VM que possibilite fazer a
chamada de métodos sem a necessidade de definir
tipos!
! invokeDynamic
Globalcode
–
Open4education
39. Fork/Join framework
! Dividir para consquitar;
! Uma nova solução para processamento paralelo;
! Framework projetado para tirar proveito de
ambientes com múltiplos processadores;
! Conceito:
if (meu fluxo de execução é pequeno o suficiente)!
processe o fluxo;!
else!
divida o fluxo em 2 fluxos menores;!
verifique a possibilidade de executar esses 2 fluxos;!
Globalcode
–
Open4education
40. 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
41. Outras melhorias
! Performance 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;
! Ajustes em dados de moeda;
! Re-organização nas formas de locale;
! Melhorias na JVM:
! Garbage;
! Convergência (ainda inicial) com projeto HotRockit;
Globalcode
–
Open4education
42. Java 8: Planejamento
! Suporte a Programação Modular;
! Projeto Jigsaw;
! Projeto Lambda;
! Funcionalidades restantes para o Projeto Coin;
! Especificação guarda-chuva: JSR 337;
Globalcode
–
Open4education