Đối tượng bất biến

Trong lập trình hướng đối tượng và hàm, đối tượng bất biến (tiếng Anh: immutable object hay unchangeable object) là một đối tượng mà trạng thái của nó không thể bị thay đổi sau khi được tạo ra. Nó trái ngược với đối tượng biến đổi (mutable object hay changeable object), mà có thể được thay đổi sau khi được tạo ra. Trong vài trường hợp, một đối tượng được xem là bất biến nếu ngay cả khi vài thuộc tính bên trong thay đổi nhưng trạng thái của đối tượng dường như không thay đổi theo cái nhìn từ bên ngoài. Ví dụ, một đối tượng sử dụng sự ghi nhớ để lưu kết quả tính toán nặng có thể vẫn được xem là đối tượng bất biến.

Kiểu chuỗi và các loại đối tượng cụ thể khác thường được biểu diễn dưới dạng đối tượng bất biến để cải thiện khả năng đọc và hiệu quả thời gian chạy trong lập trình hướng đối tượng. Đối tượng bất biến cũng hữu ích vì nó vốn an toàn luồng (thread-safe). Các lợi ích khác là nó dễ hiểu, và mang lại tính bảo mật cao hơn đối tượng biến đổi.

Khái niệm

Biến bất biến 
Trong lập trình mệnh lệnh, giá trị được giữ trong biến chương trình mà nội dung không bao giờ bị thay đổi được gọi là hằng số (constant) để phân biệt với những biến mà có thể được thay đổi trong quá trình thực thi. Ví dụ như hệ số chuyển đổi từ đơn vị met sang feet, hay giá trị của số pi với độ chính xác đến nhiều số thập phân.

Những trường chỉ đọc (read-only field) có thể được tính khi chương trình chạy (không như hằng số vốn được biết trước), nhưng không bao giờ thay đổi sau khi đã được khởi tạo.

Tính bất biến mạnh và yếu 
Đôi khi, khi ai đó nói những trường nhất định của đối tượng là bất biến. Điều đó có nghĩa không có cách nào thay đổi những phần của trạng thái đối tượng, mặc dù những phần khác của đối tượng có thể được thay đổi (bất biến yếu - weakly immutable). Nếu tất cả các trường là bất biến, thì đối tượng đó cũng bất biến. Nếu toàn bộ đối tượng không thể được mở rộng bởi các lớp khác, đối tượng đó được gọi là bất biến mạnh (strongly immutable).

Tham chiếu đến đối tượng 
Trong hầu hết các ngôn ngữ hướng đối tượng, đối tượng có thể được tham chiếu đến bằng cách sử dụng tham chiếu. Một số ví dụ về các ngôn ngữ như vậy là Java, C++, C#, VB.NET, và nhiều ngôn ngữ lập trình kịch bản, như Python và Ruby. Trong trường hợp này, trạng thái của một đối tượng có thể thay đổi khi các đối tượng được chia sẻ qua tham chiếu.

Sao chép đối tượng 
Nếu một đối tượng được xem là bất biến, nó có thể được sao chép một cách đơn giản bằng cách tạo một bản sao của một tham chiếu tới nó thay vì phải sao chép toàn bộ đối tượng. Bởi vì một tham chiếu (thưởng chỉ có kích thước của một [[Con trỏ (khoa học máy tính)|con trỏ) sẽ nhỏ hơn rất nhiều so với chính đối tượng đó, điều này dẫn đến tiết kiệm bộ nhớ và khả năng tăng tốc độ thực hiện.

Kĩ thuật sao chép tham chiếu sẽ khó hơn nhiều cho đối tượng biến đổi, bởi vì nếu người dùng tham chiếu đến một đối tượng biến đổi và thay đổi nó, những người dùng khác có tham chiếu đến nó cũng sẽ nhìn thấy sự thay đổi đó. Đó không phải là hiệu ứng trong dự tính, sẽ khó khăn để thông báo cho những người dùng khác để họ phản hồi chính xác. Trong trường hợp đó, sao chép phòng thủ toàn bộ đối tượng thay vì chỉ mỗi tham chiếu sẽ là giải pháp dễ dàng hơn mặc dù tốn kém hơn. Mẫu observer pattern là một kĩ thuật thay thế để xử lý thay đổi cho các đối tượng biến đổi.

Xem thêm 
 :en:Clojure
 Erlang
 F#
 Haskell
 Prolog
 Tcl
 Scala
 Phương thức thay đổi

Tham khảo 
This article contains some material from the Perl Design Patterns Book

Liên kết ngoài 

 Article Java theory and practice: To mutate or not to mutate? by Brian Goetz, from IBM DeveloperWorks -- saved copy at Internet Archive by Brian Goetz, from IBM DeveloperWorks -- saved copy at Internet Archive
 Immutable objects from JavaPractices.com
 Immutable objects from Portland Pattern Repository
 Objects Should Be Immutable by Yegor Bugayenko
 Immutable.js  by Facebook
 Immutable structures in C#  opensource project in Codeplex
 Immutable collections in.NET official library by Microsoft (NuGet Package)

Đối tượng (khoa học máy tính)
Lập trình hàm
Cấu trúc dữ liệu hàm