Pytanie Sztylet na domyślnych konstruktorach


Próbuję dostać Sztylet do pracy nad moim projektem.

Jednak podczas kompilacji otrzymuję następujący wyjątek na jednej z moich klas:

error: Brak elementów do wstrzykiwania w Foo. Czy chcesz dodać konstruktor wstrzykiwalny?

Jednak klasa nie ma zależności i jako taka używa domyślnego konstruktora no-arg:

public class Foo
{
    ...
}

Czy naprawdę muszę dodać wstrzykiwalny konstruktor no-arg jak poniżej?

public class Foo
{
     @Inject
     public Foo()
     {
     }

     ....
}

18
2017-08-20 14:04


pochodzenie




Odpowiedzi:


Od docs:

Klasy bez adnotacji @Inject nie mogą być budowane przez Dagger.

Sztylet aktywnie wymaga dodania @Inject do twojej wstrzykiwalnej klasy, przez dodanie konstruktora no-args lub dodanie pola do wstrzykiwania. Trzecią opcją jest zwrócenie klasy z metody @Provides w następujący sposób:

@Module(...)
class MyModule {
  @Provides Foo provideFoo() {
    return new Foo(); // Foo is not injectable.
  }
}

Wydaje się, że jest to dodatkowy element, ale z doświadczenia z Guice i innymi frameworkami wiązanie JIT losowych klas okazuje się być pełne błędów. Widzieliśmy java.lang.String wstrzykiwany do rzeczy, a ponieważ ktoś zapomniał go powiązać, skończyło się na "" wstrzyknięciu zamiast pożądanego ciągu znaków. Sztylet wymaga więc konstruktora @Inject lub pola. (Guice opcjonalnie ma to w 4.x, jednak dla zgodności wstecznej jest domyślnie wyłączony)

Jest to rzadka sytuacja, w której Dagger wybrał więcej gwarancji poprawności kosztem niewielkiej ilości gadatliwości.


24
2017-08-20 20:43