Trong bài viết ngắn này, chúng ta sẽ tìm hiểu các API sẽ không còn dùng nữa trong tương lai và cách sử dụng @Deprecated annotation trong Java.
@Deprecated Annotation
Giả sử bạn đang phát triển một thư viện mã nguồn mở về xử lý ảnh. Theo thời gian, có một constructor, trường, hoặc một method nào đó mà chúng ta không muốn mọi người sử dụng nữa vì chúng không còn phù hợp hay có những constructor, method khác tối ưu và tiện lợi hơn. Thay vì xoá hẳn chúng sẽ làm mất khả năng tương thích ngược.
Ví dụ như một dự án họ đã sử dụng thư viện của bạn từ những version đầu và đã phát triển rất lâu. Nếu bạn xoá những method cũ không còn cần thiết và công bố phiên bản mới thì dự án kia sẽ không thể cập nhật phiên bản mới vì nó làm cho mã nguồn của họ không hoạt động.
Các bạn đừng bảo họ fix để làm sao có thể hoạt động với phiên bản mới nhé, vì mã nguồn của họ đã rất nhiều và doanh nghiệp họ rất ít khi chấp nhận bỏ thời gian để thay đổi mã nguồn cũ vừa tốn thời gian, công sức mà còn có thể gây ra lỗi ngoài ý muốn.
@Deprecated annotation được sử dụng để nói với các developer không nên sử dụng những API được chú thích bởi nó, vì có thể nó sẽ bị xoá bỏ trong tương lai hoặc không còn phù hợp hãy nên sử dụng những cái mới hơn, tiện ích hơn.
public class Worker { /** * Calculate period between versions * @deprecated * This method is no longer acceptable to compute time between versions. * <p> Use {@link Utils#calculatePeriod(Machine)} instead. * * @param machine instance * @return computed time */ @Deprecated public int calculate(Machine machine) { return machine.exportVersions().size() * 10; }
Hãy nhớ rằng trình biên dịch chỉ hiển thị cảnh báo API không dùng nữa nếu trong mã nguồn có sử dụng những API được chú thích với @Deprecated.Vì vậy, trong trường hợp này, nó sẽ chỉ hiển thị cảnh báo nếu có nơi nào sử dụng calculate() method.
Optional Attributes Added in Java 9
Java 9 thêm một số thuộc tính tùy chọn vào chú thích @Deprecated: since và forRemoval.
Thuộc tính since yêu cầu một Stribg cho phép chúng ta xác định phiên bản mà API được chú thích với @Deprecated annotation không được dùng nữa. Giá trị mặc định là một string rỗng.
Và forRemoval là một boolean cho phép chúng ta chỉ định liệu phần tử có bị xóa trong bản phát hành tiếp theo hay không. Giá trị mặc định của nó là false.
public class Worker { /** * Calculate period between versions * @deprecated * This method is no longer acceptable to compute time between versions. * <p> Use {@link Utils#calculatePeriod(Machine)} instead. * * @param machine instance * @return computed time */ @Deprecated(since = "4.5", forRemoval = true) public int calculate(Machine machine) { return machine.exportVersions().size() * 10; }
Nói một cách đơn giản, cách sử dụng ở trên có nghĩa là calculate() method đó đã không còn được chấp nhận kể từ 4.5 trong thư viện của chúng ta và nó đã được lên lịch xóa trong bản phát hành chính tiếp theo.
Sẽ rất hữu ích cho chúng ta khi thêm điều này vì trình biên dịch sẽ cung cấp giúp chúng ta cung cấp nhiều thông tin hơn đến những người dùng, những ai đang sử dụng thư viên nắm bắt được nhiều thông tin hơn.
Và hiện các IDE cũng đã hỗ trợ cho chúng ta việc tìm kiếm và phát hiện ra những method được chú thích @Deprecated sẽ có dấu gạch ngang, nếu forRemoval=true thì dấu gạch này sẽ là màu đỏ.
Kết bài
Trong bài viết ngắn này, chúng ta đã biết cách sử dụng chú thích @Deprecated và các thuộc tính tùy chọn của nó để đánh dấu mã không còn được sử dụng nữa.
Nguồn tham khảo
https://www.baeldung.com/java-deprecated