Відповіді:
Інші згадували, що деякі конструкції, такі як Collections
вимагають об'єктів, і що об'єкти мають більше накладних витрат, ніж їх примітивні аналоги (пам'ять та бокс).
Іншим фактором є:
Це може бути зручно ініціалізувати Об’єкти null
або надіслати null
параметри в метод / конструктор для позначення стану або функції. Цього не можна зробити за допомогою примітивів.
Багато програмістів ініціюють цифри до 0 (за замовчуванням) або -1, щоб це позначити, але залежно від сценарію це може бути неправильним або оманливим.
Це також створить сцену, NullPointerException
коли щось використовується неправильно, що набагато зручніше для програмістів, ніж якась довільна помилка.
Як правило, ви повинні використовувати примітивні типи, якщо вам не потрібен об'єкт з якихось причин (наприклад, для розміщення в колекції). Навіть тоді, розгляньте інший підхід, який не вимагає об’єкта, якщо ви хочете максимізувати числові показники. Це зазначено в документації , і ця стаття демонструє, як автобокс може спричинити велику різницю в продуктивності.
Integer
це читабельніше, ніж int
.
На мій погляд, якщо члени мого класу є змінними обгортки, це не покладається на значення за замовчуванням, що є доброзичливою поведінкою розробника.
1.
class Person {
int SSN ; // gets initialized to zero by default
}
2.
class PersonBetter {
Integer SSN; //gets initialized to null by default
}
У першому випадку ви не можете тримати значення SSN неініціалізованим. Це може зашкодити, якщо ви не перевіряєте, чи було встановлено значення, перш ніж намагатись його використовувати.
У другому випадку ви можете залишити SSN ініціалізованим значенням null. Що може призвести до NullPointerException, але це краще, ніж несвідомо вставляти в базу даних значення за замовчуванням (нуль) як SSN щоразу, коли ви намагаєтеся використовувати його без ініціалізації поля SSN.
PersonBuilder
що видає виняток, якщо SSN не встановлений до виклику "build", щоб отримати Person
екземпляр. Я думаю, що подібні речі є надмірними, але саме це сприяє мові Java для правильних зразків.
Я б використовував лише типи обгортки, якщо вам потрібно.
Використовуючи їх, ви не отримуєте багато, крім того, що вони є Objects
.
І ви втрачаєте накладні витрати на пам'ять та витрачений час на бокс / розпакування.
Практично я зіткнувся з ситуацією, коли використання класу обгортки можна пояснити.
Я створив клас обслуговування, який мав long
змінну типу
long
- коли вона не ініціалізована, для неї буде встановлено значення 0 - це буде заплутати користувача при відображенні в графічному інтерфейсі Long
- якщо вона не ініціалізована, для неї буде встановлено значення null
- це нульове значення не відображатиметься в графічному інтерфейсі.Це стосується і Boolean
тих випадків, коли значення можуть бути більш заплутаними, коли ми використовуємо примітив boolean
(оскільки значення за замовчуванням - false).
Колекції - типовий випадок для простих обгорткових об'єктів Java. Однак ви можете подумати про надання Wrapper більш конкретного значення в коді (об'єкт значення).
IMHO майже завжди має перевагу використовувати об’єкти вартості, коли це зводиться до читабельності та підтримання коду. Обгортання простих структур даних всередині об’єктів, коли вони мають певні обов’язки, часто спрощує код. Це те, що є дуже важливим у домен-керованому дизайні .
Звичайно, є проблема продуктивності, але я, як правило, ігнорую це, поки у мене не буде можливості виміряти ефективність за допомогою належних даних і робити більш спрямовані дії щодо проблемної області. Також може бути простіше зрозуміти проблему продуктивності, якщо код також легко зрозуміти.
ефективність програм, в яких переважають чисельні обчислення, може отримати значну користь від використання примітивів.
примітивні типи, використовується оператор ==, але для обгортки кращим вибором є виклик методу equals ().
"Первісні типи вважаються шкідливими" оскільки вони поєднують "процедурну семантику в інакше єдину об'єктно-орієнтовану модель.
Багато програмістів ініціюють цифри до 0 (за замовчуванням) або -1, щоб це позначити, але залежно від сценарію це може бути неправильним або оманливим.
Якщо ви хочете використовувати колекції, ви повинні використовувати класи Wrapper.
Первісні типи, використовуються для масивів. Крім того, для представлення даних, які не мають поведінки, наприклад, лічильник або логічна умова.
Починаючи з автобоксу, межа "коли використовувати примітив або обгортку" стала досить нечіткою.
Але пам’ятайте, обгортки - це об’єкти, тому ви отримуєте всі вишукані функції Java. Наприклад, ви можете використовувати рефлексію для створення цілих об'єктів, але не значень int. Класи обгортки також мають такі методи, як valueOf.
Якщо ви хочете створити тип значення. Щось на зразок ProductSKU або AirportCode.
Коли примітивний тип (рядок у моїх прикладах) визначає рівність, ви захочете замінити рівність.
Первісні значення в Java не є об'єктом. Для того, щоб маніпулювати цими значеннями як об'єктом, пакет java.lang надає клас обгортки для кожного примітивного типу даних.
Усі класи Wrapper є заключними. Об'єкт усіх класів обгортки, які можна ініціювати, є незмінними, що означає, що значення в об'єкті обгортки не може бути змінено.
Хоча клас void вважається класом обгортки, але він не обертає жодних примітивних значень і не може ініціюватися. Він не має конструктора public, він просто позначає об'єкт класу, що представляє ключове слово void.