Helpex - Trao đổi & giúp đỡ Đăng nhập

Lombok, AutoValue và Immutables

Tôi thích Brandon 's gợi ý của một bài đăng blog so sánh dự án Lombok , AutoValue , và Immutables và đây là một bài mà cố gắng để làm điều đó. Tôi đã trình bày riêng về Project Lombok , AutoValueImmutables với những cái nhìn tổng quan ngắn gọn, nhưng bài đăng này khác ở chỗ nó nêu bật những điểm giống và khác nhau giữa chúng.

Lombok, AutoValue và Immutables chia sẻ khá nhiều điểm chung và tôi cố gắng tóm tắt những điểm tương đồng này trong câu mô tả duy nhất này: Lombok, AutoValue và Immutables sử dụng xử lý chú thích để tạo mã soạn sẵn cho các hoạt động phổ biến được sử dụng bởi các lớp đối tượng giá trị. Phần còn lại của bài đăng này xem xét những điểm tương đồng này chi tiết hơn và đối lập ba cách tiếp cận.

Tạo mã

Lombok, AutoValue và Immutables đều được thiết kế để tạo mã soạn sẵn chi tiết từ các biểu diễn mã ngắn gọn tập trung vào logic nghiệp vụ cấp cao và để lại các chi tiết triển khai cấp thấp cho quá trình tạo mã. Các phương thức đối tượng phổ biến như toString () , equals (Object)hashCode () rất quan trọng nhưng cần được viết chính xác. Rất dễ mắc lỗi với những điều này và ngay cả khi chúng được viết chính xác ban đầu (bao gồm cả thông qua tạo IDE), chúng có thể bị bỏ qua khi các thay đổi khác được thực hiện đối với lớp ảnh hưởng đến chúng.

Đối tượng giá trị

Lombok , AutoValueImmutables đều hỗ trợ tạo " đối tượng giá trị ". Trong khi AutoValue thực thi nghiêm ngặt việc tạo các đối tượng giá trị, Immutables cho phép các đối tượng được tạo có thể sửa đổi nếu @Modifiable được chỉ định và Lombok hỗ trợ nhiều cấp độ sửa đổi trong các lớp được tạo với các chú thích như @Set@Data .

Các đối tượng ngoài giá trị

AutoValue là tập trung vào thế hệ của các đối tượng có giá trị và hỗ trợ tạo ra các lĩnh vực, xây dựng / người xây dựng, phương pháp accessor bê tông, và triển khai các phương pháp thông thường equals(Object), hashCode()toString()dựa trên các phương pháp trừu tượng trong lớp mẫu.

Immutables cung cấp khả năng tương tự như được cung cấp bởi AutoValue và thêm khả năng tạo các lớp có thể sửa đổi với @ Value.Modifiable . Immutables cũng cung cấp các tính năng bổ sung bao gồm:

Lombok cung cấp khả năng tạo lớp giá trị tương tự như AutoValue với chú thích @Value và cung cấp khả năng tạo các lớp có thể sửa đổi với chú thích @Data . Lombok cũng cung cấp các tính năng bổ sung  bao gồm:

Dựa trên xử lý chú thích

Lombok , AutoValueImmutables đều tạo ra nhiều mã soạn sẵn chi tiết hơn từ mã mẫu ngắn gọn hơn thông qua xử lý chú thích . Mỗi javax.annotation.processing.Processortệp bao gồm một định nghĩa trong META-INF/serviceskhu vực tệp JAR của nó như là một phần của quá trình khám phá bộ xử lý chú thích tiêu chuẩnmột phần của trình biên dịch javac .

Không phải tất cả quá trình xử lý chú thích đều giống nhau

Mặc dù Lombok, AutoValue và Immutables đều sử dụng xử lý chú thích thông qua javac, các chi tiết về cách Lombok sử dụng xử lý chú thích khác với cách AutoValue và Immutables thực hiện. AutoValue và Immutables sử dụng xử lý chú thích theo nghĩa thông thường hơn và tạo nguồn từ nguồn. Mã nguồn lớp được tạo bởi AutoValue và Immutables không được đặt tên giống như lớp mẫu và trên thực tế, nó mở rộng lớp mẫu. AutoValue và Immutables đều đọc lớp mẫu và tạo ra một lớp hoàn toàn mới trong mã nguồn Java với tên riêng có tất cả các phương thức và trường được tạo. Điều này tránh bất kỳ xung đột tên nào với lớp mẫu và làm cho nó khá dễ dàng để trộn mã nguồn lớp mẫu và mã nguồn lớp đã tạo trong cùng một dự án IDE vì chúng thực tế là các lớp khác nhau.

Tạo AutoValue thông qua xử lý chú thích

Lombok, AutoValue và Immutables

Tạo của Immutables thông qua xử lý chú thích

Lombok, AutoValue và Immutables

