Oi! Você já está bem familiarizado com os tipos primitivos e já trabalhou bastante com eles. Na programação (e em Java em particular), os primitivos têm muitas vantagens: eles usam pouca memória (e assim tornam o programa mais eficiente) e possuem uma faixa de valores claramente delineada. No entanto, ao aprender Java, já repetimos com frequência o mantra "tudo em Java é um objeto". Mas os primitivos contradizem diretamente essas palavras. Eles não são objetos. Então, nosso princípio "tudo é um objeto" é falso? Na verdade, não é. Em Java, todo tipo primitivo tem um irmão gêmeo, uma classe wrapper.
O que é uma classe Wrapper?
Um wrapper é uma classe especial que armazena uma primitiva internamente. Mas por ser uma classe, você pode criar instâncias dela. Eles armazenam os valores primitivos internamente, mas ainda são objetos reais. Os nomes das classes wrapper são muito semelhantes (ou exatamente iguais) aos nomes de suas primitivas correspondentes. Então, eles são fáceis de lembrar.
Classes wrapper para tipos de dados primitivos |
Tipos de dados primitivos |
Classes de wrapper |
int |
inteiro |
curto |
Curto |
longo |
Longo |
byte |
Byte |
flutuador |
Flutuador |
dobro |
Dobro |
Caracteres |
Personagem |
boleano |
boleano |
Objetos wrapper são criados da mesma forma que qualquer outro objeto:
public static void main(String[] args) {
Integer i = new Integer(682);
Double d = new Double(2.33);
Boolean b = new Boolean(false);
}
As classes wrapper nos permitem mitigar as deficiências dos tipos primitivos. A mais óbvia é que os primitivos não possuem métodos. Por exemplo, eles não têm um método
toString() , então você não pode, por exemplo, converter um
int em uma
String . Mas a classe wrapper
Integer torna isso fácil.
public static void main(String[] args) {
Integer i = new Integer(432);
String s = i.toString();
}
No entanto, a conversão na outra direção pode ser mais complicada. Digamos que temos uma
String , que sabemos com certeza que contém um número. Independentemente disso, não há uma maneira nativa de usar um
int primitivo para extrair o número da
String e convertê-lo em um número. Mas, podemos com as classes wrapper.
public static void main(String[] args) {
String s = "1166628";
Integer i = Integer.parseInt(s);
System.out.println(i);
}
Saída:
1166628
Extraímos com sucesso um número da
String e o atribuímos à variável de referência
Integer i . A propósito, em relação às referências. Você já sabe que argumentos são passados para métodos de maneiras diferentes: primitivos por valor e objetos por referência. Você pode usar esse conhecimento ao criar seus próprios métodos: por exemplo, se seu método usa números fracionários, mas você precisa que a lógica passe por referência, você pode passar argumentos
Double /
Float para o método em vez de
double /
float . Além dos métodos das classes wrapper, seus campos estáticos também podem ser muito convenientes. Por exemplo, imagine que você tenha a seguinte tarefa: exibir o máximo possível
valor int , seguido pelo valor mínimo possível. Este problema parece bastante básico. Mas sem o Google, é improvável que você consiga. Mas os wrappers permitem que você lide facilmente com essas "tarefas mundanas":
public class Main {
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
}
}
Esses campos evitam que você se distraia ao realizar tarefas mais sérias. Sem mencionar o fato de que digitar
2147483647 (que por acaso é o valor de MAX_VALUE) não é tarefa fácil! :) Além disso, em uma lição anterior, apontamos que os objetos wrapper são imutáveis.
public static void main(String[] args) {
Integer a = new Integer(0);
Integer b = new Integer(0);
b = a;
a = 1;
System.out.println(b);
}
Saída:
0
O estado do objeto originalmente apontado por
a não mudou (porque o valor de
b também teria mudado). Assim como ocorre com
String s, em vez de alterar o estado do objeto wrapper, um objeto totalmente novo é criado na memória. Então, por que os criadores de Java decidiram deixar os tipos primitivos na linguagem? Como tudo deve ser um objeto e temos classes wrapper que podem expressar tudo o que os primitivos expressam, por que não apenas manter os wrappers na linguagem e remover os primitivos? A resposta é simples: desempenho. Os tipos primitivos são chamados de primitivos porque carecem de muitos dos recursos "pesados" dos objetos. Sim, os objetos têm muitos métodos convenientes, mas nem sempre você precisa deles. Às vezes, tudo o que você precisa é do número 33, ou 2,62, ou
true /
false . Em situações em que as vantagens dos objetos não importam e não são necessárias para o funcionamento do programa, os primitivos são muito mais adequados para a tarefa.
GO TO FULL VERSION