Нещодавно я читав про @ImplementedBy
анотацію, доступну в Google Guice . Це дозволяє програмісту задати прив'язку між інтерфейсом та його реалізацією для подальшого використання в режимі введення залежності. Це приклад щойно вчасно прив’язки .
Я досить звик визначати явні прив’язки в своїх модулях, використовуючи наступний синтаксис:
bind(SomeInterface.class).to(SomeInterfaceImplementation.class);
Згідно з документацією, це еквівалентно наступному використанню @ImplementedBy
примітки:
@ImplementedBy(SomeInterfaceImplementation.class)
public interface SomeInterface {
//method declarations
}
Єдине надбання, яке я бачу тут, - це те, що код незначно коротший. У той же час, цей підхід має право недоліки, зазначені тими ж документами:
Використовуйте
@ImplementedBy
обережно; він додає залежність часу компіляції від інтерфейсу до його реалізації.
Така залежність може не бути проблемою у багатьох випадках, але я особисто бачу це як запах коду.
Які випадки використання @ImplementedBy
анотації варто використовувати?
Одним із можливих способів, здається, є використання його в коді бібліотеки або рамки. Як описано в документах, анотація може забезпечити прив'язку за замовчуванням, яку легко перекрити явною.
Якщо тип є в обох
bind()
операторах (як перший аргумент) і має@ImplementedBy
анотацію, використовуєтьсяbind()
оператор. В анотації пропонується реалізація за замовчуванням, яка може бути замінена прив'язкою.
Таким чином, як розробник бібліотеки, я можу надати своїм користувачам прив'язку поза коробкою, яку можна налаштувати десь у коді клієнта.
Чи є це єдиною причиною існування анотації? Або щось мені не вистачає? Чи можу я отримати що-небудь, використовуючи його в коді, який є лише додатком, який бере на себе певну логіку бізнесу, а не бібліотеку / рамки, які потрібно розширювати?