Java. Автоупаковка и автораспаковка

Автоупаковка и автораспаковка. Общие понятия. Использование при присваивании (=) и в методах. Примеры

Перед изучением данной темы рекомендуется ознакомиться со следующей темой:


Содержание


Поиск на других ресурсах:

1. Понятие об автоупаковке и автораспаковке. Случаи возникновения и преимущества использования

Автоупаковка и автораспаковка появились в Java, начиная с версии JDK 5.

Автоупаковка – это процесс автоматического преобразования (инкапсулирования) примитивного типа (int, double, boolean и т.п.) в соответствующую ему оболочку типа (Integer, Double, Boolean и т.п.) в случае, когда требуется получить объект данного типа.
Например, если для примитивного типа int нужно получить объект, это будет объект типа Integer. Соответственно конвертирование int в Integer называется автоупаковкой.
Автораспаковка – это процесс автоматического извлечения значения примитивного типа (int, char, float и т.п.) из оболочки типа (Integer, Character, Float и т.д.) в момент, когда требуется получить его значение.
Например, если из оболочки типа Float получается значение примитивного типа float, то этот процесс происходит автоматически и называется автораспаковкой.
Автораспаковка позволяет избежать вызова методов типа intValue() или doubleValue().
Автоупаковка и автораспаковка выполняются в следующих случаях:

  • при выполнении присваивания (=);
  • при передаче параметра в метод;
  • при возврате из метода;
  • при неявном преобразовании в выражениях.

Автоупаковка и автораспаковка дают следующие преимущества:

  • отпадает необходимость в ручной упаковке и распаковке значений;
  • упрощается реализация алгоритмов преобразования между примитивными типами и типами-обертками;
  • снижается количество ошибок, которые могут возникать исходя из этого контекста;
  • существенно облегчается работа с коллекциями Java;
  • автоупаковка позволяет избежать явного создания объекта.

 

2. Особенности реализации автоупаковки при присваивании (=). Пример

При выполнении автоупаковки не нужно создавать объект с помощью оператора new. Автоупаковка осуществляется при вызове оператора присваивания, который может выглядеть следующим образом

obj = value;

или

Type obj = value;

здесь

  • Type – некоторый тип-обертка, представляющий собой оболочку над примитивным типом, которому соответствует значение value. В Java для представления базовых примитивных типов реализованы следующие типы-обертки: Double, Float, Long, Integer, Short, Byte, Character, Boolean. Более подробно о типах данных Java можно прочитать здесь (2.1…);
  • obj – объект (экземпляр) типа-обертки (Integer, Double, Character и т.д.);
  • value – значение примитивного типа (int, double, char и т.д.), которое эквивалентно типу объекта obj.

 

3. Примеры автоупаковки при присваивании (=)

В примере демонстрируется процесс автоупаковки для разных типов.

// Автоупаковка
Boolean B = true; // Boolean <= boolean

int i = 28;
Integer objInt = i; // Integer <= int

float f = 7.58f;
Float objFloat = f; // Float <= float

double x = 19230.338;
Double objDouble;
objDouble = x; // Double <= double

Character objChar = '+'; // Character <= char

short t = 255;
Short objShort = t; // Short <= short

long l = 2323023933L;
Long objLong = l; // Long <= long

 

4. Примеры автораспаковки при присваивании (=)

Демонстрируется присваивание значений типов-оболочек Integer, Character, Boolean, Long значениям примитивных типов int, char, boolean, long.

// Автораспаковка при присваивании
Integer objI = 25;
int i = objI; // int <= Integer

Character objC = 'f';
char c;
c = objC; // char <= Character

Boolean objB = false;
boolean b = objB; // boolean <= Boolean

Long objL = 2322432342342l;
long l = objL; // long <= Long

 

5. Автоупаковка и автораспаковка при передаче параметра методу. Примеры

