( Người dịch: Nguyễn Đình Tuấn, lập trình viên Spring Boot tại Techmaster từ 7/2020
Nguồn dịch: https://www.logicbig.com/tutorials/core-java-tutorial/java-15-changes/sealed-classes-intro.html )

Sealed Classes trong Java 15 là gì

Các lớp "niêm phong" hay "kín" ( Sealed ) trong Java 15 là một tính năng lập trình cho xem trước (preview) cho phép một lớp hoặc giao diện kiểm soát những lớp nào có thể triển khai hoặc mở rộng nó.

Nó được thực hiện như thế nào ?

Bằng cách sử dụng từ khóa sealedpermits trong class :

Ví dụ :

Lấy ví dụ trong hệ thống phân cấp sau :

public sealed class Account permits SavingsAccount, CheckingAccount {
}
public sealed class Account permits SavingsAccount, CheckingAccount {
}
public final class SavingsAccount extends Account {
}
public final class CheckingAccount extends Account{
}

Một class không được class Account cho phép sẽ gặp phải lỗi biên dịch nếu nó cố gắng mở rộng nó:

public class VirtualAccount extends Account{
}
VirtualAccount.java:3:8 error: class is not allowed to extend sealed class: Account

Final classes khác gì với sealed classes:

Các lớp được khai báo là "final" có thể được coi là một hình thức "niêm phong" khác hạn chế tất cả các lớp được mở rộng lớp mục tiêu. Sealed classes can be considered more flexible form of final classes which provide a more declarative way than access modifiers to restrict the use of a superclass.

Các lớp "niêm phong" (Sealed Classes) có thể được coi là dạng linh hoạt hơn của các lớp cuối cùng (Final classes) cung cấp một cách khai báo hơn so với các công cụ sửa đổi truy cập để hạn chế việc sử dụng lớp cha (Superclass).

Các ràng buộc đối với Permitted Subclasses :

Permitted subclasses ( là lớp SavingsAccountCheckingAccount trong ví dụ ở trên) phải có chính xác một trong các công cụ sửa đổi sau đây để mô tả cách nó tiếp tục quá trình niêm phong được khởi tạo bởi lớp lớp cha ( superclass ) của nó:

  • final: Không thể mở rộng thêm (trong ví dụ trên, cả hai lớp con được phép sử dụng công cụ sửa đổi cuối cùng (Final modifier).
  • sealed: Chỉ có thể được mở rộng bởi các lớp con được phép (permitted subclasses) của nó. Bằng cách đó, chúng ta có thể hạn chế thêm phân lớp (subclassing).
  • non-sealed: Có thể được mở rộng bởi các lớp con không xác định (unknown subclasses); một lớp được "niêm phong" không thể ngăn các lớp con được phép của nó thực hiện điều này.

Ngoài những hạn chế ở trên, các permitted classes phải ở cùng mô-đun với lớp "niêm phong" (nếu lớp "niêm phong" nằm trong mô-đun đã đặt tên) hoặc trong cùng một gói (package) (nếu lớp được niêm phong nằm trong mô-đun chưa được đặt tên, như trong file Account.java trong ví dụ ở trên). Xem hướng dẫn về module tại đây

Tại sao chúng ta cần đến nó ?

Trong Java, hệ thống lớp phân cấp ( class hierarchy ) cho phép chúng ta sử dụng lại code thông qua kế thừa. Tuy nhiên, mục đích của phân cấp lớp không phải lúc nào cũng sử dụng lại code.

Đôi khi, mục đích của nó là mô hình hóa các khả năng khác nhau tồn tại trong một miền, chẳng hạn như các loại Accounts (tài khoản) được hỗ trợ bởi ứng dụng tài chính (như trong ví dụ trên). Khi phân cấp lớp được sử dụng theo cách này, mô hình hạn chế lớp con dự kiến ​​có thể đạt được thông qua các từ khóa niêm phong / cho phép (Sealed/Permits).