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
  }
}

 


Споріднені теми