A memória das classes do sistema são compartilhadas entre as diversas VM's no ar. Não suportado em Windows 98/ME.
Garbage Collector Ergonomics
O coletor paralelo pode adaptar a memória sem necessidade de parâmetros.
Fatal Error Handling
Melhorias para prover melhores informações.
Tema anterior - Steel
Tema novo - Ocean
Autoboxing
Problema:
Conversão entre tipos primitivos e objetos wrapper .
Necessário quando adiciona-se primitivas à coleções.
int x = 2;
Integer y = new Integer(3);
ArrayList al = new ArrayList();
al.add(new Integer(4));
int b = ((Integer) al.get(0)).intValue();
Autoboxing
Solução:
Deixe o compilador fazer isto.
int x = 2;
Integer y = 3;
ArrayList al = new ArrayList();
al.add(4);
int b = (Integer) al.get(0);
Enhanced for Loop
Problema:
Navegar numa coleção é trabalhoso.
Iterators são usados para pegar elementos e é fácil de gerar erros.
É fácil gerar RuntimeExceptions .
void cancelAll(Collection c) {
for (Iterator i = c.iterator(); i.hasNext(); ){
TimerTask task = (TimerTask)i.next();
task.cancel();
}
}
Enhanced for Loop
Solução:
Deixe o compilador fazer isto.
Novo comando:
for (variável : coleção)
Também funciona com arrays.
void cancelAll(Collection c) {
for (TimerTask task : c) {
task.cancel();
}
}
Type-safe enumerations
Problema:
Não há maneira de definir variáveis que só possam receber determinados valores.
public final class Naipe {
public static final int OURO = 0;
public static final int ESPADA = 1;
public static final int COPAS = 2;
public static final int PAUS = 3;
}
int naipe = Naipe.OURO;
Type-safe enumerations
Solução:
Novo tipo: enum
Gera uma subclasse de java.lang.Enum
public enum Naipe {
OURO, ESPADA, COPAS, PAUS;
}
Naipe naipe = Naipe.OURO;
Type-safe enumerations
Criando seu próprio tipo de enumeração:
Neste caso há a necessidade de sobrecarga do construtor e dos métodos envolvidos.
public enum Coin {
penny(1), nickel(5), dime(10), quarter(25);
Coin(int value) {
this.value = value;
}
private final int value;
public int value() {
return value;
}
}
Varargs
Problema:
Não é possível definir métodos que permitam um número variável de argumentos.
public String append(String s1, String s2) {
return s1.concat(s2);
}
public String append(String s1, String[] s2) {
for (int i=0; i<s2.length; i++) {
s1 = s1.concat(s2[i]);
}
return s1;
}
Varargs
Solução:
Deixe o compilador fazer isto.
Nova sintaxe:
método(Object... o)
public String append(String s1, String... s2) {
for (int i=0; i<s2.length; i++) {
s1 = s1.concat(s2[i]);
}
return s1;
}
append(“a”, “b”);
append(“a”, “b”, “c”, “d”);
Static import
Problema:
Há a necessidade de especificar o nome da classe sempre que invocar um método estático.
Math.sqrt(9.0);
Math.sin(90.0);
Math.log(10.0);
Static import
Solução:
Novo comando import que define a classe que contém o método estático.
import static classe.*;
import static classe.metodo;
Import static classe.atributo;
import static Math.*;
sqrt(9.0);
sin(90.0);
log(10.0);
Metadata
Problema:
Necessidade de escrever código repetitivo e excessivo para tarefas comuns.
public interface CoffeeOrderIF extends Remote {
public Coffee [] getPriceList() throws RemoteException;
public String orderCoffee(String name, int quantity)throws RemoteException;
}
public class CoffeeOrderImpl implements CoffeeOrderIF {
public Coffee [] getPriceList() {...}
public String orderCoffee(String name, int quantity) {...}
}
Metadata
Solução:
Criar uma meta-linguagem que indique às ferramentas o código faltante.
public class CoffeeOrder {
@Remote public Coffee [] getPriceList() {...}
@Remote public String orderCoffee(String name, int quantity) {...}
}
Decimal Arithmetic Enhancement
Problema:
A classe BigDecimal não atende as necessidades.
Falta diversas operações utilizadas em aplicações.
Solução:
Criados novos construtores e métodos na classe BigDecimal:
divide
divideToIntegralValue
scaleByPowerOfTen
Formatted Input
Criada a classe Scanner para facilitar a leitura da console ou de qualquer stream .
Scanner s=Scanner.create(System.in);
String nome=s.next();
int idade=s.nextInt();
System.out.println(nome + “ tem “ + idade + “ anos”);
s.close();
Formatted Output
Java ganha printf !
Irá facilitar a migração de aplicações legadas em 'C', pois usa a mesma sintaxe.
java.util.Formatter
String nome = “joao”;
int idade = 12;
System.out.printf(“%1$s tem %2$d anos”, nome, idade);
Concurrency Utilities
Problema:
Aplicações que necessitam de muito controle sobre as Threads em execução demandam muito esforço de programação.
Criação de semáforos, sincronizadores, executores, canais de troca de dados, etc...
O Java fornece apenas Threads simples e objetos monitores, o que é suficiente para a grande maioria dos casos.
Concurrency Utilities
Solução:
Doug Lea havia criado uma API chamada util.concurrent ( http://gee.cs.oswego.edu ).
A API fez sucesso e virou uma JSR (166).
Esta agora incorporada a Core API como java.util.concurrent.
Principais classes:
Semaphore
Executors
CyclicBarrerier
Generics
Problema:
Tipos em coleções.
Não pode ser verificado em tempo de compilação.
Necessário uso constante de casting .
Pode gerar erros de execução ( ClassCastException ).
ArrayList l = new ArrayList();
l.add(new Integer(1));
l.add(new Integer(2));
Integer x1 = (Integer) l.get(0);
int x2 = ((Integer) l.get(1)).intValue();
Generics
Solução:
Diga ao compilador qual o tipo da coleção.
O compilador inclui os casting .
Garantia de correto funcionamento desde que todo o código envolvido seja genérico.
ArrayList<Integer> l = new ArrayList<Integer>();
l.add(new Integer(1));
l.add(2);
Integer x1 = l.get(0);
int x2 = l.get(1);
Generics
Mais problemas:
Métodos que recebem coleções de argumento devem verificar cada objeto com relação ao tipo, ou arriscar receber RuntimeExceptions.
static void dumpSam(Collection c) {
for (Iterator i = c.iterator(); i.hasNext();){
String s = (String) i.next();
if (s.indexOf("sam") > 0)
System.out.println(s);
}
}
Generics
Mais soluções:
Definir o tipo genérico do argumento.
static void dumpSam(Collection<String> c) {
for (Iterator<String> i=c.iterator(); i.hasNext();) {
String s = i.next();
if (s.indexOf("sam") > 0)
System.out.println(s);
}
}
Generics - Criando Classes
Garagem específica:
public class Garagem {
private ArrayList vagas = new ArrayList();
public void estaciona(Carro c) {
this.vagas.add(c);
}
public Carro retira() {
return (Carro) this.vagas.remove(0);
}
}
Generics - Criando Classes
Para criar a sua própria classe genérica, basta definir o tipo genérico entre “<” “>” ao lado do nome da classe. Garagem genérica:
public class Garagem<Generico> {
private ArrayList<Generico> vagas = new ArrayList<Generico>();
public void estaciona(Generico c) {
this.vagas.add(c);
}
public Generico retira() {
return this.vagas.remove(0);
}
}
Generics - Bounds
Para restringir quais classes podem ser utilizadas, basta usar o comando extends na definição. Garagem genérica, mas nem tanto:-)
public class Garagem<Generico extends Veiculo>{
private ArrayList<Generico> vagas = new ArrayList<Generico>();
public void estaciona(Generico c) {
this.vagas.add(c);
}
public Generico retira() {
return this.vagas.remove(0);
}
}
Generics - Covariant Return Types
O retorno de um método sobrescrito cria um novo método.
class Fruit implements Cloneable {
Fruit copy() throws CloneNotSupportedException {
return (Fruit)clone();
}}
class Apple extends Fruit implements Cloneable{
Apple copy() throws CloneNotSupportedException {
return (Apple)clone();
}}
Generics - UML
Link
Para baixar o novo Java SDK:
http://java.sun.com/j2se/1.5.0/
J2SE 5.0 - Tiger Obrigado! To the most despised cast We'll bid a fond farewell at last With generics' burning spear The need for cast will disappear -Joshua Bloch
0 comments
Post a comment