Классы Wrapper в Java

Классы Wrapper в Java

1. обзор

Как следует из названия,wrapper classes are objects encapsulating primitive Java types.

Каждый Java-примитив имеет соответствующую оболочку:

  • логическое, байт, короткое, char, int, long, float, double

  • Логическое, байтовое, короткое, символьное, целое, длинное, плавающее, двойной

Все они определены в пакетеjava.lang, поэтому нам не нужно импортировать их вручную.

2. Классы Обертки

«Какова цель класса-оболочки?». Это один из самыхcommon Java interview questions.

В основномgeneric classes only work with objects and don’t support primitives. В результате, если мы хотим работать с ними, мы должны преобразовать примитивные значения в объекты-оболочки.

Например, Java Collection Framework работает исключительно с объектами. Давным-давно, когда (до Java 5, почти 15 лет назад) не было автобокса, и мы, например, не могли просто вызватьadd(5) для коллекцииIntegers.

В то время теprimitive values needed to be manually converted to corresponding wrapper classes и хранились в коллекциях.

Сегодня с автобоксингом мы можем легко выполнитьArrayList.add(101), но внутренне Java преобразует примитивное значение вInteger перед сохранением его вArrayList с помощью методаvalueOf().

3. Преобразование примитивов в класс-оболочку

Теперь большой вопрос: как нам преобразовать примитивное значение в соответствующий класс-обертку, например отint доInteger или отchar доCharacter?

Ну,we can either use constructor or static factory methods to convert a primitive value to an object класса-оболочки.

Давайте посмотрим на пример преобразования значенияint в объектInteger в Java:

Integer object = new Integer(1);

Integer anotherObject = Integer.valueOf(1);

МетодvalueOf() возвращает экземпляр, представляющий указанное значениеint.

Он возвращает кэшированные значения, что делает его эффективным. Он всегда кэширует значения в диапазоне от -128 до 127, но также может кэшировать другие значения вне этого диапазона.

Аналогичным образом мы также можем преобразоватьboolean вBoolean, byte вByte, char вCharacter, long вLong, float вFloat, иdouble вDouble. Хотя если у нас естьconvert String to Integer, тогда нам нужно использовать методparseInt(), потому чтоString не является классом-оболочкой.

С другой стороны,to convert from a wrapper object to a primitive value, we can use the corresponding method such as intValue(), doubleValue() и т. Д .:

int val = object.intValue();

Полный справочник можно найти вhere.

4. Автобокс и распаковка

В предыдущем разделе мы показали, как вручную преобразовать примитивное значение в объект.

После Java 5this conversion can be done automatically by using features called autoboxing and unboxing.

“Boxing” refers to converting a primitive value into a corresponding wrapper object. Поскольку это может происходить автоматически, это называется автобоксингом.

Аналогичноwhen a wrapper object is unwrapped into a primitive value then this is known as unboxing.

На практике это означает, что мы можем передать примитивное значение методу, который ожидает, что объект-оболочка или назначит примитив переменной, которая ожидает объект:

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

Integer val = 2; // autoboxing

В этом примере Java автоматически преобразует примитивное значениеint в оболочку.

Внутри он использует методvalueOf() для облегчения преобразования. Например, следующие строки эквивалентны:

Integer value = 3;

Integer value = Integer.valueOf(3);

Хотя это упрощает преобразование и делает коды более читабельными, в некоторых случаяхwe shouldn’t use autoboxing e.g. inside a loop.

Как и в случае с автобоксом, распаковка выполняется автоматически при передаче объекта в метод, который ожидает примитив, или при назначении его примитивной переменной:

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

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

По сути,if we write a method that accepts a primitive value or wrapper object, we can still pass both values to them. Java позаботится о передаче правильного типа, например. примитив или оболочка в зависимости от контекста.

5. Заключение

В этом быстром уроке мы говорили о классах-обёртках в Java, а также о механизме автобоксирования и распаковки.