2016-06-07 13 views
9

Thông số kỹ thuật dịch vụ khai báo OSGi (DS) xác định chú thích có thể được xử lý bằng các công cụ, như Bnd, vào mô tả thành phần xml được sử dụng khi chạy. 112.8.1 trong spec R6 nói:Tại sao chú thích Dịch vụ Tuyên bố OSGi (DS) không được thừa hưởng từ các lớp siêu?

The Component Annotations are not inherited, they can only be used on a given class, annotations on its super class hierarchy or interfaces are not taken into account.

Tại sao họ lại quy định không cho phép thừa kế?

Trả lời

11

Chú thích DS được cung cấp bởi dự án Apache Felix đã từng hỗ trợ cho khả năng mở rộng DS. Dựa trên việc triển khai này, chúng tôi đã cố gắng chuẩn hóa điều này như là một phần của công việc cụ thể hóa chú thích OSGi DS chính thức.

Vấn đề là chúng tôi gặp sự cố ghép nối khó ở đây giữa hai lớp triển khai trên các ranh giới gói và chúng tôi không thể thể hiện sự phụ thuộc này một cách chính xác bằng cách sử dụng các tiêu đề Import-Package hoặc Require-Capability.

Một số vấn đề mọc trong tâm trí:

  • Nói chung bạn muốn chắc bindunbind phương pháp riêng. DS có thể gọi phương thức riêng tư bind hoặc unbind trên lớp cơ sở không? (Về mặt kỹ thuật, điều này có thể được thực hiện, nhưng nó có được khái niệm không?)
  • Nếu chúng ta có phương pháp riêng nhưng người triển khai quyết định thay đổi tên của các phương pháp riêng? Sau khi tất cả chúng là riêng tư và không phải là một phần của bề mặt API. Bộ mở rộng sẽ thất bại vì các phương thức bind/unbind được liệt kê trong các bộ mô tả được cung cấp bởi và đối với lớp mở rộng và chúng vẫn đặt tên cho các tên phương thức cũ.
  • Nếu chúng tôi không hỗ trợ tên phương thức riêng, chúng tôi sẽ yêu cầu các phương thức bind/unbind này để được bảo vệ hoặc công khai. Và do đó chúng tôi buộc các phương pháp triển khai chi tiết trở thành một phần của API. IMHO không phải là rất tốt đẹp.
  • Lưu ý: phương thức riêng tư của gói không hoạt động như hai gói khác nhau không được chia sẻ cùng một gói với nội dung khác nhau.

Chúng tôi lập luận rằng có thể thừa kế như vậy trong một gói duy nhất nhưng kết luận rằng giới hạn này, giải thích xung quanh nó, v.v. sẽ không đáng để thử. Vì vậy, chúng tôi đã loại bỏ tính năng này một lần nữa từ lộ trình đặc điểm kỹ thuật.

+1

"Và do đó, chúng tôi buộc các phương pháp triển khai chi tiết trở thành một phần của API. IMHO không phải là rất tốt". Trong mô hình thành phần của chúng tôi (đó là 90% như DS) chỉ ràng buộc và các phương thức setter chỉ có thể được công khai. Vì các lớp thành phần thường không nằm trong các gói đã xuất, các hàm này sẽ không là một phần của bất kỳ API nào. Theo tôi, gọi method.setAccessible (true) là tồi tệ hơn nhiều so với việc buộc mọi người sử dụng các phương thức bind công khai. –

+0

Nhưng lớp thành phần có thể được sử dụng như một đối tượng dịch vụ, do đó, các phương thức liên kết/unbind công khai có trên đối tượng dịch vụ được chia sẻ. –

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