Upload
wellington-pinheiro
View
149
Download
0
Embed Size (px)
Citation preview
Project Coin: Pequenasmudanças, grandes
facilidadesMarcelo de Castro
Wellington Ricardo Pinheiro
domingo, 31 de março de 2013
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)
domingo, 31 de março de 2013
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)
domingo, 31 de março de 2013
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
domingo, 31 de março de 2013
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 }}
domingo, 31 de março de 2013
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;
domingo, 31 de março de 2013
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;
domingo, 31 de março de 2013
Literais bináriosTarefa: 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.
domingo, 31 de março de 2013
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 }
domingo, 31 de março de 2013
• 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
String na condição do switch
domingo, 31 de março de 2013
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 }
domingo, 31 de março de 2013
• 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:
Inferência na criação de objetos com tipos genéricos
// Java 5+// desencorajado, mas legalList rawList = new ArrayList<Object>();List<?> wildList = new ArrayList<Object>();
// consequentemente, no Java 7:List rawList = new ArrayList<>();List<?> wildList = new ArrayList<>();
domingo, 31 de março de 2013
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 }
domingo, 31 de março de 2013
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 }
domingo, 31 de março de 2013
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 }
domingo, 31 de março de 2013
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 }
domingo, 31 de março de 2013
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); }}
domingo, 31 de março de 2013
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); }}
creation of type java.util.Set<java.lang.Integer>[] for varargs parameter List<Set<Integer>> listOfSets = Arrays.asList(aSet);
O seguinte warning é apresentado ao compilarmos a classe:
domingo, 31 de março de 2013
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}); }}
domingo, 31 de março de 2013
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)
domingo, 31 de março de 2013
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
domingo, 31 de março de 2013
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
@SafeVarargspublic static <T> List<T> asList(T... a) { return new ArrayList<>(a); }
domingo, 31 de março de 2013
• Os métodos e construtores da plataforma anotados com @SafeVarargs são:
Simplificação na invocação de métodos varargs
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)
domingo, 31 de março de 2013
• 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
Gerenciamento automático de recursos
domingo, 31 de março de 2013
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 }
domingo, 31 de março de 2013
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 }
domingo, 31 de março de 2013
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 }
domingo, 31 de março de 2013
Gerenciamento automático de recursos
Qualquer classe que implementa a interface java.lang.AutoCloseable
pode ser “gerenciada” pelo try!
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 }
domingo, 31 de março de 2013
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
domingo, 31 de março de 2013
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); }}
domingo, 31 de março de 2013
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); } }
domingo, 31 de março de 2013
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); } }
domingo, 31 de março de 2013
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; } }
Rethrow mais preciso
domingo, 31 de março de 2013
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; } }
Rethrow mais preciso
domingo, 31 de março de 2013
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?
Rethrow mais preciso
domingo, 31 de março de 2013
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!!
Rethrow mais preciso
domingo, 31 de março de 2013
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
domingo, 31 de março de 2013
FIM
Perguntas?
Marcelo de Castro@mcastroinfo
Wellington Pinheiro@wrpinheiro
domingo, 31 de março de 2013