2010-05-14 39 views
6

Trong Java, tôi định nghĩa một lớp trừu tượng với cả phương thức trừu tượng và cụ thể trong nó, và nó phải được phân lớp độc lập bởi các nhà phát triển bên thứ ba. Chỉ cần chắc chắn: là có bất kỳ thay đổi tôi có thể làm cho lớp trừu tượng đó là nguồn tương thích với các lớp học của họ nhưng không tương thích nhị phân? Nói cách khác: sau khi họ đã biên soạn các lớp con của họ, tôi có thể thay đổi lớp trừu tượng - ngoài ví dụ: thêm một phương thức trừu tượng vào nó hoặc loại bỏ một phương thức được bảo vệ khỏi nó được gọi bởi các lớp con, tất nhiên là nguồn không tương thích - theo cách có thể buộc chúng biên dịch lại các lớp con của chúng?Java - tương thích nhị phân của lớp trừu tượng và phân lớp

Trả lời

8

Nếu nó không phải là quá muộn để thay đổi hệ thống của bạn, tôi sẽ đề nghị bạn nên làm điều đó. Ghi đè thường không phải là cách hay để tùy chỉnh chức năng vì nó cực kỳ mong manh. Ví dụ: nếu sau này bạn sử dụng tên phương thức mà khách hàng của bạn đã sử dụng (điều này hiện đang vô tình tự động ghi đè), thì có thể ghi đè hoàn toàn sẽ phá vỡ các biến thể của lớp của bạn. Một cách tốt hơn là cung cấp cho khách hàng của bạn một giao diện được giới hạn chỉ là hành vi tùy chỉnh, và sau đó bạn có một lớp hoàn toàn cụ thể phụ thuộc vào một thể hiện của giao diện này và ủy quyền một cách thích hợp cho giao diện khi nó cần sử dụng các hành vi tùy chỉnh. Bằng cách này, mã của bạn và mã của khách hàng của bạn được phân tách hoàn toàn và chúng sẽ không ảnh hưởng lẫn nhau.

+0

Cảm ơn bạn đã cung cấp giải pháp thay thế!Đó cũng là điều tôi đang cân nhắc - tôi đã cân nhắc chi phí của nó phức tạp (duy trì một tham chiếu đến việc thực hiện và ủy thác nó) nhưng vì kiến ​​trúc có thể cắm được này là một yêu cầu, tôi sẽ làm điều này. – thSoft

2

Chắc chắn.

Bạn vô tình có thể sử dụng tên phương thức mà họ đã sử dụng, giờ đây đột nhiên bị ghi đè, với các kết quả khác nhau đáng kể.

Bạn có thể thêm các trường đến lớp mà lộn xộn lên serialization, vv

5

Tôi giả định rằng bạn đang sử dụng "không tương thích nhị phân" theo nghĩa kỹ thuật; ví dụ. nơi trình nạp lớp phát hiện sự không tương thích và từ chối tải các lớp.

Không tương thích nhị phân cũng có thể được giới thiệu nếu bạn thêm phương thức hiển thị tuyên bố nó final và phương pháp đó va chạm với chữ ký của một số phương thức hiện có trong phân nhóm của bên thứ ba. Tuy nhiên, nếu phương thức này không phải là cuối cùng, phương thức hiện tại sẽ biến thành ghi đè phương thức (mới) của bạn có thể gây ra sự cố ... nhưng không tương thích nhị phân.

Tương tự như vậy, việc thêm trường hiển thị mới sẽ dẫn đến ẩn, có thể dẫn đến hành vi khó hiểu và sẽ phá vỡ tuần tự hóa đối tượng. Nhưng điều này sẽ không dẫn đến sự không tương thích nhị phân.

Nói chung, điểm này thực tế là bạn cần xem xét các vấn đề ngữ nghĩa ứng dụng cũng như khả năng tương thích nhị phân đơn giản. Và hệ thống kiểu Java sẽ không giúp bạn ở đó.

Để hoàn chỉnh, có một thứ khác mà bạn có thể làm trong mã của bạn mà sẽ phá vỡ tính tương thích nhị phân cho các lớp bên thứ 3:

  • giảm khả năng hiển thị của lớp trừu tượng của bạn và/hoặc các phương pháp của nó,
  • thay đổi chữ ký của các lớp khác sử dụng như kết quả tham số và trừ các loại,
  • thay đổi chuỗi superclasses rằng lớp trừu tượng của bạn kéo dài, hoặc thực hiện một sự thay đổi không phù hợp ở những lớp học, hoặc
  • thay đổi cây giao diện t hat lớp trừu tượng của bạn thực hiện, hoặc thực hiện một sự thay đổi không tương thích trong các giao diện đó.
+0

Cảm ơn câu trả lời toàn diện, và để suy nghĩ về những gì tôi cũng nghĩ nhưng không mô tả, cụ thể là bất kỳ cách nào khác để phá vỡ mã của người thực hiện. – thSoft

+0

Câu trả lời hay. Các quy tắc cho khả năng tương thích nhị phân và nguồn là rất độc lập với nhau. Điều quan trọng là phải hiểu cả hai cách riêng biệt. http://motlin.com/2010/binary-and-source-backwards-compatibility/ –

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