Lombok tiếp cận việc tạo thông qua xử lý chú thích khác với AutoValue và Immutables. Lombok tạo một .classtệp đã biên dịch có cùng tên lớp với mã nguồn "mẫu" và thêm các phương thức đã tạo vào phiên bản đã biên dịch này. Nhà phát triển chỉ thấy mã mẫu ngắn gọn khi xem .javatệp, nhưng lại thấy .classtệp đã biên dịch với các phương thức không có trong mã nguồn khi xem .classtệp. Thế hệ bởi Lombok không phải là một tệp nguồn khác mà là một phiên bản được biên dịch nâng cao của nguồn gốc. Có một tùy chọn delombok mà người ta có thể sử dụng với Lombok để xem nguồn được tạo đằng sau phần mềm nâng cao.classtệp trông giống như vậy, nhưng dự án thực sự được thiết kế để đi thẳng từ nguồn mẫu ngắn gọn sang lớp được biên dịch nâng cao mà không cần hoặc sử dụng cho tệp nguồn nâng cao trung gian. Các delomboktùy chọn có thể được sử dụng để xem những gì là nguồn gốc tạo ra sẽ như thế nào hay, có lẽ quan trọng hơn, có thể được sử dụng trong tình huống mà nó là khó hiểu các công cụ để có một nguồn không phù hợp (ngắn gọn template .javafile) và lớp tạo (nâng cao .classtập tin của cùng tên) trong cùng một không gian.

Lombok's Generation thông qua xử lý chú thích

Lombok, AutoValue và Immutables

Cách tiếp cận của Lombok để xử lý chú thích ít thông thường hơn so với cách tiếp cận mà AutoValue và Immutables sử dụng và một số, bao gồm cả người tạo ra Lombok , đã gọi cách tiếp cận này là " một cuộc tấn công ". Một lời giải thích hay về "thủ thuật" hay "hack" của Lombok có trong bài đăng của neildo Dự án Lombok - Trick Explained , trích dẫn Tổng quan về biên dịch OpenJDK cũng đầy đủ thông tin .

Các lý do chính dẫn đến tranh cãi xung quanh cách tiếp cận của Lombok có liên quan mật thiết với nhau và là nó sử dụng các API không chuẩn và do đó, có thể khó tích hợp tốt với IDE và các công cụ khác thực hiện quá trình biên dịch riêng của chúng (chẳng hạn như javadoc ). Bởi vì AutoValue và Immutables tự nhiên tạo mã nguồn với tên lớp mới, bất kỳ công cụ và IDE truyền thống nào cũng có thể hoạt động với nguồn được tạo cùng với nguồn mẫu mà không gặp bất kỳ vấn đề lớn nào.

Tóm tắt những điểm tương đồng và khác biệt

* cuộn để xem toàn bộ bảng

Đặc tínhDự án LombokAutoValueBất biếnBình luận
Phiên bản bao gồm1,16,8 ( 2016 )1.2 ( 2016 )2.2.8 (2016)Phiên bản được sử dụng cho bài đăng này
Tổng quan của tôi201020162016
Năm bắt nguồn200920142014
Giấy phépMIT ( cũng )Apache 2Apache 2Tất cả nguồn mở
Java tối thiểu1,61,61,7Phiên bản Java được hỗ trợ cũ nhất
Sự phụ thuộcASM ( để tích hợp Eclipse )ASM(Tùy chọn) Phụ thuộc thời gian chạy : ỔiCác thư viện phụ thuộc vào (bao gồm) tại thời điểm biên dịch
javax.annotation.processing.Processorlombok.launch.AnnotationProcessorHider $ AnnotationProcessorcom.google.auto.value.processor.AutoAnnotationProcessor
com.google.auto.value.processor.AutoValueBuilderProcessor
com.google.auto.value.processor.AutoValueProcessor
org.immutables.processor.ProxyProcessorVị trí thông số kỹ thuật của bộ xử lý chú thích tiêu chuẩn
Mối quan hệ nguồn đã tạo với nguồn mẫuLớp được tạo nâng cao thay thế nguồn mẫuNguồn được tạo mở rộng nguồn mẫuLombok chỉ hiển thị nguồn được tạo với tùy chọn "delombok"
Truy cập nguồn đã tạoChỉ định  tùy chọn delombokMặc địnhMặc địnhĐể xem / kiểm soát mã nguồn đã tạo
Các phương pháp đã tạoequals (Object) , hashCode () , toString () , xây dựng / người xây dựng , accessors , settersbằng (Đối tượng), mã băm (), toString (), xây dựng / trình tạo, trình truy cậpbằng (Đối tượng) , hashCode () , toString () , xây dựng / người xây dựng , trình truy cập, trình thiết lập
Mức độ bất biếnCho phép khả năng thay đổi hoàn toàn với @Set cấp trường nhưng cung cấp @Value  khi muốn có tính bất biếnThực thi tính bất biến nghiêm ngặt" Rất thiên về tính bất biến " nhưng cung cấp Giá trị @ ở cấp độ lớp.AutoValue được nhiều người ủng hộ nhất và Lombok được ít ý kiến ​​nhất
Tính năng thưởngDọn dẹp tài nguyên
Immutable hoặc  Biên Đổi
lén lút ném ngoại lệ kiểm tra
đối tượng ổ khóa đồng bộ
Logging chú thích
More ...
Trung thành với khái niệm Đối tượng Giá trị 
Các phương pháp hay nhất đã được lập thành tài liệu
Tùy chỉnh kiểu
Tuần tự hóa (bao gồm JSON )
Mã băm được tính toán trước
Thêm ...

