Thứ Sáu, 9 tháng 5, 2008

Java Annotation là gì?

Trong việc phát triển các thư viện, framework, công cụ,... chúng ta cần đánh dấu các hàm, class hoặc phương thức để có thể tìm kiếm đúng và nhanh hơn cho một tiến trình xử lý. Đặt mình vào hoàn cảnh này, bạn phải làm như thế nào?

15 nhận xét:

  1. Thông thường, trước Java 5 người ta hay dùng Properties (một dạng từ điển bao gồm key, value), XML hay thậm chí thô thiển hơn là comment code để làm việc này (điển hình cho việc dùng comment code chính Hibernate).

    Chẳng hạn, trong một ứng dụng như Hibernate, việc chuyển đổi giá trị của một trường từ Java Bean (Java Object) sang trường của bảng trong cơ sở dữ liệu thì ta phải đánh dấu vào đó tên trường là gì, thuộc bảng nào. Nhờ đó, Hibernate có thể chuyển đổi thành câu lệnh SQL tương ứng và tiến hành execute (thực thi) để dữ liệu từ Bean để chuyển vào database. Ngược lại, việc chuyển đổi dữ liệu từ bản ghi trong cơ sở dữ liệu sang Java Bean cũng có thể phải dùng đến những đánh dấu. Nhờ vào các hệ thống lookup class như ClassLoader mà chúng ta có thể tìm thấy class. Nhưng Class này có tên không tương ứng với tên bảng trong cơ sở dữ liệu thì buộc phải dùng những đánh dấu trong class để kiểm tra. Các trường trong bảng được map (ánh xạ giá trị) sang trường của Java Bean. Do đó, trong nhu cầu thực tế phát triển phần mềm, chúng ta cần những đánh dấu code.

    Giải quyết bài toán đó, người ta thường dùng các file properties, XML config hoặc comment code để đánh dấu. Đến Java 5 thì Sun thêm vào cái gọi là Annotation.

    Annotation trước tiên được hiểu là một dạng meta data. Meta data là đặc tả dữ liệu cho một đối tượng, giá trị gì đó. Chẳng hạn các tập tin mp3, ảnh, hoặc một bài viết có thể có meta data dạng XML Format là RSS. Đặc tả dữ liệu là một tập giá trị chứa những thông tin gắn gọn, cơ bản mô tả về đối tượng nào đó. Chẳng hạn, với một bài hát thì meta data có thể bao gồm: tên ca sĩ trình bày, tên nhạc sĩ, bài hát này hát trong bao lâu,... Meta data không phải là "siêu dữ liệu" như một số người từng dịch thô thiển từ tiếng Anh sang tiếng Việt.

    Java Annotation không phải là một định dạng cố định được cung cấp trực tiếp từ JRE. Nghĩa là chúng ta có thể định nghĩa Annotation cho framework, thư việc, ứng dụng,... mà chúng ta phát triển. Chẳng hạn, với bài toán của Hibernate kia thì Annotation sẽ ứng dụng như sau:

    Ta có một bảng trong cơ sở dữ liệu là HocSinh với ba trường là: ID, Ten, Diem. Yêu cầu của những ứng dụng dùng đến Hibernate là phải map được giá trị này từ bảng HocSinh sang một Java Bean (Java Object) tương ứng. Nhà thiết kế và quản trị cơ sở dữ liệu và nhà phát triển có thể là 2 người, làm hai công việc đó, tách biệt nhau.

    Nhà phát triển viết một Class là :

    public class Student {
    private int id;
    private String name;
    private String score;
    // Các setter và getter
    }

    Giá trị từ một bảng có thể được map tự động sang một đối tượng Student và ngược lại. Như vậy, nếu dùng đánh dấu thì có nhiều cách như đặt tên Class tương ứng với bảng, đặt comment, properties,...Như đã thấy, tên bảng và các trường trong bảng không trùng với tên class và các trường trong class. Một cách là bắt lập trình viên phải đặt tên tương ứng với tên bảng. Nhưng như vậy sẽ làm cứng nhắc, giới hạn phạm vi linh động trong việc chọn tên vì một dự án thường rất nhiều class. Người ta hay dùng đến comment, properties, XML hơn.

    Annotation là một sáng kiến hiện đại, hiệu quả, ngắn gọn, nhanh,...hơn rất nhiều so với các phương pháp khác. Nhà thiết kế Hibernate có thể tạo ra các Annotation cho framework của riêng họ. Chẳng hạn:

    public @interface Hibernate_Table {
    String value();
    }

    public @interface Hibernate_Field {
    String value();
    }

    Như vậy, lập trình viên sẽ đánh dấu Java Bean của họ như sau:

    @Hibernate_Table("HocSinh")
    public class Student {
    @Hibernate_Field("ID")
    private int id;
    @Hibernate_Field("Ten")
    private String name;
    @Hibernate_Field("Diem")
    private String score;
    // Các setter và getter
    }

    Bạn thấy đó, chỉ cần nhìn vào class ta cũng biết được Bean tạo ra sẽ đẩy dữ liệu vào đâu.

    Từng là một người tham gia thiết kế và phát triển một WebFramework trong sản phẩm mới của eXo Portal là eXo WebOS nên tôi biết được những lợi điểm rất lớn. Xin được điểm qua một số dưới đây:

    - Tường minh: Nhìn vào class trên bạn có thể thấy rõ mục đích.
    - Đơn giản.
    - Tránh được rất nhiều lỗi trong Runtime:
    Trong lập trình, chúng ta thường rất sợ lỗi về runtime. Lỗi được báo ở khâu compile thường ít nguy hiểm và được giải quyết nhanh chóng bởi lập trình viên nhưng lỗi trong runtime là những lỗi khoai, khó nhằn, mất nhiều thời gian để tìm ra nguyên nhân.

    Annotation là một cách để đẩy các lỗi cú pháp trong quá trình config về khâu compile. Nghĩa là compiler có thể báo nhanh cho lập trình viên một số config sai trong lúc dịch. Nếu dùng các phương pháp như comment, properties hoặc XML thì các lỗi này chỉ được báo trong runtime bởi chúng đơn thuần là text data.

    - Ứng dụng chạy nhanh hơn: Việc dùng định dạng như XML chúng ta phải tốn thời gian, bộ nhớ để chuyển đổi từ XML sang các dạng đối tượng có API để dễ tương tác lệnh như DOM hoặc SAX cũng là một trở ngại. Dùng Annotation thì đỡ đi được rất nhiều.

    Vì không có nhiều thời gian nên tôi không thể viết trình bày chi tiết. Có lẽ những coder làm việc với Annotation sẽ tự chiêm nghiệm được hiệu quả mà Framework hỗ trợ Annotation mang lại.

    Tham khảo thêm:

    Sun Docs
    Java Vietnam

    Trả lờiXóa
  2. Cảm ơn anh, bài viết rất hay! Em sẽ nghiên cứu thêm xem

    Trả lờiXóa
  3. Em thường xuyên đọc bài của anh, nhưng lâu lâu mới thấy anh viết :(,

    Trả lờiXóa
  4. Cám ơn em. Anh bận mà, hơn nữa cũng ít đề tài nên ít viết thôi. Cố gắng mỗi tuần vài bài thôi.

    Trả lờiXóa
  5. cam on anh nhieu lam,em dang lam bao cao ve annotation nay ma khong biet ja nhieu ve no het,may doc duoc bai cua anh

    Trả lờiXóa
  6. Thông tin bài viết của anh thật bổ ích. Hy vọng trong tương lai anh sẽ có thêm nhiều bài viết hay nữa. Cảm ơn anh rất nhiều

    Trả lờiXóa
  7. Em cũng đã hiểu một chút rôi. Cảm ơn anh.

    Trả lờiXóa
  8. cảm ơn anh rất nhiều!

    Trả lờiXóa
  9. Bai viet cua ban rat hay. Thanks nhieu!

    Trả lờiXóa
  10. copy cua nguoi khac ma khong dan nguon!

    Trả lờiXóa
  11. Chào anh , Như vậy thì mình nên dùng Annotation thay cho XML phải không , Vì mình thời gian chạy sẽ nhanh hơn.
    Trừ một số trường hợp mình muốn cho người dùng tự config thì mới xử dụng XML

    Trả lờiXóa
  12. Rất cảm ơn anh, nhờ những bài viết của anh mà e nâng cao được kiến thức javacore, đi phỏng vấn cũng an tâm hơn nhiều phần.

    Trả lờiXóa
  13. Bài viết của anh ngắn gọn, xúc tích, rất hay. Sau khi đọc xong em đã hiểu hơn về annotation.
    Cảm ơn anh.

    Trả lờiXóa

nhudinhthuan@gmail.com