2012-07-24 81 views
11

Trong Java mục đích của việc sử dụng hàm tạo riêng trong lớp trừu tượng là gì?Phương thức khởi tạo riêng trong lớp trừu tượng

Trong bài đánh giá tôi nhận được câu hỏi này và tôi tò mò, tình huống nào cần phải sử dụng hàm tạo theo cách như vậy?

Tôi nghĩ rằng nó có thể được sử dụng trong cặp với một hàm tạo khác trong lớp trừu tượng, nhưng điều này là rất tầm thường. Ngoài ra nó có thể được sử dụng để xây dựng các lớp bên trong tĩnh whitch sẽ vượt quá lớp trừu tượng.

Có thể sử dụng trang nhã hơn?

+0

Tôi đã không bỏ phiếu cho câu hỏi này nhưng tôi nghi ngờ rằng mọi người downvoting đang phản đối * "Có thể có sử dụng tao nhã hơn" * - điều đó khá rộng và có vẻ khá hùng biện. – Flexo

+2

Câu hỏi đặt ra là: * "Trong Java mục đích của việc sử dụng hàm tạo riêng trong lớp trừu tượng là gì?" *. Điều đó dường như đủ cụ thể đối với tôi. – assylias

+0

Thx để trả lời, có thể bạn đã đúng. – Chris

Trả lời

27

Nếu constructor privatechỉ constructor của lớp, sau đó lý do là rõ ràng: để ngăn chặn subclassing. Một số lớp chỉ phục vụ như là chủ sở hữu cho các trường/phương thức tĩnh và không muốn được khởi tạo hoặc phân lớp. Lưu ý rằng các sửa đổi abstract là trong trường hợp này dư thừa — có hoặc không có nó sẽ không có instantiation có thể. Theo ghi chú của @JB Nizet bên dưới, sửa đổi abstract cũng là thực hành không tốt vì nó gửi tín hiệu sai đến các máy khách của lớp. Lớp học trên thực tế phải là final.

Có một trường hợp sử dụng, khá hiếm mặc dù: bạn có thể có một abstract class với chỉ private cấu trúc cho chứa các lớp con riêng của mình lớp như lồng nhau. Thành ngữ này đảm bảo rằng các lớp lồng nhau đó là các lớp con duy nhất. Trong thực tế, enum s trong Java chỉ sử dụng thành ngữ này.

Nếu có các nhà thầu khác xung quanh, thì không có gì đặc biệt về nhà xây dựng private.Nó được sử dụng trong một lớp học abstract giống như bất kỳ lớp nào khác.

+0

Tôi sẽ nói rằng việc sử dụng abstract trong trường hợp này không chỉ là thừa, mà còn gây nhầm lẫn. Một lớp trừu tượng, theo định nghĩa, là * có nghĩa là * được phân lớp. Tạo một lớp trừu tượng, nhưng không thể phân lớp, cho thấy sự thiếu hiểu biết về trừu tượng là gì. –

+0

@JBNizet Không nhất thiết phải thiếu hiểu biết, nhưng có thể thiếu sự quan tâm không làm cho khách hàng của bạn bối rối. BTW lưu ý đoạn thứ hai của tôi mà tôi vừa thêm vào. Điều này tạo ra động lực hoàn hảo cho ctor 'private' trong một lớp' abstract'. –

+2

Điểm tốt. Nhưng tôi đã đọc rất nhiều ;-) –

0

không sử dụng thanh lịch khác có thể

6

Chỉ có điều tôi có thể nghĩ đến là tái sử dụng mã thông thường được chia sẻ bởi các nhà thầu (bảo vệ) khác. Sau đó, họ có thể gọi cho nhà xây dựng tư nhân trong dòng đầu tiên của họ.

2

Đôi khi, hàm tạo no-arg mặc định được đặt ở chế độ riêng tư và một hàm tạo khác chấp nhận các đối số được cung cấp. Nhà xây dựng này sau đó có thể gọi (các) hàm tạo riêng tư khác. Điều này thực thi lực lượng để cung cấp các đối số này, mà có thể đảm bảo một số biến luôn luôn được khởi tạo, mặc dù đây không phải là thực tế phổ biến (theo kinh nghiệm của tôi). Nếu đây là yêu cầu, bạn sẽ tốt hơn kiểm tra các biến của bạn và ném một IllegalArgumentExeption, giải thích tại sao biến cần phải được khởi tạo.

Nếu bạn tạo một lớp trừu tượng với chỉ các nhà xây dựng riêng, lớp này thực tế vô dụng vì không có trường hợp nào có thể được tạo. Nếu ý định là tạo ra một lớp tiện ích chỉ với các phương thức tĩnh (như lớp Math trong gói java.lang), thì các nhà xây dựng riêng có thể chấp nhận được, tuy nhiên, lớp này sẽ được đánh dấu cuối cùng thay vì đánh dấu lớp là trừu tượng. mở rộng.

+2

Tuy nhiên, nếu bạn chỉ cung cấp một hàm tạo một cách rõ ràng, thì không có hàm tạo no-arg mặc định nào, vì vậy đây không thực sự là lý do để làm cho nó trở thành riêng tư. – Thilo

1
  1. Như đã đề cập, được sử dụng như một hàm tạo chung, chỉ sử dụng nội bộ.

  2. Tóm tắt hoặc không trừu tượng, việc khai báo một hàm tạo mặc định riêng tư trên một lớp chỉ chứa các phương thức công cộng tĩnh [phương pháp trợ giúp] để ngăn chặn instantiating lớp.

+0

@Thilo - Tôi đồng ý (3) không áp dụng, tôi bị mang đi - đó sẽ là phần mở rộng của (1). 4 đủ điều kiện để làm rõ rằng nó không trực tiếp áp dụng cho câu hỏi cụ thể. –

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