Lombok getter / setter so với bản ghi Java 14


10

Tôi yêu dự án Lombok nhưng trong những ngày này tôi đang đọc và thử một số tính năng mới của java 14.

Bên trong khả năng mới, có từ khóa bản ghi cho phép tạo một lớp với chức năng đã được tích hợp sẵn: hàm tạo, trường cuối cùng riêng tư, bộ truy cập, phương thức / hashCode, getters, phương thức toString.

Bây giờ câu hỏi của tôi là: tốt hơn là dựa vào tính năng của Lombok hoặc chúng ta nên bắt đầu sử dụng chức năng ghi:

Tốt hơn là sử dụng cái này:

record Person (String name, String surname) {}

hoặc rằng:

@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class GetterSetterExample {
  @Getter private int name;
  @Getter private int surname;
}

Những ưu và nhược điểm của cả hai phương pháp là gì?


Đối với một điều, recordsẽ không hoạt động cho những điều mong đợi các getters và setters kiểu JavaBeans.
Mark Rotteveel

2
Ý kiến ​​của Rotteveel có nghĩa là phương thức truy cập thuộc tính trên một bản ghi được đặt tên cùng tên của tài sản. Vì vậy, alice.phoneNumber()thay vì quy ước tiền tố JavaBeans get, như trong alice.getPhoneNumber().
Basil Bourque

1
Các recordtính năng là một tính năng xem trước , chưa sẵn sàng để sử dụng trong sản xuất.
Basil Bourque

Các bản ghi có rất nhiều hạn chế so với các lớp, ví dụ, một bản ghi không thể mở rộng một bản ghi hoặc lớp khác, hãy kiểm tra phần hạn chế trên JEP openjdk.java.net/jeps/359 này để biết thêm chi tiết
NAIT

Câu trả lời:


9

Lombok và recordtính năng của ngôn ngữ Java là những công cụ khác nhau cho những thứ khác nhau. Có một số chồng chéo bề ngoài, nhưng đừng để điều đó làm bạn mất tập trung.

Lombok chủ yếu là về sự thuận tiện cú pháp ; nó là một bộ xử lý macro được tải sẵn một số mẫu mã hữu ích đã biết. Nó không trao bất kỳ ngữ nghĩa nào; nó chỉ tự động hóa các mẫu, theo một số nút bạn đặt trong mã với các chú thích. Lombok hoàn toàn là về sự tiện lợi của việc triển khai các lớp mang dữ liệu.

Hồ sơ là một tính năng ngữ nghĩa ; chúng là bộ dữ liệu danh nghĩa . Bằng cách thực hiện một khai báo ngữ nghĩa Point một tuple (int x, int y), trình biên dịch có thể rút ra biểu diễn của nó, cũng như các giao thức xây dựng, khai báo, đẳng thức, băm và chuỗi, từ mô tả trạng thái này. Bởi vì họ mang ngữ nghĩa, người đọc và khung cũng có thể lý do với độ tin cậy cao hơn về API của hồ sơ. (Điều này cũng có thể thuận tiện về mặt cú pháp; nếu vậy, điều đó thật tuyệt.)


1
+1 Brian Goetz: Và giả sử rằng bạn có thể đưa phiên bản Lombok hiện tại vào IDE của mình. Tôi tự hỏi nếu Lombok có bất kỳ lợi thế có ý nghĩa nào liên quan đến việc đọc mã nhanh hơn mà một nhận xét lớp sẽ không được trao.
Trunk

4

Tôi cũng đã chơi xung quanh với sự kết hợp này một thời gian và với một chút thực hành, tôi có thể liệt kê ra những khác biệt sau:

Lombok

  • Bản ghi chưa phải là một tính năng được phát hành và chỉ là một tính năng xem trước. Vì vậy, ở lại với Lombok có ý nghĩa hơn.
  • Chúng chưa phải là một công cụ mạnh mẽ để loại bỏ tất cả Lombok cùng nhau. Lưu ý rằng thư viện có nhiều thứ để cung cấp hơn là chỉ @Getter, @AllArgsConstructor, @ToString, @EqualsAndHashCode.
  • Tự trải nghiệm, điều EqualsAndHashCodenày không giống như bạn mong đợi khi chuyển sang hồ sơ .

Hồ sơ

  • Một lưu ý khác, nếu yêu cầu đại diện đối tượng của bạn là "nhà cung cấp dữ liệu", bạn vẫn có thể tìm kiếm lợi thế của Bản ghi mà không cần dựa vào thư viện bổ sung để giảm mã soạn sẵn để thực hiện chính xác điều đó. Đó là lý do mà như một lưu ý kết luận blog này đọc như sau:

    Nó cũng sẽ giúp các nhóm loại bỏ nhiều triển khai được mã hóa bằng tay của mẫu cơ bản và giảm hoặc loại bỏ sự cần thiết của các thư viện như Lombok.

Tất nhiên, trên cơ sở hàng ngày, luôn luôn khôn ngoan dựa trên các yêu cầu của một dự án để chọn cách làm theo và thực hành.


Lưu ý - Tôi sẽ cố gắng cập nhật thông tin này với nhiều ví dụ để trở thành người dùng sử dụng cả hai thường xuyên.
Naman

3

NB: Thay vì cây chú thích Giáng sinh đó, bạn chỉ có thể sử dụng @Valuetrên lớp. Lưu ý rằng điều này làm cho lớp cuối cùng, và làm cho tất cả các trường cả riêng tư và cuối cùng, và cung cấp cho bạn tất cả phần còn lại. Điều này gần với hồ sơ là gì (chúng cũng là cuối cùng và tất cả các trường bên trong là cuối cùng).

recordvẫn còn trong bản xem trước, vì vậy đối với mã sản xuất, rõ ràng là nó chưa phù hợp. Sử dụng lombok.

Khi hồ sơ không được xem trước, nó phức tạp hơn. Lombok là FAR linh hoạt hơn; bạn có thể dễ dàng trao đổi trong một số khía cạnh mới mà không cần phải viết lại tất cả mã (ví dụ: bạn có thể thêm mệnh đề 'extends' vào lớp của mình mà không cần phải viết tay phương thức bằng và hashCode; Lombok cũng cung cấp cho bạn nhiều tính năng hơn: Ví dụ: bạn có thể thêm trình tạo bằng cách thêm @Builderchú thích; không một cái gì đó hồ sơ có thể làm.

Nếu rất có thể bạn sẽ không sử dụng bất kỳ thứ gì cho lớp bạn đang thiết kế - Tôi sẽ sử dụng các bản ghi.

TUYÊN BỐ TỪ CHỐI: Tôi là người đóng góp cốt lõi cho Dự án Lombok.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.