Mới bắt đầu sử dụng Lombok ngày hôm nay. Cho đến nay tôi thích nó, nhưng một nhược điểm tôi không thấy đề cập đến là tái cấu trúc hỗ trợ.
Nếu bạn có một lớp được chú thích @Data
, nó sẽ tạo ra các getters và setters cho bạn dựa trên tên trường. Nếu bạn sử dụng một trong những getters đó trong một lớp khác, sau đó quyết định trường được đặt tên kém, nó sẽ không tìm thấy cách sử dụng của các getters và setters đó và thay thế tên cũ bằng tên mới.
Tôi sẽ tưởng tượng điều này sẽ phải được thực hiện thông qua một trình cắm thêm IDE chứ không phải thông qua Lombok.
CẬP NHẬT (ngày 22 tháng 1 năm 13)
Sau khi sử dụng Lombok trong 3 tháng, tôi vẫn giới thiệu nó cho hầu hết các dự án. Tôi đã làm, tuy nhiên, tìm thấy một nhược điểm khác tương tự như được liệt kê ở trên.
Nếu bạn có một lớp, giả sử MyCompoundObject.java
có 2 thành viên, cả hai được chú thích @Delegate
, nói myWidgets
và myGadgets
khi bạn gọi myCompoundObject.getThingies()
từ một lớp khác, không thể biết liệu nó có được ủy quyền cho Widget
hoặc Gadget
bởi vì bạn không còn có thể chuyển sang nguồn trong IDE.
Sử dụng Eclipse "Tạo các phương thức đại biểu ..." cung cấp cho bạn chức năng tương tự, cũng nhanh như vậy và cung cấp nhảy nguồn. Nhược điểm của nó là làm tắc nghẽn nguồn của bạn với mã soạn sẵn để lấy trọng tâm ra khỏi những thứ quan trọng.
CẬP NHẬT 2 (ngày 26 tháng 2 năm 13)
Sau 5 tháng, chúng tôi vẫn đang sử dụng Lombok, nhưng tôi có một số phiền toái khác. Việc thiếu một getter & setter được khai báo có thể gây khó chịu vào những lúc bạn đang cố gắng làm quen với mã mới.
Ví dụ: nếu tôi thấy một phương thức được gọi getDynamicCols()
nhưng tôi không biết nó là gì, tôi có một số trở ngại thêm để xác định mục đích của phương pháp này. Một số trở ngại là Lombok, một số là thiếu plugin thông minh Lombok. Rào cản bao gồm:
- Thiếu JavaDocs. Nếu tôi javadoc trường, tôi sẽ hy vọng getter và setter sẽ kế thừa javadoc đó thông qua bước biên dịch Lombok.
- Chuyển đến định nghĩa phương thức đưa tôi đến lớp, nhưng không phải là thuộc tính đã tạo ra getter. Đây là một vấn đề plugin.
- Rõ ràng là bạn không thể đặt điểm dừng trong getter / setter trừ khi bạn tạo hoặc mã hóa phương thức.
- LƯU Ý: Tìm kiếm Tham khảo này không phải là vấn đề như tôi nghĩ đầu tiên. Bạn cần phải sử dụng một phối cảnh cho phép xem Outline mặc dù. Không phải là một vấn đề cho hầu hết các nhà phát triển. Vấn đề của tôi là tôi đang sử dụng Mylyn đang lọc
Outline
chế độ xem của tôi , vì vậy tôi đã không thấy các phương pháp. Thiếu tìm kiếm tài liệu tham khảo. Nếu tôi muốn xem ai đang gọi getDynamicCols(args...)
, tôi phải tạo hoặc mã bộ setter để có thể tìm kiếm tài liệu tham khảo.
CẬP NHẬT 3 (Mar 7 '13)
Học cách sử dụng các cách làm khác nhau trong Eclipse tôi đoán. Bạn thực sự có thể đặt điểm dừng có điều kiện (BP) trên phương thức được tạo bởi Lombok. Sử dụng Outline
chế độ xem, bạn có thể nhấp chuột phải vào phương thức Toggle Method Breakpoint
. Sau đó, khi bạn nhấn BP, bạn có thể sử dụng Variables
chế độ xem gỡ lỗi để xem phương thức được tạo có tên các tham số (thường giống với tên trường) và cuối cùng, sử dụng Breakpoints
chế độ xem để nhấp chuột phải vào BP và chọn Breakpoint Properties...
để thêm một điều kiện. Đẹp.
CẬP NHẬT 4 (16 tháng 8 '13)
Netbeans không thích nó khi bạn cập nhật các phụ thuộc Lombok trong Maven pom của bạn. Dự án vẫn biên dịch, nhưng các tệp bị gắn cờ vì có lỗi biên dịch vì không thể thấy các phương thức mà Lombok đang tạo. Xóa bộ nhớ cache Netbeans giải quyết vấn đề. Không chắc chắn nếu có tùy chọn "Dự án sạch" như trong Eclipse. Vấn đề nhỏ, nhưng muốn làm cho nó được biết đến.
CẬP NHẬT 5 (17 tháng 1, 14)
Lombok không phải lúc nào cũng chơi đẹp với Groovy, hoặc ít nhất là groovy-eclipse-compiler
. Bạn có thể phải hạ cấp phiên bản trình biên dịch.
Maven Groovy và Java + Lombok
CẬP NHẬT 6 (ngày 26 tháng 6 năm 14)
Một lời cảnh báo. Lombok hơi gây nghiện và nếu bạn làm việc trong một dự án mà bạn không thể sử dụng nó vì một số lý do, nó sẽ gây khó chịu cho bạn. Bạn có thể tốt hơn là không bao giờ sử dụng nó cả.
CẬP NHẬT 7 (23/07/14)
Đây là một chút cập nhật thú vị vì nó trực tiếp giải quyết vấn đề an toàn của việc áp dụng Lombok mà OP đã hỏi.
Kể từ v1,14, @Delegate
chú thích đã bị hạ cấp thành trạng thái Thử nghiệm. Các chi tiết được ghi lại trên trang web của họ ( Tài liệu đại biểu Lombok ).
Vấn đề là, nếu bạn đang sử dụng tính năng này, các tùy chọn sao lưu của bạn bị hạn chế. Tôi thấy các tùy chọn như:
- Xóa thủ công
@Delegate
các chú thích và tạo / mã hóa mã số đại biểu. Điều này khó hơn một chút nếu bạn đang sử dụng các thuộc tính trong chú thích.
- Delombok các tệp có
@Delegate
chú thích và có thể thêm lại vào các chú thích mà bạn muốn.
- Không bao giờ cập nhật Lombok hoặc duy trì một ngã ba (hoặc sống với việc sử dụng các tính năng trải nghiệm).
- Delombok toàn bộ dự án của bạn và ngừng sử dụng Lombok.
Theo như tôi có thể nói, Delombok không có tùy chọn để xóa một tập hợp các chú thích ; tất cả hoặc không có gì ít nhất là đối với ngữ cảnh của một tệp. Tôi đã mở một vé để yêu cầu tính năng này với cờ Delombok, nhưng tôi không mong đợi điều đó trong tương lai gần.
CẬP NHẬT 8 (ngày 20 tháng 10 năm 14)
Nếu đó là một lựa chọn cho bạn, Groovy cung cấp hầu hết các lợi ích tương tự của Lombok, cộng với một số lượng lớn các tính năng khác, bao gồm cả @Delegate . Nếu bạn nghĩ rằng bạn sẽ gặp khó khăn trong việc bán ý tưởng cho các quyền lực, hãy xem @CompileStatic
hoặc @TypeChecked
chú thích để xem liệu điều đó có thể giúp ích cho bạn không. Trên thực tế, trọng tâm chính của phiên bản Groovy 2.0 là an toàn tĩnh .
CẬP NHẬT 9 (ngày 1 tháng 9 năm 15)
Lombok vẫn đang được tích cực duy trì và nâng cao , điều này báo hiệu tốt đến mức độ an toàn của việc áp dụng. các @Builder chú thích là một trong những tính năng mới yêu thích của tôi.
CẬP NHẬT 10 (17/11/2015)
Điều này có vẻ không liên quan trực tiếp đến câu hỏi của OP, nhưng đáng để chia sẻ. Nếu bạn đang tìm kiếm các công cụ để giúp bạn giảm số lượng mã soạn sẵn mà bạn viết, bạn cũng có thể kiểm tra Google Auto - cụ thể là AutoValue . Nếu bạn nhìn vào sàn trượt của họ , danh sách Lombok là một giải pháp khả thi cho vấn đề họ đang cố gắng giải quyết. Nhược điểm họ liệt kê cho Lombok là:
- Mã được chèn là vô hình (bạn không thể "nhìn thấy" các phương thức mà nó tạo ra) [ed note - thực sự bạn có thể, nhưng nó chỉ cần một trình dịch ngược]
- Các hack trình biên dịch là không chuẩn và dễ vỡ
- "Theo quan điểm của chúng tôi, mã của bạn không còn thực sự là Java"
Tôi không chắc mình đồng ý với đánh giá của họ đến mức nào. Và với những nhược điểm của AutoValue được ghi lại trong các slide, tôi sẽ gắn bó với Lombok (nếu Groovy không phải là một lựa chọn).
CẬP NHẬT 11 (8/2/2016)
Tôi phát hiện ra Spring Roo có một số chú thích tương tự . Tôi hơi ngạc nhiên khi phát hiện ra rằng Roo vẫn còn là một điều và việc tìm tài liệu cho các chú thích hơi khó hiểu. Việc loại bỏ cũng không dễ dàng như de-lombok. Lombok có vẻ như là sự lựa chọn an toàn hơn.
CẬP NHẬT 12 (17/2/2016)
Trong khi cố gắng đưa ra những lời biện minh cho lý do tại sao việc mang lại Lombok cho dự án mà tôi hiện đang làm việc lại an toàn, tôi đã tìm thấy một miếng vàng được thêm vào v1.14
- Hệ thống cấu hình ! Điều này có nghĩa là bạn có thể định cấu hình dự án để cho phép các tính năng nhất định mà nhóm của bạn cho là không an toàn hoặc không mong muốn. Tốt hơn nữa, nó cũng có thể tạo cấu hình thư mục cụ thể với các cài đặt khác nhau. Điều này thật tuyệt.
CẬP NHẬT 13 (ngày 4 tháng 10 năm 16)
Nếu loại điều này quan trọng với bạn, Oliver Gierke cảm thấy an toàn khi thêm Lombok vào Spring Data Rest .
CẬP NHẬT 14 (ngày 26 tháng 9 năm 17)
Như @gavenkoa đã chỉ ra trong các nhận xét về câu hỏi OP, hỗ trợ trình biên dịch JDK9 chưa khả dụng (Vấn đề # 985). Có vẻ như nó sẽ không phải là một sửa chữa dễ dàng cho nhóm Lombok để có được xung quanh.
CẬP NHẬT 15 (26/03/18)
Thay đổi Lombok cho biết kể từ v1.16.20 " Biên dịch lombok trên JDK1.9 hiện có thể thực hiện được " mặc dù # 985 vẫn mở.
Tuy nhiên, những thay đổi để phù hợp với JDK9, đòi hỏi một số thay đổi đột phá; tất cả bị cô lập với những thay đổi trong mặc định cấu hình. Có một chút liên quan đến việc họ đã giới thiệu các thay đổi vi phạm, nhưng phiên bản chỉ có số phiên bản "Tăng dần" (đi từ v1.16.18 đến v1.16.20). Vì bài đăng này là về sự an toàn, nếu bạn có một yarn/npm
hệ thống xây dựng tương tự tự động nâng cấp lên phiên bản gia tăng mới nhất, bạn có thể sẽ bị đánh thức một cách thô lỗ.
CẬP NHẬT 16 (ngày 9 tháng 1 năm 19)
Có vẻ như các vấn đề về JDK9 đã được giải quyết và Lombok hoạt động với JDK10, và thậm chí JDK11 theo như tôi có thể nói.
Một điều tôi nhận thấy mặc dù liên quan đến khía cạnh an toàn là thực tế là nhật ký thay đổi đi từ v1.18.2 đến v1.18.4 liệt kê hai mục là BREAKING CHANGE
!? Tôi không chắc chắn làm thế nào một thay đổi đột phá xảy ra trong một bản cập nhật "bản vá". Có thể là một vấn đề nếu bạn sử dụng một công cụ tự động cập nhật các phiên bản vá lỗi.
javac
để mở quyền truy cập vào cácsun.*
lớp bên trong ((