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
bind
và unbind
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.
"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. –
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ẻ. –