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 , AutoValue và Immutables 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) và 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 , AutoValue và Immutables đề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 và @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()
và 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:
- Cá thể Singleton
- Mã băm được tính toán trước
- Thực tập phiên bản
- Các triển khai bằng (Đối tượng), Mã băm () và toString () có thể tùy chỉnh bao gồm cả việc miễn trừ các trường khỏi chúng
- Tuần tự hóa cơ bản và nâng cao
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ọn dẹp tài nguyên
- Tạo trường ghi nhật ký
- Khóa đối tượng được đồng bộ hóa
- Lẻn quanh các trường hợp ngoại lệ đã kiểm tra
Dựa trên xử lý chú thích
Lombok , AutoValue và Immutables đề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.Processor
tệp bao gồm một định nghĩa trong META-INF/services
khu 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ẩn là mộ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
Tạo của Immutables thông qua xử lý chú thích
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 .class
tệ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 .java
tệp, nhưng lại thấy .class
tệp đã biên dịch với các phương thức không có trong mã nguồn khi xem .class
tệ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.class
tệ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 delombok
tù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 .java
file) và lớp tạo (nâng cao .class
tậ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
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ính | Dự án Lombok | AutoValue | Bất biến | Bình luận |
---|---|---|---|---|
Phiên bản bao gồm | 1,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ôi | 2010 | 2016 | 2016 | |
Năm bắt nguồn | 2009 | 2014 | 2014 | |
Giấy phép | MIT ( cũng ) | Apache 2 | Apache 2 | Tất cả nguồn mở |
Java tối thiểu | 1,6 | 1,6 | 1,7 | Phiên bản Java được hỗ trợ cũ nhất |
Sự phụ thuộc | ASM ( để tích hợp Eclipse ) | ASM | (Tùy chọn) Phụ thuộc thời gian chạy : Ổi | Cá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.Processor | lombok.launch.AnnotationProcessorHider $ AnnotationProcessor | com.google.auto.value.processor.AutoAnnotationProcessor com.google.auto.value.processor.AutoValueBuilderProcessor com.google.auto.value.processor.AutoValueProcessor | org.immutables.processor.ProxyProcessor | Vị 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ẫu | Lớp được tạo nâng cao thay thế nguồn mẫu | Nguồn được tạo mở rộng nguồn mẫu | Lombok chỉ hiển thị nguồn được tạo với tùy chọn "delombok" | |
Truy cập nguồn đã tạo | Chỉ định tùy chọn delombok | Mặc định | Mặc định | Để xem / kiểm soát mã nguồn đã tạo |
Các phương pháp đã tạo | equals (Object) , hashCode () , toString () , xây dựng / người xây dựng , accessors , setters | bằng (Đối tượng), mã băm (), toString (), xây dựng / trình tạo, trình truy cập | bằ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ến | Cho 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ến | Thự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ưởng | Dọ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
.class
tệ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.
- Các nhà phát triển muốn
- 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
abstract
lớ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épinterface
s đượ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.
- 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
- 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
javac
và 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.
Có thể bạn quan tâm
