2010-10-05 46 views
13

Tôi đang viết lại một số mã lộn xộn mà quản lý một cơ sở dữ liệu, và thấy rằng các lập trình viên ban đầu tạo ra một lớp ánh xạ tới cơ sở dữ liệu như vậy:Nhà xây dựng rõ ràng bằng Lombok?

(Tôi đã gỡ bỏ mã không cần thiết mà không có mục đích trong câu hỏi này)

@Entity 
@Data 
@EqualsAndHashCode(callSuper = false, of = { "accessionCode", "header", "date" }) 
@SuppressWarnings("PMD.UnusedPrivateField") 
public class PDBEntry implements Serializable { 
    @Id 
    @NaturalId 
    @NotEmpty 
    @Length(max = 4) 
    private String accessionCode; 

    @NaturalId 
    @NotEmpty 
    private Date date; 

    @NaturalId 
    // We allow for the header to be 'null' 
    private String header; 

    private Boolean isValidDssp; 

    @Temporal(TemporalType.TIMESTAMP) 
    private Date lastUpdated = new Date(System.currentTimeMillis()); 

    protected PDBEntry(){} 

    public PDBEntry(String accessionCode, String header, Date date){ 
     this.accessionCode = accessionCode; 
     this.header = header; 
     this.date = date; 
    } 
} 

Tôi vẫn là người mới bắt đầu ở Hibernate và sử dụng Lombok, nhưng điều này sẽ không làm điều tương tự và Lombok sẽ tự động tạo hàm tạo cần thiết cho bạn?

@Entity 
@Data 
@SuppressWarnings("PMD.UnusedPrivateField") 
public class PDBEntry implements Serializable { 
    @Id 
    @NaturalId 
    @NotEmpty 
    @NonNull 
    @Length(max = 4) 
    private String accessionCode; 

    @NaturalId 
    @NotEmpty 
    @NonNull 
    private Date date; 

    @NaturalId 
    // We allow for the header to be 'null' 
    private String header; 

    private Boolean isValidDssp; 

    @Temporal(TemporalType.TIMESTAMP) 
    private Date lastUpdated = new Date(System.currentTimeMillis()); 
} 

Ngoài ra, lập trình viên ban đầu của mã này cho biết tiêu đề này là 'null', nhưng ông đã tạo một hàm tạo cần giá trị cho tiêu đề một cách rõ ràng. Tôi đang thiếu một cái gì đó hoặc là một chút mâu thuẫn?

Trả lời

12

Có một cái nhìn tại @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor.

Các hành vi constructor của @Data là như @RequiredArgsConstructor:

@RequiredArgsConstructor tạo một constructor với 1 tham số cho từng lĩnh vực đòi hỏi xử lý đặc biệt. Tất cả các trường cuối cùng nhận được tham số, như cũng như bất kỳ trường nào được đánh dấu là @NonNull không được khởi tạo ở đó chúng được khai báo.

Do không có trường nào của bạn là final hoặc @NonNull, điều này sẽ dẫn đến hàm tạo không đối số. Tuy nhiên, đây không phải là cách biểu đạt nhất để đạt được hành vi này.

gì có thể bạn sẽ muốn trong trường hợp này là một @NoArgsConstructor (tùy chọn kết hợp với một @AllArgsConstructor), để giao tiếp rõ hành vi dự định, cũng như được nêu trong tài liệu hướng dẫn:

Một số cấu trúc java, chẳng hạn như hibernate và Nhà cung cấp dịch vụ Giao diện yêu cầu một nhà xây dựng không có số. Chú thích này hữu ích chủ yếu kết hợp với @Data hoặc một trong các hàm tạo khác tạo chú thích.

+0

Có, tôi đã đọc về @RequiredArgsConstructor, nhưng vì nó là tiêu chuẩn trong @Data, tôi không thêm nó. Câu hỏi của tôi là liệu tôi có sử dụng chú thích một cách chính xác vì lập trình ban đầu đã sử dụng Lombok nhưng không sử dụng chú thích @NonNull, nhưng thay vào đó sử dụng các hàm tạo rõ ràng. Bạn nói không có trường nào của tôi là @NonNull, nhưng nhìn kỹ vào mã của tôi (hộp thứ hai), tôi đã chú thích các trường accessionCode và date với @NonNull. Bây giờ kể từ khi Hibernate thực sự dường như yêu cầu một nhà xây dựng không-args, đây sẽ là một phong cách tốt? @Data @NoArgsConstructor (truy cập = AccessLevel.PROTECTED) @RequiredArgsConstructor – FinalArt2005

+0

Yup, đó sẽ là con đường để đi .. – Tim

+3

Ok, chỉ với bất kỳ ai cũng bắt đầu sử dụng Lombok, tôi vừa nghe rằng @RequiredArgsConstructor không phải là rất mạnh mẽ, nó lấy thứ tự của các trường trong lớp của bạn để xây dựng hàm khởi tạo, vì vậy nếu ai đó thay đổi thứ tự này, mã của bạn gọi hàm khởi tạo ngừng hoạt động, vì vậy chỉ ra hàm khởi tạo rõ ràng vẫn là lựa chọn tốt hơn. Các @NoArgsConstructor (access = AccessLevel.PROTECTED) tuy nhiên dường như có ích nếu bạn đang sử dụng Hibernate. Cảm ơn tất cả mọi người đã giúp đỡ của bạn. – FinalArt2005

1

Bit đó mâu thuẫn với nhau. Tôi đã không được sử dụng Lombok trước nhưng với hibernate nếu bạn muốn để có thể tạo ra một bean và kiên trì bạn cần constructor mặc định như được đưa ra ở trên như xa tôi đã nhận thức được. Nó sử dụng Constructor.newInstance() để khởi tạo các đối tượng mới.

Dưới đây là một số tài liệu hướng dẫn ngủ đông đi vào chi tiết hơn.

Hibernate Documentation

+0

Chú thích @Data ngay trên lớp def sẽ tạo hàm tạo mặc định này theo như tôi biết và từ những gì tôi đã học cho đến nay chú thích @NonNull phía trên các trường sẽ khiến Lombok thực hiện các tham số trường này constructor để bạn phải cung cấp các giá trị cho chúng, và cũng sẽ kiểm tra xem chúng có rỗng không. Nhưng kể từ khi tôi mới đến điều này tôi đã tự hỏi nếu nó chỉ là tôi hoặc lập trình ban đầu đã thực hiện một vài sai lầm nhỏ ở đây. – FinalArt2005

1

Nếu bạn đang sử dụng @Data với một lĩnh vực @NonNull và vẫn muốn có một noargs-constructor, bạn có thể muốn thử để thêm tất cả 3 chú thích cùng

@NoArgsConstructor 
@RequiredArgsConstructor 
@AllArgsConstructor 

Rõ ràng một intelliJ lỗi cũ mà tôi đã làm nhân rộng trong Eclipse Kepler và lombok v0.11.4

Các vấn đề liên quan