2013-08-07 54 views
18

Điều này nghe có vẻ ngu ngốc với bạn, nhưng tại sao tôi cần phải xác định hàm khởi tạo trống trong @Entity s của mình?Thực thể Java - tại sao tôi cần một hàm tạo rỗng?

Mọi hướng dẫn tôi đã thấy đều nói: mọi thực thể đều cần một hàm tạo trống.

Nhưng Java luôn cung cấp cho bạn một hàm tạo rỗng rỗng mặc định (nếu bạn không định nghĩa lại).

Cảm ơn.

EDIT

Tôi nghĩ rằng có vấn đề ngữ nghĩa. Điều tôi hiểu bởi "nhu cầu" là viết.

Có nghĩa là: luôn viết hàm khởi tạo trống trong thực thể của bạn.

dụ:

@Entity 
public class MyEntity implements Serializable { 

    @Id 
    private String str; 

    public MyEntity(){} 

    //here getter and setter 
} 

Nhưng Java luôn mang đến cho bạn constructor rỗng này khi bạn không xác định lại nó (viết một ai khác với các thông số).

Trong trường hợp này, hàm tạo rỗng này có vẻ vô dụng.

+0

Vâng, không phải lúc nào cũng cần thiết, trừ khi bạn muốn cung cấp giá trị cụ thể cho các thành viên dữ liệu của mình. –

+1

@ JavaNewbie_M107 Hàm khởi tạo Emtpy là bắt buộc (có thể là mặc định, nhưng vẫn phải có hàm tạo không có đối số) – Antoniossss

+0

Nếu bạn có một lớp công khai, java thực sự cung cấp cho bạn một hàm tạo rỗng công khai _visible_ (và không _invisble_). – steffen

Trả lời

25

Một hàm khởi tạo trống là cần thiết để tạo một cá thể mới thông qua sự phản ánh bằng khung kiên trì của bạn. Nếu bạn không cung cấp thêm bất kỳ hàm tạo nào với các đối số cho lớp, bạn không cần phải cung cấp một hàm tạo rỗng vì bạn nhận được một giá trị mặc định.

Bạn cũng có thể sử dụng các chú thích @PersistenceConstructor trông giống như sau

@PersistenceConstructor 
public Movie(Long id) { 
    this.id = id; 
} 

để khởi thực thể của bạn nếu mùa xuân liệu có mặt trong dự án của bạn. Vì vậy, bạn có thể tránh các constructor trống là tốt.

+1

thì khung là xấu, vì chúng có thể dễ dàng sử dụng Unsafe – Enerccio

+0

Vì vậy, bạn đang nói khung công tác nói chung là xấu vì chúng có khả năng có thể sử dụng Không an toàn? Tôi không thể nhưng không đồng ý. Đầu tiên, đối với việc xây dựng tiêm, bạn không cần Unsafe, sự phản chiếu sẽ thực hiện thủ thuật. Thứ hai, giải pháp thay thế là gì, cố tự viết mọi thứ mà một cộng đồng nhà phát triển lớn đã làm cho bạn? – u6f6o

+0

không, tôi nói rằng các khung yêu cầu bạn cung cấp các hàm tạo rỗng là không hợp lệ vì chúng có thể sử dụng 'Unsafe' thay vì nếu bạn không cung cấp hàm tạo rỗng – Enerccio

3

Xác định rõ ràng một hàm tạo mặc định là không cần thiết trừ khi bạn cung cấp một hàm tạo khác cho thực thể. Nếu bạn cung cấp một hàm tạo khác, ngoài một hàm tạo có chữ ký của hàm tạo mặc định, hàm tạo mặc định sẽ không được tạo ra.

Do việc triển khai JPA dựa trên sự tồn tại của một hàm tạo mặc định, sau đó cần phải bao gồm hàm tạo mặc định sẽ bị bỏ qua.

+1

Tôi mạnh mẽ không đồng ý, thực thể phải có nhà xây dựng trống để tạo ví dụ bằng cách phản ánh. – Antoniossss

+0

Bạn đã quen thuộc với việc triển khai JPA nào? Sử dụng hibernate Tôi không bao giờ buộc phải bao gồm một constructor mặc định trừ khi các trường hợp được đánh dấu ở trên có mặt. –

+0

Bạn không cần phải cung cấp hàm tạo không có đối số, bởi vì bạn có một mặc định - vì vậy bạn có một. Tôi đã không viết rằng bạn phải viết của riêng bạn trống c phải không? :) – Antoniossss

17

Nhưng java luôn cung cấp cho bạn hàm khởi tạo trống ẩn mặc định (nếu bạn không xác định lại một).

Tuyên bố này chỉ đúng khi bạn không cung cấp bất kỳ hàm tạo nào trong lớp của bạn. Nếu một hàm tạo đối số được cung cấp trong lớp của bạn, thì jvm sẽ không thêm hàm tạo không đối số.

1

Thực ra bạn không cần phải viết. Bạn có nó theo mặc định. Đôi khi bạn có thể tạo một hàm tạo private để ngăn người dùng sử dụng mặc định

public class MyClass{ 

private MyClass(){} 

} 

Ví dụ, bạn có thể chặn sử dụng hàm tạo mặc định.

Đôi khi, khi bạn sử dụng Gson plugin để chuyển đổi dữ liệu chuỗi JSON vào Object, nó đòi hỏi phải viết constructor mặc định, nếu không nó không hoạt động

-1

Từ thẻ JPA, tôi giả sử rằng bạn đang làm việc với Hạt Java. Mỗi hạt cần phải có các thuộc tính sau:

  1. Getters and setters cho tất cả các biến mẫu chính của nó.

  2. An hàm tạo rỗng.

  3. Tất cả các biến thể hiện của nó tốt nhất là private.

Do đó, tuyên bố: "mọi thực thể cần một hàm tạo trống".

0

Java không phải lúc nào cũng cung cấp cho bạn một hàm tạo rỗng vô hình mặc định nếu lớp của bạn có hàm tạo đối số, bạn phải tự định nghĩa hàm tạo rỗng.

3

Khi bạn chỉ định thẻ "JPA", tôi cho rằng câu hỏi của bạn chỉ áp dụng cho JPA và không phải là các nhà thầu trống.

Khuôn khổ Persitence thường sử dụng sự phản chiếu và cụ thể hơn là Class<T>.newInstance() để khởi tạo đối tượng của bạn, sau đó gọi getters/setters bằng nội tâm để đặt trường.

Đó là lý do tại sao bạn cần một hàm tạo trống và getters/setters.

Xem this StackOverflow question about empty constructors in Hibernate.