Класи обгортки в Java є частиною пакету java.lang. Вони надають можливість використовувати примітивні типи даних (int, char, тощо), в якості об’єктів. Іншими словами, обгортка – це спеціальний клас, об’єкт якого зберігає значення примітиву всередині себе. Це може знадобитись у випадках коли необхідні саме об’єкти, наприклад при роботі з колекціями Java (ArrayList, HashMap, тощо).

Кожен примітивний тип даних має відповідний клас обгортку:

Primitive Data TypeWrapper Class
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
booleanBoolean
charCharacter

Деякі ключові функції та особливості класів обгорток у Java

Автоматична упаковка та розпакування

Java спрощує роботу з класами обгортками, підтримуючи автоматичне перетворення між примітивами та відповідними їм об’єктами обгортками:

  • Автоматична упаковка (Autoboxing): автоматичне перетворення примітиву до об’єкта відповідного класу обгортки.
  • Автоматичне розпакування (Unboxing): автоматичне перетворення об’єкта класу обгортки до відповідного примітиву.

Приклади:

int number1 = 10;
Integer objNumber1 = number1; // Autoboxing

Integer objNumber2 = 20;
int number2 = objNumber2; // Unboxing

Методи

Класи обгортки надають корисні методи для виконання таких операцій, як перетворення типів, перевірка значень, тощо. Розглянемо декілька прикладів.

Integer.parseInt(String s): перетворює рядок в ціле число:

String string = "123";
int number = Integer.parseInt(string);
System.out.println(number + 2); // 125

Якщо передати некоректний рядок (наприклад "123a"), буде згенеровано NumberFormatException.

Double.parseDouble(String s): перетворює рядок в об’єкт типу Double:

String string = "2.15";
double doubleValue = Double.parseDouble(string) + 1.3;
System.out.println(doubleValue); // 3.45

Character.isDigit(char ch): перевіряє, чи є вказаний символ числом:

char ch1 = '5';
char ch2 = 'A';

System.out.println(Character.isDigit(ch1)); // true
System.out.println(Character.isDigit(ch2)); // false

Boolean.parseBoolean(String s): розбирає рядок у булеве значення:

String stringTrue = "true";
String stringFalse = "false";
String stringText = "hello";

System.out.println(Boolean.parseBoolean(stringTrue)); // true
System.out.println(Boolean.parseBoolean(stringFalse)); // false
System.out.println(Boolean.parseBoolean(stringText)); // false

Метод parseBoolean() не генерує виключення, якщо отримує некоректне значення – просто повертає false коли рядок не "true" (при цьому регістр не має значення):

System.out.println(Boolean.parseBoolean("TRUE")); // true

Immutability (Незмінність)

Об’єкти класів обгорток є незмінними, тобто їх стан не може бути змінений після створення (зміни призводять до створення нового екземпляра). Це забезпечує безпеку потоків та узгодженість у програмах на Java.

Nullability

На відміну від примітивних типів, посилання на об’єкт класу обгортки може містити значення null. Це може бути корисним при роботі з базами даних, або коли значення змінної має бути необов’язковим.

Важливість класів обгорток у Java

1. Сумісність з Collections API: колекції Java (ArrayList, HashMap та інші), зберігають лише об’єкти. Класи обгортки дають змогу зберігати примітиви в колекціях. Приклад:

ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(5); // Autoboxing
numbers.add(10);

System.out.println(numbers); // [5, 10]

2. Класи обгортки пропонують методи для перетворення між рядками та примітивами:

String str = "123";
int num = Integer.parseInt(str); // Convert String to int

3. Фреймворки котрі надають функції для рефлексії, серіалізації, тощо, працюють з об’єктами, а не примітивами. Класи обгортки роблять примітиви сумісними у таких випадках.

Про що слід пам’ятати

1. Автоматична упаковка та розпакування можуть призвести до збільшення накладних витрат на продуктивність, при використанні в циклах або коді, що часто виконується.

2. Якщо на місці об’єкта класу обгортки перебуває null, операція розпакування призведе до виключення NullPointerException.

3. Об’єкти класів обгорток споживають більше пам’яті порівняно з примітивами. Використовуйте примітиви там, де в об’єкті немає потреби.


Мітки: