Mutable và Immutable Objects là gì?

Có thể khi đọc tiêu đề bài viết này, nhiều bạn bỡ ngỡ, giật mình vì đây là lần đầu tiên bạn gặp những từ ngữ và những khái niệm như này.

Mutable và Immutable Objects không phải là 1 khái niệm mới hay 1 kỹ thuật lập trình OOP gì đó cao siêu cả. Nó hoàn toàn cơ bản, và mọi người gọi chúng là Mutable Objects hay Immutable Objects để làm rõ đặc điểm cũng như tính năng của đối tượng đó có những gì và không có những gì.

Mutable và Immutable Objects khá gần gũi và quen thuộc với bạn trong quá trình bạn viết các chương trình Java hay OOP nói chung.

Vậy Mutable (trạng thái - thay đổi được) và Immutable (trạng thái - không thay đổi được) Objects là gì?

Đơn thuần, các đối tượng dạng Mutable và Immutable đều là những Class mà bạn tạo ra hay những Class dạng này được cung cấp sẵn trong Java. Nhưng để phân biệt các đối tượng Mutable và Immutable không phải dựa vào tên Class, hay tính thừa kế hoặc những cấu trúc đối tượng phức tạp mà dựa vào đặc điểm cũng như hành vi của đối tượng đó bằng các cặp phương thức Getter/Setter.

Tóm lược lại, tôi rút ra những khái niệm về Mutable và Immutable Object như sau:

  • Mutable Object: khi khởi tạo 1 đối tượng, tức ta có 1 tham chiếu tới 1 thể hiện của 1 lớp, thì trạng thái của đối tượng có thể thay đổi được sau khi việc khởi tạo đối tượng thành công. (Trạng thái đối tượng ở đây có thể là các trường thông tin mà đối tượng đó nắm giữ. Ví dụ: tên, tuổi của 1 đối tượng sinh viên chẳng hạn)
  • Immutable Object: khi khởi tạo 1 đối tượng, thì trạng thái của tối tượng đó không thể thay đổi được sau khi việc khởi tạo đối tượng thành công. (Điều này có nghĩa là, bạn chỉ có thể get mà không thể set).

1. Xây dựng Mutable Class:

public class MutableClass {

    private String first_name;
    private String last_name;

    public MutableClass(String first_name, String last_name) {
        this.first_name = first_name;
        this.last_name = last_name;
    }

    //Mutator
    public String getFirstName() {
        return first_name;
    }

    public void setFirstName(String first_name) {
        this.first_name = first_name;
    }

    public String getLastName() {
        return last_name;
    }

    public void setLastName(String last_name) {
        this.last_name = last_name;
    }
}

2. Xây dựng Immutable Class:

import java.util.Date;
public final class ImmutableClass {

    private String first_name;
    private String last_name;
    private Date dateOfBirth;

    public ImmutableClass(String first_name, String last_name, Date dob) {
        this.first_name = first_name;
        this.last_name = last_name;
        dateOfBirth = dob;
    }

    public String getFirstName() {
        return first_name;
    }

    public String getLastName() {
        return last_name;
    }

    public Date getDateOfBirth() {
        return dateOfBirth;
    }
}

**Class StudentRunner: **

import java.util.Date;
public class StudentRunner {
    public static void main(String[] args) {
        Date myDOB = new Date();
        ImmutableClass student = new ImmutableClass("Manh", "Tien", myDOB);
    }
}