Niedawno przeczytałem o @ImplementedBy
adnotacjach dostępnych w Google Guice . Pozwala programiście określić powiązanie między interfejsem a jego implementacją do wykorzystania w przyszłości we wstrzykiwaniu zależności. Jest to przykład wiązania just-in-time .
Jestem przyzwyczajony do definiowania jawnych powiązań w moich modułach, używając następującej składni:
bind(SomeInterface.class).to(SomeInterfaceImplementation.class);
Zgodnie z dokumentacją jest to równoznaczne z następującym użyciem @ImplementedBy
adnotacji:
@ImplementedBy(SomeInterfaceImplementation.class)
public interface SomeInterface {
//method declarations
}
Jedyne korzyści, jakie widzę tutaj, to to, że kod jest nieznacznie krótszy. Jednocześnie to podejście ma wadę słusznie wskazaną przez te same dokumenty:
Używaj
@ImplementedBy
ostrożnie; dodaje zależność czasu kompilacji od interfejsu do jego implementacji.
Taka zależność może nie być problemem w wielu przypadkach, ale osobiście postrzegam ją jako zapach kodu.
Z jakich przypadków użycia @ImplementedBy
warto skorzystać z adnotacji?
Jednym z możliwych sposobów wydaje się zastosowanie go w kodzie biblioteki lub frameworka. Jak opisano w dokumentach, adnotacja może zapewnić domyślne powiązanie, które można łatwo zastąpić jawnym.
Jeśli typ znajduje się zarówno w
bind()
instrukcji (jako pierwszy argument) i ma@ImplementedBy
adnotację,bind()
używana jest instrukcja. Adnotacja sugeruje domyślną implementację, którą można zastąpić powiązaniem.
W ten sposób, jako twórca biblioteki, mogę zapewnić moim użytkownikom niestandardowe powiązanie, które można dostosować gdzieś w kodzie klienta.
Czy to jedyny powód istnienia adnotacji? A może brakuje mi czegoś? Czy mogę coś zyskać, używając go w kodzie, który jest tylko aplikacją zajmującą się logiką biznesową, a nie biblioteką / strukturą do rozszerzenia?