Mutable và Immutable là một khái niệm rất quen thuộc với mô hình OOP trong lập trình. Nhiều bạn nghe đến đây có thể thấy ngạc nhiên, "WTF, tao code vài năm trời tao có biest Mutable và Immutable đâu mà vẫn làm tốt đấy thôi?"


 


Trong thực tế, rất nhiều lúc bạn làm việc với nó hàng ngày nhưng chả biết gọi tên nó là gì. Cứ theo một thói quen, nhưng bạn cũng nên biết để khi đọc thêm tài liệu mà nó có nhắc tới thì cũng đỡ mất công phải tìm hiểu.


Vậy Mutable và Immutable là gì?


 


Mutable (biến đổi)


- Mutable đơn giản là một trạng thái có thể thay đổi được. Ta đi vào cụ thể, đó là Mutable Object


Khi khởi tạo 1 đối tượng, ta có một tham chiếu đến một thể hiện của class (reference). Khi đó ta có thể thay đổi được trạng thái của đối tượng đó. Dễ hiểu hơn là ta có thể thay đổi giá trị của đối tượng thông qua getset


Để dễ hiểu hơn, các bạn xem ví dụ bên dưới


class Program
{
    static void Main(string[] args)
    {
        var people = new Student("Phạm Quốc Thắng", "Developer", 19);
        people.Title = "Microsoft Student Partners";

    }
}

class Student
{
    public string Name { get; set; }
    public string Title { get; set; }
    public int Age { get; set; }
    public Student(string name, string title, int age)
    {
        this.Name = name;
        this.Title = title;
        this.Age = age;
    }
}

 


Sau khi khởi tạo, bạn có thể dễ dàng thay đổi được thông tin của nó.


 


Immutable (bất biến)


- Immutable là trạng thái không thay đổi được.


Nôm na là khi khởi tạo 1 đối tượng mới, bạn vẫn có tham chiếu đến thể hiện của class đó nhưng bạn chỉ get chứ ko set được. Hay chính xác hơn, set sẽ là private, vì thế bạn không thể thay đổi.


class Program
{
    static void Main(string[] args)
    {
        var people = new Student("Phạm Quốc Thắng", "Developer", 19);
        people.Title = "Microsoft Student Partners"; // lỗi rồi cưng
    }
}

class Student
{
    public string Name { get; }
    public string Title { get;}
    public int Age { get; }
    public Student(string name, string title, int age)
    {
        this.Name = name;
        this.Title = title;
        this.Age = age;
    }
}

 


Immutable không thể thay đổi được, vậy ưu điểm của nó so với mutable là gì?


- Immutable object có 4 ưu điểm:


+ Trạng thái hay giá trị của Object không thay đổi theo thời gian, giống như ta đưa tiền cho vợ giữ thì ta có thể dễ dàng đoán được là nó còn hay là mất đi đâu. Hehe


+ Thoải mái truyền cái Object này vòng quanh thế giới mà không sợ nó bị thay đổi. Giống như đưa tiền cho thằng xe ôm xong kêu "Ê giữ giùm tao cuối tháng tao lấy, kẻo vợ tao nó đòi" hay gửi vô ngân hàng "Ê giữ dùm tao, nhưng mà tao lại hay quẹt thẻ thanh toán linh tinh nên cuối tháng chắc không còn xu nào quá"


+ 2 threads (2 luồng xử líWink không thể thay đổi giá trị của nó vì cơ bản nó đã là bất biến


+ Vì trạng thái không đổi, nên ta có thể nhét nó vào hashset mà không sợ nó mất đi. Giống như gửi cái xe đạp màu hồng khắc tên mình vào bãi giữ xe. Rồi đến lúc tìm thì dễ dàng tìm được chứ không sợ bị lộn với xe con nào!


 


Điểm bất lợi của immutable object là nhiều khi để đảm bảo tính bất biến, một số lượng lớn object bị copy gây tốn thời gian và bộ nhớ


Bài gốc: http://phamthang.info/mutable-va-immutable-objects-la-gi/