Classes de wrapper em Java

Classes de wrapper em Java

1. Visão geral

Como o nome sugere,wrapper classes are objects encapsulating primitive Java types.

Cada primitiva Java possui um wrapper correspondente:

  • boolean, byte, short, char, int, long, float, double

  • Boolean, Byte, Short, Character, Integer, Long, Float, Duplo

Eles estão todos definidos no pacotejava.lang, portanto, não precisamos importá-los manualmente.

2. Classes de Wrapper

“Qual é o propósito de uma aula de wrapper?”. É um dos maiscommon Java interview questions.

Basicamente,generic classes only work with objects and don’t support primitives. Como resultado, se queremos trabalhar com eles, temos que converter valores primitivos em objetos wrapper.

Por exemplo, o Java Collection Framework trabalha exclusivamente com objetos. Muito tempo atrás (antes de Java 5, quase 15 anos atrás) não havia autoboxing e nós, por exemplo, não podíamos simplesmente chamaradd(5) em uma coleção deIntegers.

Naquela época, essesprimitive values needed to be manually converted to corresponding wrapper classese armazenados em coleções.

Hoje, com o autoboxing, podemos facilmente fazerArrayList.add(101), mas internamente o Java converte o valor primitivo em umInteger antes de armazená-lo emArrayList usando o métodovalueOf().

3. Primitivo para conversão de classe Wrapper

Agora, a grande questão é: como convertemos um valor primitivo em uma classe de wrapper correspondente, por exemplo. umint aInteger ou umchar aCharacter?

Bem,we can either use constructor or static factory methods to convert a primitive value to an object de uma classe wrapper.

Vejamos um exemplo de conversão de um valorint em um objetoInteger em Java:

Integer object = new Integer(1);

Integer anotherObject = Integer.valueOf(1);

O métodovalueOf() retorna uma instância que representa o valorint especificado.

Retorna valores em cache, o que o torna eficiente. Ele sempre armazena em cache valores entre -128 e 127, mas também pode armazenar em cache outros valores fora desse intervalo.

Da mesma forma, também podemos converterboolean paraBoolean, byte paraByte, char paraCharacter, long paraLong, float paraFloat,edouble paraDouble. Porém, se tivermos deconvert String to Integer, precisaremos usar o métodoparseInt() porqueString não é uma classe de invólucro.

Por outro lado,to convert from a wrapper object to a primitive value, we can use the corresponding method such as intValue(), doubleValue() etc:

int val = object.intValue();

Uma referência abrangente pode ser encontradahere.

4. Caixa automática e unboxing

Na seção anterior, mostramos como converter manualmente um valor primitivo em um objeto.

Após Java 5,this conversion can be done automatically by using features called autoboxing and unboxing.

“Boxing” refers to converting a primitive value into a corresponding wrapper object. Como isso pode acontecer automaticamente, é conhecido como autoboxing.

Da mesma forma,when a wrapper object is unwrapped into a primitive value then this is known as unboxing.

O que isso significa na prática é que podemos passar um valor primitivo para um método que espera um objeto wrapper ou atribuir uma primitiva a uma variável que espera um objeto:

List list = new ArrayList<>();
list.add(1); // autoboxing

Integer val = 2; // autoboxing

Neste exemplo, o Java converterá automaticamente o valorint primitivo para o wrapper.

Internamente, utiliza o métodovalueOf() para facilitar a conversão. Por exemplo, as seguintes linhas são equivalentes:

Integer value = 3;

Integer value = Integer.valueOf(3);

Embora isso torne a conversão fácil e os códigos mais legíveis, há alguns casos em quewe shouldn’t use autoboxing e.g. inside a loop.

Semelhante à caixa automática, o desempacotamento é feito automaticamente ao passar um objeto para um método que espera uma primitiva ou ao atribuí-lo a uma variável primitiva:

Integer object = new Integer(1);
int val1 = getSquareValue(object); //unboxing
int val2 = object; //unboxing

public static int getSquareValue(int i) {
    return i*i;
}

Basicamente,if we write a method that accepts a primitive value or wrapper object, we can still pass both values to them. Java cuidará de passar o tipo certo, por exemplo primitivo ou invólucro, dependendo do contexto.

5. Conclusão

Neste tutorial rápido, falamos sobre classes de wrapper em Java, bem como o mecanismo de caixa automática e unboxing.