6

Tôi hiện đang đọc Java hiệu quả của Joshua Bloch và Mục 17 là 'Thiết kế và tài liệu để thừa kế hoặc người khác cấm nó'. Tác giả đề nghị cấm thừa kế theo mặc định.Có thể loại bỏ cuối cùng từ một định nghĩa lớp phá vỡ khả năng tương thích ngược?

Có an toàn không khi khai báo các lớp học theo mặc định và trong bản phát hành sau, hãy xóa từ khóa cuối cùng nếu cần mở rộng lớp học? Nó sẽ phá vỡ khả năng tương thích ngược với mã đã được biên dịch với một phiên bản trước?

Nếu có vẻ như là đặt cược an toàn hơn để làm cho tất cả các lớp cuối cùng và chỉ xóa nó trong bản phát hành trong tương lai nếu có nhu cầu được hỗ trợ tốt.

+0

Nó phần nào phụ thuộc vào mức độ sống, API thở của bạn. Nếu bạn thực hiện thay đổi và phát hành mọi lúc, không phải chờ đợi một tuần để có được khả năng kế thừa. Nếu, mặt khác, Java đã làm điều đó với các lớp JDK cơ bản của chúng theo mặc định, nó sẽ làm cho các lập trình rơi nước mắt phải đợi 5 năm để sửa lỗi "". –

+0

@Kirk Woll nếu phải mất 5 năm để thay đổi từ cuối đến cuối cùng, phải mất bao lâu để thay đổi từ phi thức đến cuối? – emory

Trả lời

10

Nó phá vỡ cả nhị phân lẫn khả năng tương thích nguồn. Đó là một trong những lý do đó là một ý tưởng hay để kết thúc lớp học; bạn luôn có thể thay đổi ý định về nó.

The Java Language Specification, §13.4.2, có những điều sau đây để nói về khả năng tương thích nhị phân:

Thay đổi một lớp học mà được tuyên bố final không còn được khai báo final không phá vỡ khả năng tương thích với những chương trình tồn tại trước đó.

Tôi cho rằng bạn vẫn là có thể tạo nên ví dụ minh họa khi thực sự có thể phá vỡ chương trình; như bytecode tạo ra một lớp kế thừa từ lớp được cho là final và sau đó tải lớp được tạo ra đó và dựa vào việc nhận được một VerifyError.

2

những suy nghĩ của tôi về vấn đề này:

Loại bỏ các final trên lớp sẽ không gây ra vấn đề ngay lập tức. Nhưng hãy xem xét điều này:

Có một lớp học cuối cùng được gọi là AdamsFactory mà bạn thay đổi thành phi chính thức. Hai tháng sau, một lập trình viên mới gọi là Dilbert gia nhập nhóm của bạn.
Ông phân lớp lớp đã qua sử dụng của bạn thành ScottFactory, nhưng phá vỡ Nguyên tắc thay thế của Liskov.

Sau đó, anh ấy có lớp ComicStripPrinter của bạn sử dụng ScottFactory thay vì AdamsFactory. Một cái gì đó là ràng buộc để phá vỡ.

đó mang lại cho chúng ta trở lại những gì Joshua Lô nói:

Nếu bạn có ý định thừa kế: thiết kế nó với thảo luận, và tài liệu đó. Nếu bạn không có kế thừa thừa kế, thì hãy ngăn chặn nó.

Tôi hy vọng những gì tôi đã nói không phải là một tải trọng lớn.


EDIT:

Về các preface of Java Langauge Specification, và tìm kiếm Joshua Bloch :)

+1

Người thiết kế AdamsFactory không biết liệu có nên làm cho nó cuối cùng/không phải là cuối cùng, vì vậy PHB bắt buộc nó không phải là cuối cùng (theo mặc định). Sau đó Dilbert làm cho một trường hợp hấp dẫn cho AdamsFactory là cuối cùng, nhưng do thời gian này có khoảng một nghìn tỷ lớp mở rộng AdamsFactory một số vi phạm nguyên tắc của Liskov. Nếu Dilbert thực hiện thay đổi, tất cả các lớp đó sẽ bị hỏng. Everone ghét Dilbert. – emory

2

Nếu bạn đang thiết kế một cái gì đó như Java tiêu chuẩn API, mà hàng triệu lập trình viên sẽ sử dụng trong nhiều năm, vâng , hãy nghĩ như Joshua Bloch. FORWARD EVOLUTION rất quan trọng.

99% chương trình Java không. Chúng được phát triển để sử dụng nội bộ, tác động của thay đổi API là rất nhỏ, thường tất cả các mã nguồn đều có sẵn để tái cấu trúc.SIMPLICITY là chìa khóa cho các chương trình như vậy. Nếu bạn có thiết kế phức tạp và ưa thích, hoặc bạn dành tất cả thời gian của bạn suy nghĩ về cuối cùng hay không, bạn đang lãng phí thời gian.

Tôi đổ lỗi cho Joshua vì đã không đặt tuyên bố từ chối trách nhiệm phù hợp cho đề xuất của anh ấy.

+2

Vâng, YAGNI là tốt và dandy, nhưng thay đổi mẫu lớp Java Java của bạn để khai báo tất cả các lớp là 'final' là một việc phải làm, và thiết kế lớp hợp lý luôn đảm bảo việc bảo trì dài hạn và trung hạn dễ dàng hơn , nó giúp ngay cả trong ngắn hạn), và điều hướng đến một tuyên bố lớp học và loại bỏ 'cuối cùng' là một điều rất dễ dàng để làm, nếu bạn cảm thấy bạn cần nó. – gustafc

+0

trong khi bạn đang ở đó, làm cho tất cả các lĩnh vực và phương pháp cuối cùng quá. – irreputable

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