Project coin pequenas mudanças grandes facilidades

38
Project Coin: Pequenas mudanças, grandes facilidades Marcelo de Castro Wellington Ricardo Pinheiro quarta-feira, 24 de agosto de 2011

Transcript of Project coin pequenas mudanças grandes facilidades

Page 1: Project coin pequenas mudanças grandes facilidades

Project Coin: Pequenasmudanças, grandes

facilidadesMarcelo de Castro

Wellington Ricardo Pinheiro

quarta-feira, 24 de agosto de 2011

Page 2: Project coin pequenas mudanças grandes facilidades

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

Page 3: Project coin pequenas mudanças grandes facilidades

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

Page 4: Project coin pequenas mudanças grandes facilidades

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

Page 5: Project coin pequenas mudanças grandes facilidades

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

Page 6: Project coin pequenas mudanças grandes facilidades

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

Page 7: Project coin pequenas mudanças grandes facilidades

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

Page 8: Project coin pequenas mudanças grandes facilidades

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.

quarta-feira, 24 de agosto de 2011

Page 9: Project coin pequenas mudanças grandes facilidades

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

Page 10: Project coin pequenas mudanças grandes facilidades

• 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

quarta-feira, 24 de agosto de 2011

Page 11: Project coin pequenas mudanças grandes facilidades

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

Page 12: Project coin pequenas mudanças grandes facilidades

• 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<>();

quarta-feira, 24 de agosto de 2011

Page 13: Project coin pequenas mudanças grandes facilidades

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

Page 14: Project coin pequenas mudanças grandes facilidades

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

Page 15: Project coin pequenas mudanças grandes facilidades

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

Page 16: Project coin pequenas mudanças grandes facilidades

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

Page 17: Project coin pequenas mudanças grandes facilidades

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

Page 18: Project coin pequenas mudanças grandes facilidades

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:

quarta-feira, 24 de agosto de 2011

Page 19: Project coin pequenas mudanças grandes facilidades

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

Page 20: Project coin pequenas mudanças grandes facilidades

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

Page 21: Project coin pequenas mudanças grandes facilidades

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

Page 22: Project coin pequenas mudanças grandes facilidades

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); }

quarta-feira, 24 de agosto de 2011

Page 23: Project coin pequenas mudanças grandes facilidades

• 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)

quarta-feira, 24 de agosto de 2011

Page 24: Project coin pequenas mudanças grandes facilidades

• 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

quarta-feira, 24 de agosto de 2011

Page 25: Project coin pequenas mudanças grandes facilidades

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

Page 26: Project coin pequenas mudanças grandes facilidades

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

Page 27: Project coin pequenas mudanças grandes facilidades

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

Page 28: Project coin pequenas mudanças grandes facilidades

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 }

quarta-feira, 24 de agosto de 2011

Page 29: Project coin pequenas mudanças grandes facilidades

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

Page 30: Project coin pequenas mudanças grandes facilidades

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

Page 31: Project coin pequenas mudanças grandes facilidades

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

Page 32: Project coin pequenas mudanças grandes facilidades

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

Page 33: Project coin pequenas mudanças grandes facilidades

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

quarta-feira, 24 de agosto de 2011

Page 34: Project coin pequenas mudanças grandes facilidades

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

quarta-feira, 24 de agosto de 2011

Page 35: Project coin pequenas mudanças grandes facilidades

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

quarta-feira, 24 de agosto de 2011

Page 36: Project coin pequenas mudanças grandes facilidades

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

quarta-feira, 24 de agosto de 2011

Page 37: Project coin pequenas mudanças grandes facilidades

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

Page 38: Project coin pequenas mudanças grandes facilidades

FIM

Perguntas?

Marcelo de Castro@mcastroinfo

Wellington Pinheiro@wrpinheiro

quarta-feira, 24 de agosto de 2011