Автоупаковка происходит автоматически всякий раз, когда примитивный тип преобразуется в объект. Автораспаковка происходит автоматически, когда объект преобразуется в примитивный тип.
Таким образом эти два процесса происходят в случаях, когда метод получает аргумент или метод возвращает некоторое значение. Здесь различают 4 случая:

  • когда в методе объявляется параметр примитивного типа, а метод получает аргумент типа оболочки. В этом случае происходит автораспаковка;
  • когда в методе объявляется параметр типа оболочки, а метод получает аргумент примитивного типа. В этом случае происходит автоупаковка;
  • когда в объявлении метода возвращается примитивный тип (оператором return), а тело метода возвращает тип оболочки. В этом случае происходит автораспаковка;
  • когда в объявлении метода возвращается тип оболочка, а метод возвращает примитивный тип. В этом случае происходит автоупаковка.

 

5.1. Возврат из метода примитивного типа. Автораспаковка

Демонстрируется функция Max(), которая определяет максимум между двумя значениями типа Integer, являющимся типом-оболочкой. Функция возвращает значение примитивного типа int. При этом происходит автораспаковка значения типа Integer в значение типа int.

public class TrainAutoPacking {

  // Автораспаковка. Метод определяет максимальное из двух значений
  static int Max(Integer a, Integer b) {
    Integer max = a;
    if (a<b)
      max = b;
    return max; // Автораспаковка int <= Integer
  }

  public static void main(String[] args) {

    // 1. Объявить переменные типа-оболочки
    Integer x = 25;
    Integer y = 30;

    // 2. Вызвать функцию, происходит автораспаковка
    int z = Max(x, y); // int <= Integer - автораспаковка

    System.out.println(z); // 30
  }
}

 

5.2. Возврат из метода типа-оболочки. Автоупаковка

В примере объявляется метод Min(), определяющий минимальное значение между двумя целочисленными значениями примитивного типа int. Метод возвращает объект типа Integer, являющийся типом-оболочкой для int. При возврате происходит автоупаковка значения типа int в значение типа Integer.

public class TrainAutoPacking {

  // Автораспаковка.
  // Метод возвращает минимальное из двух значений примитивного типа
  static Integer Min(int a, int b) {
    int min = a;
    if (a>b)
      min = b;
    return min; // Автоупаковка при возврате
  }

  public static void main(String[] args) {

    // Возврат значения из метода. Автоупаковка
    int x = 30;
    int y = 22;
    Integer z;
    z = Min(x, y); // Integer <= int - автоупаковка

    System.out.println(z); // 22
  }
}

 

5.3. Передача в метод, котоырй получает параметр типа-оболочки, аргумента примитивного типа. Автоупаковка

В примере объявляется метод, реверсирующий число. При передаче числа в метод происходит автоупаковка примитивного типа long в тип-оболочку Long.

public class TrainAutoPacking {

  // Автоупаковка.
  // Метод возвращает число, читаемое наоборот: 12345 => 54321
  static long ReverseNumber(Long number) {

    // 1. Получить копию входящего параметра
    Long t = number;

    // 2. Цикл вычисления нового значения number
    number = 0L;
    while (t>0) {
      number = number * 10 + t % 10;
      t /= 10;
    }

    // 3. Вернуть результат
    return number;
  }

  public static void main(String[] args) {

    // Возврат значения из метода. Автоупаковка
    // 1. Заданное число
    long n = 12345L;

    // 2. Вызов метода,
    // тип long автоматически упаковывается в тип Long
    long res = ReverseNumber(n);

    // 3. Вывести результат
    System.out.println(res); // 54321
  }
}

 

5.4. Передача в метод, получающий параметр примитивного типа, аргумента типа-оболочки. Автораспаковка

Объявляется метод NumDigits(), определяющий количество цифр в числе. Метод получает входным параметром значение примитивного типа short. При вызове метода из функции main() в него передается значение типа оболочки Short. При таком вызове запускается механизм автораспаковки

public class TrainAutoPacking {

  // Метод, определящий количество цифр в числе.
  static int NumDigits(short number) {
    int k = 0;
    while (number>0) {
      k++;
      number /= 10;
    }
    return k;
  }

  public static void main(String[] args) {

    // 1. Заданное число
    Short num = 21335;

    // 2. Вызвать функцию NumDigits(),
    // происходит автораспаковка short <= Short
    int res = NumDigits(num);

    // 3. Вывести результат
    System.out.println(res); // 5
  }
}

 


Связанные темы