Nessa aula você irá entender como utilizar o casting e classes wrapper para converter dados de um tipo para o outro sem nenhum risco de perder informações.
Nas aulas anteriores, aprendemos que algumas linguagens de programação de alto nível possuem tipos de dados diferentes. Portanto, a linguagem Java fornece duas ferramentas: casting e classes wrapper. Cada uma delas possuem suas próprias regras e o programador precisa ficar atento à elas.
Veremos também neste artigo que existem dois tipos de conversão de dados, são elas: implícita e explicita. Compreender os dois tipos de conversão são essenciais para a compreensão da linguagem.
Esse conteúdo faz parte de um conjunto conteúdos sobre programação orientada a objetos. Clique aqui para acessar.
Casting
As variáveis que declaramos são armazenadas em memória na forma de bits, sendo que, cada uma ocupa uma quantidade diferente de bits. Por exemplo, se quisermos armazenar o número 1 na memória principal, será necessário apenas 1 bit. Porém, se o programador deseja armazenar o número 200 na memória, quando convertido para a base binária ele é representado pelo conjunto 11001000. Assim serão necessários 8 bits de memória para armazenar o número 200. A representação de uma variável do tipo ‘int’, por exemplo, armazena 32 bits, ou qualquer inteiro entre -2.147.483.648 e 2.147.483.647. Sendo assim, percebemos que para cada tipo existe um limite de dados armazenados.
Casting implícito
Ao pensar na teoria de conjuntos numéricos proposta na matemática (Figura 1) fica fácil compreender que os conjuntos estão contidos uns nos outros.
Figura 1 – Conjuntos numéricos Os números naturais, por exemplo, estão compreendidos por números não negativos, incluindo o zero. Ainda é possível perceber que os números inteiros também são compreendidos pelos números naturais e inclui os números negativos. Esta regra pode ser aplicada para os demais conjuntos numéricos, assim podemos por exemplo, dizer que números como, por exemplo, o 15 também está dentro dos números racionais, inteiros e naturais. Na programação de alto nível, a preocupação deve ser qual espaço de armazenamento da variável que está sendo utilizada.
Caso a variável criada tenha a capacidade de armazenar informações maiores do que o dado que você deseja guardar, denominamos esta operação de casting implícito.
Classificação | Tipo | Descrição |
Lógico | Boolean | Pode possuir os valores true ou false (verdadeiro e falso) |
Inteiro | byte | Abrange de -128 até 127 (8 bits) |
Inteiro | short | Abrange de -32768 a 32767 (16 bits) |
Inteiro | int | Abrange de -2147483648 a 2147483647 (32 bits) |
Inteiro | long | Abrange de -263 a 263 (64 bits) |
Ponto flutuante | float | Abrange de 1.40239846-16 a 3.40282347+38 com precisão simples (32 bits) |
Ponto flutuante | double | Abrange de 4.94065645841246544-324 a 1.7976931348623157+308 com precisão dupla (64 bits) |
Caracter | char | Pode armazenar um caractere unicode (16 bits) ou um inteiro entre 0 e 65535 |
Figura 2 – representação de tipos de dados e suas capacidades de armazenamento Observando a Figura 2 é possível perceber que se quisermos armazenar a quantidade de líquido em um copo denominado Byte em um copo long. Este armazenamento será feito sem nenhum problema. Porém, também é possível perceber que ao tentar armazenar a quantidade de líquido de um copo long em um copo byte. A agua irá transbordar e se perderá.
Em Java esta conversão pode ser representada da seguinte forma:
Int i = 5;
Double d = 0;
d = i; // O código compila sem problemas
i = d; // O código não compila
Casting explicito
O casting explícito acontece quando o programador “assume” o risco da conversão e realiza o cast ignorando os riscos de perca de dados. É claro que ao realizar esta operação o programador através de sua lógica implementada deve assegurar que o dado convertido não será convertido erroneamente. Em Java esta conversão é representada da seguinte forma:
Int i = 5;
Double d = 0;
i = d; // O código não compila
i = (int)d // O código compila
* Cuidado, utilizar o casting de forma errada pode trazer muitos erros e dores de cabeça
Classes Wrapper
As classes Wrapper foram criadas dentro do pacote Java.lang e seu objetivo é auxiliar a manipulação de tipos primitivos. Nestas classes podemos invocar alguns métodos capazes de realizar conversão de dados assegurando que não haverá erros. Para cada tipo primitivo existe uma classe Wrapper com mesmo nome correspondente. Por exemplo, o tipo int possui a classe Integer, já o double possui a classe Double e assim por diante. Para convertermos um dado do tipo double em inteiro usando a classe Wrapper é bastante simples, observe o exemplo:
int resultado;
double d = 5.5;
resultado = Integer.parseInt(d);
O método parse.int() pode ser invocado diretamente da classe Integer sem a necessidade de criar uma Instância desta classe. É interessante lembrar que este método de parse está presente em todas as classes Wrapper, ex: Double, Float, Integer, etc. Mas calma, os conceitos de acesso a métodos e o que são classes estão dentro da programação orientada a objetos. Assim, este curso discutirá estes conceitos detalhadamente na próxima aula.
O segredo para utilizar bem essas ferramentas (casting e classes wrapper) é saber exatamente quando devemos aplicar uma ou aplicar a outra.