2012-07-30 27 views
10

Có bất kỳ hướng dẫn chung nào về thời điểm kết thúc lớp học không?Hoàn cảnh để kết thúc lớp học?

Tôi nghĩ đó là nếu bạn không muốn mọi người mở rộng lớp học của bạn, nhưng điều đó có vẻ hơi ... ngây thơ ??

+1

Tôi nghĩ rằng có rất nhiều câu hỏi như thế này tại đây: http://stackoverflow.com/questions/2169668/why-would-you-make-a-whole-class-sealed-final ví dụ –

+1

Hãy xem xét class String, nó là cuối cùng.Nó được yêu cầu để được lưu giữ cuối cùng và không cho phép mở rộng vì JVM duy trì các nhóm chuỗi, chúng không thay đổi. Nếu bất cứ ai ghi đè lên nó, điều đó sẽ tạo ra các vấn đề cho JVM, nó có thể không duy trì bất kỳ nhóm chuỗi nào bởi vì JVM không biết làm thế nào lớp mở rộng có thể đã triển khai một số phương thức và có thể tạo ra các vấn đề lớn hơn. Vì vậy, CNTT TẤT CẢ PHỤC HỒI và sẽ yêu cầu một quyết định thiết kế tuyệt vời cho dù để cung cấp một lớp học như CUỐI CÙNG hay không. Chúng tôi chắc chắn không sử dụng FINAL cho các lớp học hàng ngày. – devang

+0

Tiêu chí * khác * nào có thể có? – EJP

Trả lời

10

Làm cho lớp cuối cùng chỉ ngăn nó được mở rộng khi bạn lưu ý. Tại sao bạn muốn làm điều đó?

  • Một trường hợp sử dụng điển hình là đảm bảo tính bất biến. Nếu bạn thiết kế một lớp bất biến nhưng không làm cho nó cuối cùng, nó có thể được mở rộng theo một cách có thể thay đổi được. Điều này có thể dẫn đến một phân lớp làm hỏng một lớp bất biến hoặc tạo ra các vấn đề tương tranh.

  • Bạn cũng có thể chỉ cần đánh dấu một lớp là cuối cùng để ghi lại thực tế là nó không được thiết kế để được mở rộng. Xem ví dụ Java hiệu quả # 17: "Thiết kế và tài liệu cho thừa kế hoặc người khác cấm nó".

+0

Nếu các lĩnh vực là chính thức cuối cùng, đây là (về mặt lý thuyết) không phải là một vấn đề. Mặc dù phản ánh phá vỡ tất cả các quy tắc ... – user949300

+0

@ user949300 Đồng ý, nhưng một ví dụ tốt là BigDecimal, không thay đổi nhưng không phải là cuối cùng và có một số trường không phải cuối cùng. Nó phải có được cuối cùng ở nơi đầu tiên. – assylias

+1

@assylias, mặc dù tôi đã đánh dấu bạn, tôi không muốn xem các lớp học cuối cùng trong các thư viện được bảo trì kém. Điều này là do nó hạn chế người dùng thượng nguồn (tôi!) Từ việc thực hiện các giải pháp thay thế bằng cách mở rộng lớp và '@ Ghi đè lên mã vi phạm. Nếu thư viện được duy trì tích cực, thì Bloch đã hoàn toàn đúng. – fommil

4

Nó cũng được thiết lập rằng việc phá vỡ gói giải mã kế thừa. Allan Snyder trong bài báo của mình Encapsulation and inheritance in object-oriented programming languages thể hiện sự chăm sóc bạn phải tập thể dục với sự kế thừa.

Josua Bloch trong cuốn sách của mình Effective Java khuyên bạn nên thiết kế và ghi lại các lớp học của bạn để được kế thừa hoặc người nào khác bạn cấm, đề cập chính xác đến các vấn đề đã được Snyder biết đến.

Nếu tại một thời điểm nào đó bạn không chắc chắn về cách mở rộng các lớp học trong tương lai hoặc nếu bạn không có ý định thực sự được mở rộng, thì có lẽ bạn nên làm cho chúng cuối cùng. Bạn luôn có thể mở chúng sau này, nhưng ngược lại (trên tất cả nếu bạn đang xây dựng một hệ thống mở) có thể là nguyên nhân thực sự gây đau, nếu không phải là không thể tùy thuộc vào hoàn cảnh.

Các nghiên cứu Mikhajlov và Sekerinski trong bài báo của họ A Study of the Fragile Base Class cho thấy một loạt các vấn đề bạn có thể gặp khi sử dụng không đúng cách có thể mang lại cho bạn ý tưởng rộng hơn về lý do tại sao điều này có thể quan trọng.

5

Lý tưởng nhất là bạn đã đọc Josh Bloch và thiết kế lớp học của bạn để thừa kế làm việc hoàn hảo. Nhưng, trong thực tế, câu trả lời của tôi (IMHO) để kết thúc lớp học là

Bạn có tin tưởng (hoặc muốn) những người khác mở rộng nó không?

Nếu nó là một lớp siêu quan trọng như String hoặc một số lớp liên quan đến bảo mật, có, chắc chắn sẽ làm cho nó cuối cùng.

Nếu bạn đang làm những công cụ thực sự ưa thích và lớp học sẽ khó mở rộng, xem xét làm cho nó cuối cùng, tùy thuộc vào kỹ năng bạn mong đợi những người sử dụng lớp học có. Cũng phụ thuộc vào việc đây là thư viện có mục đích chung hay một số mã cụ thể của công ty/dự án và liệu trang web có video Squirrel hay máy tạo nhịp tim - tức là, lớp con nghèo sẽ phá vỡ mọi thứ như thế nào?

Nếu bạn không làm bất cứ điều gì ưa thích, đừng làm phiền người dùng bằng cách làm cho nó cuối cùng. Tôi đã thường xuyên nguyền rủa Java để tạo các lớp học như Double cuối cùng.

+0

+1 đối tác thực tế của câu trả lời lý thuyết-chúng-sống-trong-một-hoàn hảo-thế giới của chúng tôi ;-) – assylias

+2

@ user949300 làm thế nào một lớp con nghèo sẽ phá vỡ mọi thứ? Trong một hệ thống khép kín, bạn có thể vá bất kỳ vấn đề nào bạn gặp phải trong mã nơi lớp được sử dụng. Trong một hệ thống mở, điều này có thể khiến lớp không thể sửa được đúng, người dùng có thể phải sống với vấn đề mãi mãi, đơn giản vì có hàng nghìn người dùng khác tin tưởng vào hợp đồng của API bị hỏng, người dùng có mở rộng lớp và truyền bá các lỗi của nó tới nhiều API hơn. –

+1

@EdwinDalorzo OTOH, nếu lớp nếu 'final' và không lường trước được mọi thứ người dùng có thể muốn làm (điều này chắc chắn 100%) thì cách giải quyết (" điều trị ") có thể tệ hơn bệnh. Vì vậy, "nó phụ thuộc". – user949300

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