domingo, 11 de dezembro de 2005

Dica Java - Casting de tipos primitivos

Casting, no que diz respeito às linguagens de programação, tem o sentido moldar um objeto ou tipo primitivo em um outro molde. Normalmente chamamos de conversão. Este artigo focará os tipos primitivos usando no Java. Apresentemos os tipos primitivos do Java:

Descrição
Declaração
Detalhes
Lógico
boolean variavel = true;
Aceita true ou false.
Caracter
char variavel = 'a';
char variavel = 97;
É possível atribuir um único caractere dentro de dois apóstrofos ou simplemente o seu código ASCII
Byte
byte variavel = 100;
Tipo númerico que aceita números entre -128 e 127
Short
short variavel = 2000;
Suporta números entre -32.768 e 32.767
Inteiro
int variavel = 400050;
Aceita números que variam de -2.147.483.648 até 2.147.483.647
Longo
long variavel = 100780000;
Número longo que suporta valores entre
-9.223.372.036.854.775.808 e
9.223.372.036.854.775.807
Ponto Flutuante
float variavel = 5.789f;
Simples precisão (7 casas decimais)
Duplo
double variavel = 0.789;
Dupla presição (15 casas decimais)

O diagrama abaixo representa a "hierarquia" de conversão.




Vemos neste diagrama que somente os tipos byte, short e char podem ser convertidos para o tipo int. Vemos também que todos os tipos podem ser convertidos para o double. O diagrama torna-se agora compreensível para os demais tipos. Tanta definição, tanto "decoreba"... mas como converter? Existe a possibilidade de ocorrerem erros? Vejamos um exemplo:


Início do arquivo casting.java

public class casting {

   public static void main(String[] args) {

      char c;
      byte b;
      short s;
      int i;

      // Conversão de Short para Byte
      s = 200;
      b = (byte)s; // ocorrerá perda de dados
      System.out.println(b);

      // Conversão de Byte para Short
      b = 100;
      s = (short)b;
      System.out.println(s);

      // Conversão de Char para Int
      c = 'a'; // código ASCII = 97
      i = (int)c; // utilizará o código ASCII
      System.out.println(i);

   }

}
Fim do arquivo casting.java

Quando fazemos (short)b , estamos convertendo a variável b em short. Caso não existe a obediência da hierarquia mostrada neste artigo, haverá perda de dados (inconsistência de dados). Um detalhe interessante em casting de tipos primitivos é a conversão utilizando o tipo CHAR, é utilizado o seu código ASCII no processo.

Existe a possibilidade de convertermos objetos. Neste caso, poderíamos tratar não simplesmente de uma conversão e sim de um novo molde ao objeto convertido. É como se pudéssemos moldar um objeto CachorroDeGuarda para um objeto CachorroJaTreinado. Existe a necessidade de haver semelhança entre essas classes (objetos).