Java 5 - Novidades Gerente de Tecnologia – Vitor Costa Novidades Tipos genéricos; Autoboxing/unboxing; Enhanced for Loop; Covariância; Tipos enumerados; Static Imports; Annotations (Metadata); Argumentos variáveis; Leituras e escritas formatadas; Outras novidades... Tipos Genéricos JSR-14; Sintaxe mais limpa – evita casts; Verificação em tempo de compilação; Equivalente ao Template em C++, será? Tipos Genéricos Antes: List lista = new ArrayList(); lista.add( new Integer( 100 ) ); int numero = ( (Integer) lista.get( 0 ) ).intValue(); Agora: List<Integer> lista = new ArrayList<Integer>(); lista.add( new Integer( 100 ) ); int numero = lista.get( 0 ).intValue(); Construindo Tipos Genéricos public interface Pilha<E> { E pop(); void push(E objeto); } public class UtilPilha { public static void limpar(Pilha<?> pilha) { } public static void imprimir (Pilha<? extends Desenho> pilha) { } } Autoboxing/unboxing JSR-201; Elimina a conversão manual entre os tipos primitivos e suas “wrapper” classes; Código mais simples de ler; Facilita a integração dos tipos genéricos; Autoboxing/unboxing Antes: List lista = new ArrayList(); lista.add( new Integer( 100 ) ); int numero = lista.get( 0 ).intValue(); Agora: List<Integer> lista = new ArrayList<Integer>(); lista.add( 100 ); int numero = lista.get( 0 ); Autoboxing/unboxing Se A é igual a B e B é igual a C, então A é igual a C; Não é mais verdade após Java 5; Integer i1 = new Integer( 100 ); int i2 = 100; Integer i3 = new Integer( 100 ); if (i1 == i2 && i2 == i3) { System.out.println(“OK”); if (i1 != i3) System.out.println(“Xiiiii”); } Enhanced for Loop JSR-201; Conhecido como for-each em outras lings.; Reduz a repetição de código para iterar sobre arrays ou coleções; Melhor usado com tipos genéricos; Enhanced for Loop - array Antes: int sum = 0; for(int i = 0; i < array.length; i++) { sum += array[i]; } Agora: int sum = 0; for(int i : array) { sum += i; } Enhanced for Loop - coleção Antes: for(Iterator i = c.iterator(); i.hasNext(); ) { String str = (String) i.next(); sb.append(str); } Agora: for(String str : c) { sb.append(str); } Enhanced for Loop Não substitui os loops onde é necessário a utilização de um contador; Não se aplica às iterações onde se deseja remover ou substituir os elementos; Pode ser mais lento quando usado em conjunto com coleções muito grandes; Suporte do “Enhanced for Loop” a qualquer coleção: java.lang.Iterable<E>; Covariância Parte da JSR-14 (tipos genéricos); Capacidade de uma subclasse sobrescrever um método trocando seu tipo de retorno por uma subclasse do tipo de retorno original; Covariância public class SuperClasse { public JTextField getCampoTexto() { return new JTextField(); } } public class SubClasse extends SuperClasse { public JPasswordField getCampoTexto() { return new JPasswordField(); } } Tipos Enumerados JSR-201; Permite criação de tipos enumerados diretamente na linguagem (sem ter que recorrer a padrões); Adiciona um novo termo às palavras reservadas: enum; Tipos Enumerados public enum Semaforo { VERMELHO, AMARELO, VERDE }; /* ... */ Semaforo semaforo = Semaforo.VERDE; if(semaforo == Semaforo.VERMELHO) { } switch(semaforo) { case(Semaforo.VERDE): // ... } Tipos Enumerados public enum MERCURY VENUS PLUTO Planet { (3.303e+23, 2.4397e6), (4.869e+24, 6.0518e6), (1.27e+22, 1.137e6); private final double mass, radius; Planet(double mass, double radius) { this.mass = mass; this.radius = radius; } private double mass() { return mass; } private double radius() { return radius; } public static final double G = 6.67300E-11; double surfaceGravity() { return G * mass / (radius * radius); } } Static Imports JSR-201; Importa as funções e variáveis públicas estáticas de outra classe; Substitui o “Constant Interface Antipattern”; Pode facilitar o uso destas funções e variáveis, mas não devemos abusar; Static Imports Antes: double r = Math.cos(Math.PI * theta); Agora: import static java.lang.Math.* // import static java.lang.Math.PI // import static java.lang.Math.cos double r = cos(PI * theta); Annotations (Metadata) JSR-175; Permite que você defina e use seus próprios tipos de anotação; Podem ser acessadas via reflexão; Não alteram a semântica do programa, mas pode afetar como o programa é tratado por ferramentas e bibliotecas; Programadores típicos nunca precisarão definir um tipo Annotation; Argumentos Variáveis JSR-65; Permite a definição de métodos com número de argumentos variáveis; Elimina a necessidade de empacotar listas em um array; Só poder ser utilizado como última variável em um método; Argumentos Variáveis public class Teste { public void imprimir(Object ... objetos) { for(Object objeto : objetos) System.out.println(objeto); } public static void main(String[] args) { imprimir(“string”, new Teste(), 50, 3.2); } } Leituras e escritas formatadas JSR-51; Facilidades para leitura e escrita de textos formatados; Leitura: Scanner, evolução do StringTokenizer; Escrita: printf em Java; Leituras e escritas formatadas Escrita: int age = 28; String name = “Williamis”; System.out.printf("%s %d", name, age); Leitura: Scanner reader = new Scanner(System.in); int n = reader.nextInt(); Outras Novidades... Utilitário para programação concorrente; RMI: não necessita mais do rmic; Algumas adições na API JDBC; Muitas melhorias no desempenho: http://java.sun.com/performance/reference/whitepapers/5.0_performance.html StringBuilder e StringBuffer; Java 5 - Novidades Gerente de Tecnologia – Vitor Costa