Класи обгортки в Java є частиною пакету java.lang. Вони надають можливість використовувати примітивні типи даних (int, char, тощо), в якості об’єктів. Іншими словами, обгортка – це спеціальний клас, об’єкт якого зберігає значення примітиву всередині себе. Це може знадобитись у випадках коли необхідні саме об’єкти, наприклад при роботі з колекціями Java (ArrayList, HashMap, тощо).
Кожен примітивний тип даних має відповідний клас обгортку:
| Primitive Data Type | Wrapper Class |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| boolean | Boolean |
| char | Character |
Деякі ключові функції та особливості класів обгорток у 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.45Character.isDigit(char ch): перевіряє, чи є вказаний символ числом:
char ch1 = '5';
char ch2 = 'A';
System.out.println(Character.isDigit(ch1)); // true
System.out.println(Character.isDigit(ch2)); // falseBoolean.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")); // trueImmutability (Незмінність)
Об’єкти класів обгорток є незмінними, тобто їх стан не може бути змінений після створення (зміни призводять до створення нового екземпляра). Це забезпечує безпеку потоків та узгодженість у програмах на 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 int3. Фреймворки котрі надають функції для рефлексії, серіалізації, тощо, працюють з об’єктами, а не примітивами. Класи обгортки роблять примітиви сумісними у таких випадках.
Про що слід пам’ятати
1. Автоматична упаковка та розпакування можуть призвести до збільшення накладних витрат на продуктивність, при використанні в циклах або коді, що часто виконується.
2. Якщо на місці об’єкта класу обгортки перебуває null, операція розпакування призведе до виключення NullPointerException.
3. Об’єкти класів обгорток споживають більше пам’яті порівняно з примітивами. Використовуйте примітиви там, де в об’єкті немає потреби.