Bạn chắc chắn nên thích việc tạo ra một đối tượng mới trong rộng lớn đa số trường hợp. Các vấn đề với việc gán lại tất cả các thuộc tính:
- Yêu cầu setters công khai trên tất cả các thuộc tính, điều này hạn chế đáng kể mức độ đóng gói bạn có thể cung cấp
- Biết liệu bạn có sử dụng bổ sung cho ví dụ cũ hay không có nghĩa là bạn cần biết ở mọi nơi rằng thể hiện cũ đang được sử dụng. Vì vậy, nếu cả lớp
A
và lớp B
đều được thông qua các thể hiện của lớp C
thì họ phải biết liệu chúng có được thông qua cùng một thể hiện hay không, và nếu vậy thì liệu lớp kia có còn sử dụng nó không. Điều này chặt chẽ các lớp học mà không có lý do để được.
- Dẫn đến mã lặp đi lặp lại - như gbjbaanb đã chỉ ra, nếu bạn thêm một tham số cho hàm tạo, ở mọi nơi gọi hàm tạo sẽ không biên dịch được, sẽ không có nguy cơ bỏ sót một điểm nào. Nếu bạn chỉ cần thêm một tài sản công cộng, bạn sẽ phải chắc chắn tìm và cập nhật thủ công mọi nơi mà các đối tượng được "đặt lại".
- Tăng độ phức tạp. Hãy tưởng tượng bạn đang tạo và sử dụng một thể hiện của lớp trong một vòng lặp. Nếu bạn sử dụng phương thức của mình, thì bây giờ bạn phải thực hiện khởi tạo riêng biệt lần đầu tiên thông qua vòng lặp hoặc trước khi vòng lặp bắt đầu. Một trong hai cách là mã bổ sung bạn phải viết để hỗ trợ hai cách khởi tạo này.
- Có nghĩa là lớp của bạn không thể tự bảo vệ mình khỏi trạng thái không hợp lệ. Hãy tưởng tượng bạn đã viết một
Fraction
lớp với tử số và mẫu số, và muốn thực thi rằng nó luôn luôn giảm (tức là gcd của tử số và mẫu số là 1). Điều này là không thể thực hiện tốt nếu bạn muốn cho phép mọi người đặt công thức tử số và mẫu số, vì họ có thể chuyển qua trạng thái không hợp lệ để chuyển từ trạng thái hợp lệ này sang trạng thái hợp lệ khác. Ví dụ: 1/2 (hợp lệ) -> 2/2 (không hợp lệ) -> 2/3 (hợp lệ).
- Hoàn toàn không phải là thành ngữ cho ngôn ngữ bạn đang làm việc, làm tăng ma sát nhận thức cho bất kỳ ai duy trì mã.
Đây là tất cả các vấn đề khá quan trọng. Và những gì bạn nhận được để đáp lại công việc làm thêm mà bạn tạo ra là ... không có gì. Nói chung, việc tạo các đối tượng là cực kỳ rẻ, vì vậy lợi ích về hiệu năng sẽ hầu như không đáng kể.
Như câu trả lời khác đã đề cập, hiệu suất thời gian duy nhất có thể là mối quan tâm có liên quan là nếu lớp của bạn thực hiện một số công việc đắt đỏ đáng kể về xây dựng. Nhưng ngay cả trong trường hợp đó, để kỹ thuật này hoạt động, bạn cần có thể tách phần đắt tiền ra khỏi các thuộc tính mà bạn đặt lại, vì vậy bạn có thể sử dụng mô hình cân bằng hoặc thay thế tương tự.
Là một lưu ý phụ, một số vấn đề ở trên có thể được giảm bớt phần nào bằng cách không sử dụng setters và thay vào đó có một public Reset
phương thức trên lớp của bạn có cùng tham số như hàm tạo. Nếu vì lý do nào đó bạn đã muốn đi xuống tuyến đường thiết lập lại này, đó có lẽ sẽ là một cách tốt hơn để làm điều đó.
Tuy nhiên, sự phức tạp và lặp đi lặp lại bổ sung thêm, cùng với các điểm nêu trên mà nó không giải quyết, vẫn là một lập luận rất thuyết phục chống lại việc đó, đặc biệt là khi cân nhắc với các lợi ích không tồn tại.