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
Download

Java 5 - Novidades