Do que se trata o artigo: Trata das classes wrappers, que empacotam tipos primitivos, as diferentes maneiras de criar esses objetos, métodos utilitários que são usados principalmente na conversão entre primitivos e Strings e os recursos boxing/unboxing.
Em que situação o tema é útil: O uso de classes wrappers é importante
quando precisamos encapsular tipos primitivos, de modo que eles possam participar de funcionalidades
relacionadas à orientação a objetos. Um exemplo disso é seu uso em operações com collections.
Resumo DevMan: Tipos primitivos em Java a tornam uma linguagem híbrida. Porém, as classes wrappers contornam esse problema, pois permitem que tipos primitivos sejam encapsulados e possam ser empregados em operações que exijam o uso de objetos, tais como em collections. Nas versões anteriores a Java 5, no entanto, a utilização desses objetos dava um pouco de trabalho ao programador, que precisava empacotar/desempacotar explicitamente os valores primitivos. Após essa versão de Java, esse processo se tornou automático, sendo chamado de boxing/unboxing. São fundamentalmente esses os tópicos abordados nesta matéria, além da adoção de classes empacotadoras, juntamente com var-args e ampliação, em casos de sobrecarga.
Sempre se ouviu dizer que Java é uma linguagem cujo paradigma é a orientação a objetos. No entanto, também se sabe que comumente lidamos nas aplicações com os tipos denominados primitivos. E lidar com tipos primitivos juntamente com objetos sempre foi uma necessidade do desenvolvedor. Mas, antes de Java 5, tais tipos não poderiam ser adicionados em um ArrayList, por exemplo, pois o método add() desse collection aceita apenas objetos como argumento. Assim, o código da Listagem 1 não funcionará em versões de Java anteriores a 1.5.
Listagem 1. Tentando adicionar um primitivo em um collection.
int i = 5;
ArrayList a = new ArrayList();
a.add(i);
A solução para isso é tratar os primitivos como objetos usando o que chamamos classes wrapper (empacotadora). Há uma classe wrapper correspondente a cada tipo primitivo em Java. Uma classe empacotadora encapsula um único valor de um tipo de dado primitivo. Por exemplo, a classe Integer deve tratar um valor int.
Uma outra situação em que as classes wrapper são úteis é quando precisamos converter um objeto em um tipo de dado primitivo. Por exemplo, digamos que em nossa aplicação, uma interface gráfica do usuário solicite que seja digitada a idade de uma pessoa em uma caixa de texto JTextField. Contudo, sabemos que caixas de textos retornam seu conteúdo em uma String, o que requer uma conversão para int de maneira que possamos realizar cálculos com a idade na aplicação.
Para completar os casos que justificam o uso de classes empacotadoras, citamos o fato de que os primitivos não têm métodos. Os métodos relacionados a um tipo primitivo encontram-se na classe wrapper correspondente. Dessa forma, se for necessário manipular um tipo primitivo em nossa aplicação, devemos consultar a documentação da classe empacotadora referente ao tipo, para verificar se a operação que desejamos é oferecida por algum método da classe.
As classes wrapper existem desde a versão 1.1 da linguagem, mas só a partir da versão 1.5 que foram implementados os recursos de boxing e unboxing, que estudaremos neste artigo. Além disso, iremos apresentar o uso dessas classes em situações como: instanciação, sobrecarga e conversão de tipos, entre outras. Veremos que os recursos de boxing e unboxing são os que permitem que o código da Listagem 1 funcione nas versões mais recentes de Java.
Visão geral das classes wrapper
Cada tipo primitivo em Java possui uma classe empacotadora correspondente. Por exemplo, a classe wrapper para int é Integer, para float é Float, e assim por diante, conforme pode ser visto na Tabela 1. Observe que o nome do tipo primitivo é simplesmente o mesmo nome da classe wrapper em minúsculas, exceto o tipo char, que corresponde a Character, e int, cuja classe correspondente é Integer. Na Tabela 1 podemos observar também quais os possíveis argumentos que podem ser passados ao construtor de cada classe.
Primitivo | Classe Wrapper | Argumentos do construtor |
---|---|---|
boolean | Boolean | boolean ou String |
Byte | Byte | byte ou String |
Char | Character | char |
double | Double | double ou String |
Float | Float | float, double ou String |
Int | Integer | int ou String |
Long | Long | long ou String |
short | Short | short ou String |
As classes wrapper são parte do pacote java.lang, o qual é importado por default em todos os programas Java. Dessas classes, as numéricas – Byte, Short, Integer, Long, Float e Double – estendem a classe Number. Number é uma classe abstrata e também é superclasse de ...