Algoritmo e estruturas de dados operações com matrizes
Melhorias na linguagem Java com Project Coin
1. Project Coin: Pequenas
mudanças, grandes
facilidades
Marcelo de Castro
Wellington Ricardo Pinheiro
domingo, 31 de março de 2013
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)
domingo, 31 de março de 2013
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)
domingo, 31 de março de 2013
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
domingo, 31 de março de 2013
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
}
}
domingo, 31 de março de 2013
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;
domingo, 31 de março de 2013
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;
domingo, 31 de março de 2013
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.
domingo, 31 de março de 2013
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 }
domingo, 31 de março de 2013
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
domingo, 31 de março de 2013
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 }
domingo, 31 de março de 2013
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<>();
domingo, 31 de março de 2013
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 }
domingo, 31 de março de 2013
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 }
domingo, 31 de março de 2013
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 }
domingo, 31 de março de 2013
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 }
domingo, 31 de março de 2013
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);
}
}
domingo, 31 de março de 2013
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);
domingo, 31 de março de 2013
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});
}
}
domingo, 31 de março de 2013
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)
domingo, 31 de março de 2013
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
domingo, 31 de março de 2013
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);
}
domingo, 31 de março de 2013
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)
domingo, 31 de março de 2013
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
domingo, 31 de março de 2013
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 }
domingo, 31 de março de 2013
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 }
domingo, 31 de março de 2013
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 }
domingo, 31 de março de 2013
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!
domingo, 31 de março de 2013
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
domingo, 31 de março de 2013
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);
}
}
domingo, 31 de março de 2013
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);
}
}
domingo, 31 de março de 2013
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);
}
}
domingo, 31 de março de 2013
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;
}
}
domingo, 31 de março de 2013
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;
}
}
domingo, 31 de março de 2013
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?
domingo, 31 de março de 2013
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!!
domingo, 31 de março de 2013
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
domingo, 31 de março de 2013
38. FIM
Perguntas?
Marcelo de Castro
@mcastroinfo
Wellington Pinheiro
@wrpinheiro
domingo, 31 de março de 2013