Cân nhắc khi lựa chọn

Lombok, AutoValue và Immutables là những bộ công cụ tương tự cung cấp những lợi ích tương tự và bất kỳ bộ công cụ nào trong số ba bộ này đều có thể được sử dụng thành công bởi một loạt các ứng dụng. Tuy nhiên, có sự khác biệt giữa các bộ công cụ này có thể được xem xét khi chọn bộ công cụ nào trong số chúng để sử dụng.

  • Lombok tạo ra một lớp có cùng gói và tên lớp với mẫu trong khi AutoValue và Immutables tạo ra các lớp mở rộng lớp mẫu và có tên lớp riêng của chúng (nhưng cùng một gói).
    • Các nhà phát triển muốn .classtệp đã biên dịch có cùng gói và tên giống như lớp mẫu sẽ thích Lombok hơn.
    • Các nhà phát triển thích mã nguồn được tạo luôn có sẵn và không xung đột theo bất kỳ cách nào với nguồn mẫu sẽ thích AutoValue hoặc Immutables.
  • AutoValue là bộ công cụ được nhiều người ủng hộ nhất trong số ba bộ công cụ và Lombok có xu hướng ít ý kiến ​​nhất.
    • Các nhà phát triển muốn thực thi chặt chẽ các đặc điểm của "đối tượng giá trị" có thể thích AutoValue hơn. AutoValue không cung cấp cơ chế để các lớp được tạo có thể sửa đổi và thực thi một số quy tắc khác mà hai bộ công cụ khác không thực thi. Ví dụ: AutoValue chỉ cho phép lớp mẫu được thể hiện dưới dạng một abstractlớp chứ không phảiinterface để tránh "[mất] sự đảm bảo tính bất biến ... và ... [mời] thêm ... hành vi xấu." Mặt khác, bất biến cho phép interfaces được sử dụng làm khuôn mẫu để tạo mã.
    • Các nhà phát triển muốn thoát khỏi tính bất biến nghiêm ngặt hoặc sử dụng một số tính năng AutoValue không hỗ trợ vì lợi ích của các ý kiến ​​về phương pháp hay nhất có thể sẽ thích Immutables hoặc Lombok.
  • AutoValue và Immutables sử dụng xử lý chú thích tiêu chuẩn và Lombok sử dụng phương pháp xử lý chú thích không chuẩn.
    • Các nhà phát triển muốn tránh các phụ thuộc không chuẩn sẽ ưu tiên AutoValue hoặc Immutables.
    • Các nhà phát triển muốn tránh các plugin IDE hoặc các công cụ đặc biệt khác bên ngoài javacvà hỗ trợ Java IDE cơ bản sẽ ưu tiên AutoValue hoặc Immutable.
  • Cả ba bộ công cụ đều hỗ trợ một số mức độ tùy chỉnh và các nhà phát triển muốn tùy chỉnh mã được tạo có thể muốn chọn bộ công cụ cho phép họ tùy chỉnh mã được tạo theo cách họ mong muốn.
    • Lombok cung cấp một hệ thống cấu hình cho phép điều chỉnh một số khía cạnh của mã được tạo theo quy ước mong muốn.
    • Immutables cung cấp khả năng tùy chỉnh kiểu cho phép một số khía cạnh của mã đã tạo được điều chỉnh theo quy ước mong muốn.
    • Các Làm thế nào Tôi? phần Hướng dẫn sử dụng của AutoValue giải thích một số cách tiếp cận để tùy chỉnh mã mà AutoValue tạo ra (thường thông qua việc sử dụng hoặc tránh các từ khóa trong lớp mẫu).
  • AutoValue và Lombok được hỗ trợ trên JDK 1.6, nhưng Immutables yêu cầu JDK 1.7.

Phần kết luận

Lombok, AutoValue và Immutables có nhiều điểm chung và cả ba đều có thể được sử dụng để tạo các lớp giá trị từ các tệp mẫu đơn giản. Tuy nhiên, mỗi cái cũng cung cấp những ưu điểm và tính năng khác nhau có thể làm cho bất kỳ cái nào trong số chúng hấp dẫn hơn hoặc ít hơn đối với các nhà phát triển so với những cái khác dựa trên hoàn cảnh riêng của các nhà phát triển.

1 hữu ích 0 bình luận 22k xem chia sẻ

Có thể bạn quan tâm

loading