Nguyên tắc tạo lớp bất biến

Nguyên tắc 1: Don’t provide “setter” methods

Không cung cấp phương thức setter, phương thức làm thay đổi giá trị của trường hoặc đối tượng được các trường tham chiếu.

Nguyên tắc này chỉ rõ việc các trường của đối tượng là có thể sửa đổi và phương thức setter thực thi việc thay đổi đó, để đảm bảo quy tắc thì ta không cung cấp phương thức này ra bên ngoài.

Nguyên tắc 2: Make all fields final and private

Đặt các trường khai báo thành private, thì bên ngoài không thể truy cập vào được, tuy nhiên muốn không vô tình sửa đổi trường thì ta nên đặt thành final.

Nguyên tắc 3: Don’t allow subclasses to override methods

Không cho phép các lớp con ghi đè lại, cách đơn giản nhất là khai báo final ở trên lớp, lúc này lớp được khai báo final sẽ không thể được kế thừa.

Nguyên tắc 4: If the instance fields include references to mutable objects, don’t allow those objects to be changed

Trong danh sách trường của đối tượng có những trường chứa tham chiếu đến “đối tượng có thể thay đổi” thì ta không được phép thay đổi các đối tượng đó

  • không cung cấp các phương thức để sửa đổi đối tượng đó
  • không dùng chung tham chiếu với các đối tượng có thể thay đổi, tạo ra bản sao mới với giá trị đã được sao chép đối với các đối tượng này (là những đối tượng là trường của lớp)

Ví dụ về lớp bất biến

public final class ImmutableRGB {

    // Values must be between 0 and 255.
    final private int red;
    final private int green;
    final private int blue;
    final private String name;

    private void check(int red,
                       int green,
                       int blue) {
        if (red < 0 || red > 255
            || green < 0 || green > 255
            || blue < 0 || blue > 255) {
            throw new IllegalArgumentException();
        }
    }

    public ImmutableRGB(int red,
                        int green,
                        int blue,
                        String name) {
        check(red, green, blue);
        this.red = red;
        this.green = green;
        this.blue = blue;
        this.name = name;
    }


    public int getRGB() {
        return ((red << 16) | (green << 8) | blue);
    }

    public String getName() {
        return name;
    }

    public ImmutableRGB invert() {
        return new ImmutableRGB(255 - red,
                       255 - green,
                       255 - blue,
                       "Inverse of " + name);
    }
}

Các lớp bất biến trong java

Ngoài những lớp bất biến chúng ta có thể tự khởi tạo thì trong java có sẵn một số lớp bất biến

  • String
  • Wrapper classes such as Integer, Long, Double etc.
  • Các lớp tập hợp bất biến như Collections.singletonMap(),….
  • java.lang.StackTraceElement
  • Java enums
  • java.util.Locale
  • java.util.UUID

Xem thêm các bài viết liên quan dưới đây: