Вам, безумовно, слід віддати перевагу створенню нового об’єкта у переважній більшості випадків. Проблеми з перепризначенням усіх властивостей:
- Потрібні публічні налаштування всіх властивостей, що різко обмежує рівень інкапсуляції, який ви можете надати
- Знання того, чи є у вас додаткове використання для старого примірника, означає, що вам потрібно знати всюди, що використовується старий екземпляр. Тож якщо клас
A
і клас B
обидва проходять екземпляри класу, C
то вони повинні знати, чи будуть вони коли-небудь передані тим самим екземпляром, і якщо так, чи використовує його ще один. Це щільно поєднує заняття, які інакше не мають підстав бути.
- Приводить до повторного коду - як вказувало gbjbaanb, якщо ви додаєте параметр до конструктора, скрізь, де виклик конструктора не вдасться скомпілювати, немає ніякої небезпеки втратити місце. Якщо ви просто додаєте загальнодоступну власність, вам доведеться обов’язково вручну знаходити та оновлювати кожне місце, де об’єкти "скидаються".
- Збільшує складність. Уявіть, що ви створюєте та використовуєте екземпляр класу в циклі. Якщо ви використовуєте свій метод, то вам доведеться робити окрему ініціалізацію вперше через цикл або до початку циклу. Будь-який спосіб - це додатковий код, який потрібно написати для підтримки цих двох способів ініціалізації.
- Значить, ваш клас не може захистити себе від недійсного стану. Уявіть, що ви написали
Fraction
клас із чисельником та знаменником і хотіли б переконатись, що він завжди зменшувався (тобто gcd чисельника та знаменника був 1). Це неможливо зробити добре, якщо ви хочете дозволити людям публічно встановлювати чисельник та знаменник, оскільки вони можуть перейти через недійсний стан, щоб перейти з одного дійсного стану в інший. Наприклад 1/2 (дійсне) -> 2/2 (недійсне) -> 2/3 (дійсне).
- Це зовсім не ідіоматично для мови, на якій ви працюєте, збільшуючи когнітивне тертя для тих, хто підтримує код.
Це все досить значні проблеми. І те, що ви отримуєте взамін за додаткову роботу, яку створюєте, - це нічого. Створення екземплярів об'єктів, як правило, неймовірно дешево, тому користь від продуктивності майже завжди буде абсолютно незначною.
Як було сказано в іншій відповіді, єдиний час роботи може викликати занепокоєння, якщо ваш клас виконує якісь значно дорогі роботи з будівництва. Але навіть у цьому випадку для роботи цієї техніки вам потрібно буде мати можливість відокремити дорогу частину від властивостей, які ви скидаєте, тож ви зможете замість цього використовувати легку вагу або подібну схему .
Як бічне зауваження, деякі з вищезазначених проблем можна дещо усунути, не використовуючи сеттери, а замість того, щоб public Reset
у вашому класі був метод, який приймає ті самі параметри, що і конструктор. Якщо ви чомусь захотіли спуститися по цьому маршруту скидання, це, мабуть, буде набагато кращим способом зробити це.
Тим не менш, додаткова складність і повторюваність, що додається, поряд із вищезазначеними пунктами, все ще є дуже переконливим аргументом проти цього, особливо якщо вони зважилися на неіснуючі переваги.