Java 5

Da AMADIS

Índice

Features do Java 5

  • Todo o conteúdo apresentado é um breve comentário e nao tem como objetivo esgotar os assuntos.

Autoboxing

  • Facilita a vida do programador permitindo que se trate tipos primitivos da mesma maneira que se tratam objetos.

A maneira tradicional funcionava desta forma:

<codehighlight language="java">
int num = 23;
Integer numObject = new Integer(num);
</codehighlight>

Agora, com o autoboxing, é realizado automaticamente:

<codehighlight language="java">
int num = 71;
Integer obj = num;
</codehighlight>
  • Qual o benefício disto ?

É mais uma conveniência para o programador. Aparentemente não existe nenhum ganho ou perda de performance na execução.

Métodos com múltiplos argumentos

  • Não se trata de sobrecarga de métodos, mas sim de passarmos quaisquer quantidade de argumentos de qualquer tipo como parâmetros de um método.
O cabeçalho do método tem esta sintaxe:
<codehighlight language="java">
public void myMethod(Object … args){
   // código
}
</codehighlight>

e a sua chamada pode ser feita assim (repare no uso do autoboxing em dois dos exemplos):

<codehighlight language="java">
myMethod(23, 34, 78);
myMethod("teste", "choro");
myMethod(123);
</codehighlight>

Os parâmetros dentro do método são tratados como um Array do tipo Object bastando ao programador realizar o casting necessário para o tratamento dos dados.

  • Este recurso, embora prático, fere o conceito de orientação a objetos, logo deve ser usado com cautela. No entanto ele existe com um propósito de permitir ao Java que exista um método printf() semelhante ao existem no C.

O método printf()

  • Este é grande motivo de existirem os métodos com múltiplos argumentos, pois só com ele foi possível incorporar ao Java uma das grandes facilidades do C.

Aos habituados com o C é tranqüilo o uso e aos iniciantes fica mais fácil citar um exemplo de como é o uso do printf() no Java:

<codehighlight language="java">
Calendar cal = Calendar.getInstance();
System.out.printf("olá %2s, o mes atual é:  %1tB", cal, "Fulano");
</codehighlight>


O símbolo % significa que estamos usando um especificador de formato.
O dígito que o segue indica o número do argumento que no caso é 2 e se refere ao argumento "fulano"
O especificador %1tB refere-se ao primeiro argumento, o t nos indica que será usado uma conversão de datas e o B indica que somente o mês deverá ser mostrado.

O Resultado disto será : "olá Fulano, o mês atual é october".

O formato padrão tem a saída em inglês.
Para saber mais sobre os outros especificadores e como utilizar eles voce deve consultar o javadoc referente a classe java.util.Formater.

Scanners

  • Tratar entrada e saída de dados pelo console em Java sempre foi um trabalho irritante.

Era necessário escrever primeiro o código de tratamento de exceções. Uma vez feito isto, voce precisava usar um InputStreamReader ou um BufferedReader juntamente com o System.in. E finalmente converter para um tipo que seu programa poderia entender. Era um processo extremamente chato.

Agora, com a nova classe java.util.Scanner. Todo esse processo foi simplificado. Confira o exemplo.

<codehighlight language="java">
Scanner keyboard = Scanner.create(System.in); 
</codehighlight>

A entrada dos dados agora é interpretada como um conjunto de tokens. A classe scanner tem um método nextSomething() para cada um dos tipos primitivos e para os objetos String, BigInteger e BigDecimal.

Um exemplo funcional:

<codehighlight language="java">

Scanner keyboard = Scanner.create(System.in); System.out.println("Digite seu nome:"); String name = keyboard.nextString(); System.out.println("Olá " + name + ". Qual a sua idade?"); int age = keyboard.nextInt();

</codehighlight>

Neste exemplo, como já é sabido o tipo de dado que ser informado, usamos os métodos nextSomething() de acordo com o esperado. Mas saiba que existe toda uma coleção de métodos hasNextSomething() que te ajudam a testar que tipo de dado voce está recebendo como entrada. Alternativamente, também é possível levantar uma exceção InputMismatchException nos casos onde voce espera um nextSomething() específico e é retornado outro tipo de dado. Vale ressaltar que esta exceção não é forçada a ser tratada.

Scanners suportam mais que isso, voce também pode usar locales e expressões regulares. Para outros usos, confira a documentação relativa a esta classe bastante útil no javadoc.

Imports Estáticos

  • Mais outra feature para o programador escrever menos e produzir mais.

Qualquer programador já deve ter feito um código parecido com este para poupar digitação:

<codehighlight language="java">
PrintStream o = System.out;
o.print("algo");
o.print("algo mais ");
</codehighlight>

Nele a variável o é um atalho para " System.out". No java 5, voce poderá usar um import para ter acesso aos membros estáticos da classe. veja o exemplo a seguir:

<codehighlight language="java">
import static java.lang.System.out;
out.print("algo");
out.print("algo mais ");
</codehighlight>

Este não é o exemplo mais adequado para mostrar o quanto o uso de imports estáticos aumenta também a legibilidade do código. Veja o uso dele com SWING no exemplo abaixo.

<codehighlight language="java">
// sem import estático.

setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

// com import estático..
import static javax.swing.WindowConstants.*;
setDefaultCloseOperation(EXIT_ON_CLOSE);
</codehighlight>

Repare como reduz a quantidade de código e aumenta bastante a legibilidade do mesmo.

Tipos enumerados

  • Nunca existiram tipos enumerados em Java. A maneira era simular eles através de constantes em classes contendo as coleções.

Agora com o Enum ( que é um tipo especial de classe) voce poderá criar tipos enumerados rapidamente.

<codehighlight language="java">
enum Refrigerante{ pepsi, coca, tubaína }
// isto significa que agora voce tem realmente um tipo Refrigerante e pode usar assim
Refrigerante refrigeranteDoDia = Refrigerante.pepsi;
</codehighlight>

O mais interessante é que mesmo você alterando o enum, o java indica os trechos de código onde voce usa códigos antigos para que você possa corrigí-los.

Tipos Genéricos

  • A generalidade de tipos é uma das modificações mais radicais no core do Java 5.

Em poucas palavras, a generalidade de tipo permite ao programador passar tipos como argumentos de classes assim os valores são passados aos métodos. Estão focados fortemente no uso do framework com coleções (collections). Observe o exemplo de uma lista encadeada:

<codehighlight language="java">
String nomeCliente = (String) minhaLista.getFirst();  // sem generalidade
String nomeCliente = minhaLista.getFirst();    // com generalidade
</codehighlight>

Como o método getFirst() adivinha qual o tipo retornado ?O segredo está na forma como minhaLista foi instanciada, observe:

<codehighlight language="java">
LinkedList<String> minhaLista = new LinkedList<String>();
</codehighlight>

Para informações mais completas sobre funcionamento e como a generalidade é implementada consulte o artigo técnico criado pela sun.


Links

  • Apresentação usada para demonstrar as features do java 5 aos bolsistas do LEC.
Ferramentas pessoais
Parceiros
















SourceForge.net Logo

Supported by Cenqua