JDK 7 – Modificações na Linguagem           Eder Magalhães             @edermag           www.yaw.com.br                  ...
Agenda!     Expectativa na evolução da Linguagem Java!     Qual o papel do OpenJDK ?!     Especificação do Java 7!     Mud...
Histórico!   Última versão com mudanças na linguagem:  !   Java 5 (Tiger) – 30/09/2004;!   Java 6 (Mustang) foi disponibil...
Durante esses 5 anos!   Grande expectativa por novas funcionalidades;!   Oracle adquire a Sun;!   Novo planejamento de ent...
Qual papel do OpenJDK?!   Tornar o desenvolvimento do JDK open source    (código aberto e livre);!   Criado pela Sun em 20...
JSR 336 – Especificação do Java 7!   Melhorias:   !     Linguagem;   !     Virtual Machine;   !     Class loader;   !     ...
Projeto Coin !   Implementa a especificação JSR 334; !   O objetivo do projeto é prover melhorias para a     linguagem Jav...
Separador de dígitos em literais numéricos  int i = 1_234_567_890;!  !  // isso eh esquisito...mas compila!!  Integer i1 =...
Literais bináriospublic static final int ALARME = 0b001; // o valor é 1 !public static final int FECHADA = 0b010; // o val...
String na condição do switchpublic static void main(String[] args) {!   for (String arg : args) {!      switch(arg) {!    ...
Inferência na criação de objetos comtipos genéricos !   Desde sua introdução, construções com tipos     genéricos explícit...
Tipos genéricos sem operador Diamond Map<Integer, Set<Integer>> mapOfIntegers = !   new HashMap<Integer, Set<Integer>>();!...
Tipos genéricos com operador Diamond Map<Integer, Set<Integer>> mapOfIntegers = new HashMap<>();! ! Integer aKey = 10;! Se...
Tipos genéricos com operador Diamond Map<Integer, Set<Integer>> mapOfIntegers = new HashMap<>();! ! Integer aKey = 10;! Se...
Simplificação na chamada de métodoscom varargs !   Considere o seguinte trecho de código: Set<Integer> aSet = new HashSet<...
Simplificação na chamada de métodoscom varargs  !   Considere o seguinte trecho de código: Set<Integer> aSet = new HashSet...
Simplificação na chamada de métodoscom varargs !   Método asList da classe Arrays: public static <T> List<T> asList(T... a...
Simplificação na chamada de métodoscom varargs !   Solução: criar uma forma de informar o compilador que a     chamada ao ...
Simplificação na chamada de métodoscom varargs !   Alguns métodos do Java anotados com @SafeVarargs: public static <T> Lis...
Gerenciamento automático de recursos !   Nova interface java.lang.AutoCloseable; !   Bibliotecas adaptadas para implementa...
Sem o gerenciamento automático… public void lerArquivo() {!    FileReader reader = null;!    try {!       reader = new Fil...
Sem o gerenciamento automático… public void lerArzquivo() {!    FileReader reader = null;!    try {!       reader = new Fi...
Com o gerenciamento automático public void lerArquivo() {! !    try (FileReader reader = new FileReader("arquivo”)) {!    ...
Gerenciamento automático de recursos !   Throwable passa a suportar exceções     suprimidas: protected Throwable(String me...
Multicatch !   A cláusula catch está habilitada para uma série     de tipos exceções separadas pelo operador     “OR”, sím...
Antes do Multicatch private Object novoObjeto(Class<?> clazz) {!    try {!       Object o = clazz.newInstance();!       re...
Com Multicatch private Object novoObjeto(Class<?> clazz) {!    try {!       Object o = clazz.newInstance();!       return ...
Rethrow !   Se o parâmetro de uma exceção não for     modificado e for relançado dentro do bloco catch,     o compilador a...
Rethrow opção 1 private Object novoObjeto(Class<?> clazz) {!    try {!       Object o = clazz.newInstance();!       return...
Rethrow opção 2 private Object novoObjeto(Class<?> clazz)! throws InstantiationException, IllegalAccessException {!    try...
Rethrow novo private Object novoObjeto(Class<?> clazz)! throws InstantiationException, IllegalAccessException {!    try {!...
New I/O no Java 7 !   JSR 203: Nova API para New I/O (“NIO.2”):   !     FileSystem, Path   !     FileSystems, Files, Paths...
New I/O no Java 7 – Demo I !   Fazer backup e mover arquivo: Path home = Paths.get(/home/usuario);!    Path foto = home.re...
New I/O no Java 7 – Demo II !   Iterar em arquivos de uma pasta e verificar quais     arquivos são links: Path dir = Paths...
Ainda sobre I/O: mudanças em Sockets !     API para socket endereçado a multicasting; !     Acesso assíncrono para sockets...
Suporte a linguagens com tipagemdinâmica (JSR 292) ! Desde de o Java 6, outras linguagens podem ser   utilizadas na plataf...
Suporte a linguagens com tipagemdinâmica (JSR 292)       Exemplo Java            Exemplo JavaScript    int tamanho(String ...
Suporte a linguagens com tipagemdinâmica (JSR 292) ! Solução:   ! Adicionar uma instrução na VM que possibilite fazer a   ...
Fork/Join framework !   Dividir para consquitar; !   Uma nova solução para processamento paralelo; !   Framework projetado...
JDBC 4.1 !   Suporte a AutoCloseable; !   Nova interface: RowSetProvider; String query = select nome, cpf from pessoa;!   ...
Outras melhorias !     Performance em alguns componentes Swing; !     Ajustes na arquitetura do Class loader; !     Javado...
Java 8: Planejamento !     Suporte a Programação Modular; !     Projeto Jigsaw; !     Projeto Lambda; !     Funcionalidade...
Links ! http://openjdk.java.net/ ! http://openjdk.java.net/projects/jdk7/features/ ! http://java.sun.com/developer/technic...
Obrigado !eder@yaw.com.br   @edermag                  Globalcode	  –	  Open4education
Upcoming SlideShare
Loading in …5
×

Java7 tdc2011

4,619 views

Published on

Apresentação com as novidades do Java 7 no #TDC2011 em Florianópolis

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,619
On SlideShare
0
From Embeds
0
Number of Embeds
639
Actions
Shares
0
Downloads
221
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Java7 tdc2011

  1. 1. JDK 7 – Modificações na Linguagem Eder Magalhães @edermag www.yaw.com.br Globalcode  –  Open4education
  2. 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. 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. 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. 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
  6. 6. JSR 336 – Especificação do Java 7!   Melhorias: !   Linguagem; !   Virtual Machine; !   Class loader; !   I/O, Rede e Concorrência; !   JDBC; !   Swing; !   Web; !   Javadoc; Globalcode  –  Open4education
  7. 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. 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. 9. Literais bináriospublic 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. 10. String na condição do switchpublic 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. 11. Inferência na criação de objetos comtipos 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. 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. 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. 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. 15. Simplificação na chamada de métodoscom 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. 16. Simplificação na chamada de métodoscom 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. 17. Simplificação na chamada de métodoscom 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. 18. Simplificação na chamada de métodoscom 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. 19. Simplificação na chamada de métodoscom 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 36. Suporte a linguagens com tipagemdinâ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. 37. Suporte a linguagens com tipagemdinâ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. 38. Suporte a linguagens com tipagemdinâ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. 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. 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. 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. 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
  43. 43. Links ! http://openjdk.java.net/ ! http://openjdk.java.net/projects/jdk7/features/ ! http://java.sun.com/developer/technicalArticles/javase/nio/ ! http://jcp.org/en/jsr/detail?id=336 ! http://download.oracle.com/javase/7/docs/technotes/guides/ jdbc/jdbc_41.html ! http://download.oracle.com/javase/tutorial/essential/ concurrency/forkjoin.html ! http://download.oracle.com/javase/7/docs/api/ ! http://www.infoq.com/br/articles/java7coin Globalcode  –  Open4education
  44. 44. Obrigado !eder@yaw.com.br @edermag Globalcode  –  Open4education

×