Apresentação realizada no dia 07/07/2011 no TDC 2011, com o objetivo de mostrar como as pequenas alterações na linguagem implementadas no JDK7, definidas na JSR 334 (Project Coin), podem facilitar a vida do desenvolvedor.
Project coin pequenas mudanças grandes facilidades
1. Project Coin: Pequenas
mudanças, grandes
facilidades
Marcelo de Castro
Wellington Ricardo Pinheiro
quarta-feira, 24 de agosto de 2011
2. Melhorias na Linguagem Java
• Máquina Virtual
• Linguagem (sintaxe e semântica)
• Class Loader
• Internacionalização
• I/O e Rede
• Segurança e Criptografia
• JDBC
• Camada Cliente
• Gerenciamento (JMX e MBeans)
quarta-feira, 24 de agosto de 2011
3. Melhorias na Linguagem Java
• Máquina Virtual
• Linguagem (sintaxe e semântica)
• Class Loader
• Internacionalização
• I/O e Rede
• Segurança e Criptografia
• JDBC
• Camada Cliente
• Gerenciamento (JMX e MBeans)
quarta-feira, 24 de agosto de 2011
4. Melhorias na Linguagem Java
(sintaxe e semântica)
• JSR 334: Small Enhancements to the JavaTM
Programming Language
• Especificação do projeto Coin (subprojeto
do OpenJDK)
• O objetivo do projeto é prover melhorias
para a linguagem Java
quarta-feira, 24 de agosto de 2011
5. Separador de dígitos em
literais numéricos
public class SeparadorDigitos {
public static void main(String[] args) {
int i = 1_234_567_890;
// isso é medonho...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
}
}
quarta-feira, 24 de agosto de 2011
6. Separador de dígitos em
literais numéricos
Também é possível fazer isso:
float f1 = 123_456.7_5F;
double d1 = 12____345D;
double d2 = 0x1.ffff_ffff_ffff_fP1_023;
quarta-feira, 24 de agosto de 2011
7. Separador de dígitos em
literais numéricos
Também é possível fazer isso:
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;
int intRuim2 = 1234_;
float zuado = 123_456.75_F;
quarta-feira, 24 de agosto de 2011
8. Literais binários
Tarefa: Construir um método para imprimir os estados de uma
válvula, que podem ser:
001 Alarme
010 Fechada
100 Aberta
o método recebe como entrada um inteiro com obtido na última
leitura e deverão ser verificados quais os bits de estado estão com
o valor 1.
quarta-feira, 24 de agosto de 2011
9. Literais binários
1 public static final int ALARME = 0b001; // o valor é 1
2 public static final int FECHADA = 0b010; // o valor é 2
3 public static final int ABERTA = 0b100; // o valor é 4
4 public void mostraEstado(int ultimaLeitura) {
5 final int[] mascaras = {ALARME, FECHADA, ABERTA};
6 final String[] mensagens = {"alarme", "fechada", "aberta"};
7 for (int i = 0; i < mascaras.length; i++) {
8 if ((ultimaLeitura & mascaras[i]) == mascaras[i])
9 System.out.print(mensagens[i] + " ");
10 }
11 System.out.println();
12 }
quarta-feira, 24 de agosto de 2011
10. String na condição do switch
• Os compiladores são responsáveis por
traduzir um switch de strings em bytecode
com a semântica adequada
• Suporte direto a strings no switch pode ser
adicionado em uma futura versão da
plataforma
quarta-feira, 24 de agosto de 2011
11. String na condição do switch
1 public static void main(String[] args) {
2 for (String arg : args) {
3 switch(arg) {
4 case "-o1":
5 System.out.println("modo de alta otimização (+lento)");
6 break;
7 case "-o0":
8 System.out.println("modo de baixa otimização (+rápido)");
9 break;
10 default:
11 System.err.printf("Parâmetro %s inválido. n", param);
12 System.exit(-1);
13 }
14 }
15 }
quarta-feira, 24 de agosto de 2011
12. Inferência na criação de
objetos com tipos genéricos
• Desde a introdução dos tipos genéricos,
construções com tipos genéricos explícitos podem
ser atribuídos à variáveis raw type (sem generics)
ou com um wildcard:
// Java 5+
// desencorajado, mas legal
List rawList = new ArrayList<Object>();
List<?> wildList = new ArrayList<Object>();
// consequentemente, no Java 7:
List rawList = new ArrayList<>();
List<?> wildList = new ArrayList<>();
quarta-feira, 24 de agosto de 2011
13. Inferência na criação de
objetos com tipos genéricos
1 public class InferenciaCriacao {
2 public static void main(String[] args) {
3 Map<Integer, Set<Integer>> mapOfIntegers =
4 new HashMap<Integer, Set<Integer>>();
5 Integer aKey = 10;
6 Set<Integer> aSet = new HashSet<Integer>();
7 mapOfIntegers.put(aKey, aSet);
8 }
9 }
quarta-feira, 24 de agosto de 2011
14. Inferência na criação de
objetos com tipos genéricos
1 public class InferenciaCriacao {
2 public static void main(String[] args) {
3 Map<Integer, Set<Integer>> mapOfIntegers =
4 new HashMap<>();
5 Integer aKey = 10;
6 Set<Integer> aSet = new HashSet<>();
7 mapOfIntegers.put(aKey, aSet);
8 }
9 }
quarta-feira, 24 de agosto de 2011
15. Inferência na criação de
objetos com tipos genéricos
1 public class InferenciaCriacao {
2 public static void main(String[] args) {
3 Map<Integer, Set<Integer>> mapOfIntegers =
4 new HashMap<>();
5 Integer aKey = 10;
6 Set<Integer> aSet = new HashSet<>();
7 mapOfIntegers.put(aKey, aSet);
8 }
9 }
quarta-feira, 24 de agosto de 2011
16. Inferência na criação de
objetos com tipos genéricos
1 public class InferenciaCriacao {
2 public static void main(String[] args) {
3 Map<Integer, Set<Integer>> mapOfIntegers =
4 new HashMap<>();
5 Integer aKey = 10;
6 Set<Integer> aSet;
7 mapOfIntegers.put(aKey, aSet = new HashSet<>());
8 }
9 }
quarta-feira, 24 de agosto de 2011
17. Simplificação na invocação
de métodos varargs
public class TesteVarargs {
public static void main(String[] args) {
Set<Integer> aSet = new HashSet<Integer>();
List<Set<Integer>> listOfSets = Arrays.asList(aSet);
}
}
quarta-feira, 24 de agosto de 2011
18. Simplificação na invocação
de métodos varargs
public class TesteVarargs {
public static void main(String[] args) {
Set<Integer> aSet = new HashSet<Integer>();
List<Set<Integer>> listOfSets = Arrays.asList(aSet);
}
}
O seguinte warning é apresentado ao compilarmos a classe:
creation of type java.util.Set<java.lang.Integer>[] for varargs parameter
List<Set<Integer>> listOfSets = Arrays.asList(aSet);
quarta-feira, 24 de agosto de 2011
19. Simplificação na invocação
de métodos varargs
public class TesteVarargs {
public static void main(String[] args) {
Set<Integer> aSet = new HashSet<Integer>();
List<Set<Integer>> listOfSets = Arrays.asList(aSet);
}
}
Compilando o programa com a opção -XD-printflat
public class TesteVarargs {
public static void main(String[] args) {
Set aSet = new HashSet();
List listOfSets = Arrays.asList(new Set[]{aSet});
}
}
quarta-feira, 24 de agosto de 2011
20. Simplificação na invocação
de métodos varargs
Método asList da classe Arrays
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
Mas esse warning é gerado na chamada de qualquer
método com assinatura do tipo:
<T> Tipo<T> metodo(T... params)
quarta-feira, 24 de agosto de 2011
21. Simplificação na invocação
de métodos varargs
A solução para o problema é criar uma forma de
informar ao compilador que a chamada ao método
asList não corre o risco de dar problemas
quarta-feira, 24 de agosto de 2011
22. Simplificação na invocação
de métodos varargs
A solução para o problema é criar uma forma de
informar ao compilador que a chamada ao método
asList não corre o risco de dar problemas
@SafeVarargs
@SafeVarargs
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
quarta-feira, 24 de agosto de 2011
23. Simplificação na invocação
de métodos varargs
• Os métodos e construtores da plataforma
anotados com @SafeVarargs são:
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)
quarta-feira, 24 de agosto de 2011
24. Gerenciamento automático
de recursos
• Criação da nova interface
java.lang.AutoCloseable
• Bibliotecas adaptadas para implementar a
nova interface
• java.lang.Throwable, um novo construtor e
dois novos métodos, para facilitar o
gerenciamento de exceções suprimidas
quarta-feira, 24 de agosto de 2011
25. Gerenciamento automático
de recursos
1 public void lerArquivo() {
2 FileReader reader = null;
3 try {
4 reader = new FileReader("arquivo");
5 // faz o processamento do arquivo
6 } catch (IOException e) {
7 // trata a exceção
8 } finally {
9 if(reader != null) {
10 try {
11 reader.close();
12 } catch (IOException e) {
13 // tenta fazer alguma outra coisa aqui!
14 }
15 }
16 }
17 }
quarta-feira, 24 de agosto de 2011
26. Gerenciamento automático
de recursos
1 public void lerArquivo() {
2 FileReader reader = null;
3 try {
4 reader = new FileReader("arquivo");
5 // faz o processamento do arquivo
6 } catch (IOException e) {
7 // trata a exceção
8 } finally {
9 if(reader != null) {
10 try {
11 reader.close();
12 } catch (IOException e) {
13 // tenta fazer alguma outra coisa aqui!
14 }
15 }
16 }
17 }
quarta-feira, 24 de agosto de 2011
27. Gerenciamento automático
de recursos
1 public void lerArquivo() {
2
3 try(FileReader reader = new FileReader("arquivo")) {
4
5 // faz o processamento do arquivo
6 } catch (IOException e) {
7 // trata a exceção
8 }
9 }
quarta-feira, 24 de agosto de 2011
28. Gerenciamento automático
de recursos
1 public void lerArquivo() {
2
3 try(FileReader reader = new FileReader("arquivo")) {
4
5 // faz o processamento do arquivo
6 } catch (IOException e) {
7 // trata a exceção
8 }
9 }
Qualquer classe que implementa a interface
java.lang.AutoCloseable
pode ser “gerenciada” pelo try!
quarta-feira, 24 de agosto de 2011
29. Multicatch e Rethrow
mais preciso
• A cláusula catch está habilitada para uma
série de tipos exceções separadas pelo
operador “OR”, símbolo “|”, na declaração
do parâmetro
• 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
quarta-feira, 24 de agosto de 2011
30. Multicatch
private Object instantiate(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);
}
}
quarta-feira, 24 de agosto de 2011
31. Multicatch
private Object instantiate(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);
}
}
quarta-feira, 24 de agosto de 2011
32. Rethrow mais preciso
private Object instantiate(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);
}
}
quarta-feira, 24 de agosto de 2011
33. Rethrow mais preciso
private Object instantiate(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;
}
}
quarta-feira, 24 de agosto de 2011
34. Rethrow mais preciso
private Object instantiate(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;
}
}
quarta-feira, 24 de agosto de 2011
35. Rethrow mais preciso
private Object instantiate(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;
}
}
Isso compila?
quarta-feira, 24 de agosto de 2011
36. Rethrow mais preciso
private Object instantiate(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;
}
}
Isso compila?
No Java 6 não compila!!
No Java 7 compila!!
quarta-feira, 24 de agosto de 2011
37. Conclusões
• Com a nova versão do Java pretende-se
reduzir a verbosidade da linguagem
• Após o lançamento do Java 7, é sua vez de
testar!! Baixe a versão e divirta-se
quarta-feira, 24 de agosto de 2011
38. FIM
Perguntas?
Marcelo de Castro
@mcastroinfo
Wellington Pinheiro
@wrpinheiro
quarta-feira, 24 de agosto de 2011