Разница между инъекциями поля и конструктора в Dagger - PullRequest
0 голосов
/ 20 ноября 2018

Привет У меня есть очень простой вопрос кинжала для Android.

class Fooz {
    @Inject Foo1 mFoo1;
    public Fooz() {
        ....
    }
}

class Fooz {
    private Foo1 mFoo1;

    @Inject public Fooz(Foo1 foo1) {
        mFoo1 = foo1;
    }
}

Как два класса идентичны?Первый вводит поле Foo1 напрямую, а второй назначает mFoo1 в конструкторе.Во втором случае, Foo1 вводится из графа объекта, как только Fooz создан и добавлен в граф объекта?Если они разные, почему так?Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Внедрение в конструктор дает вам больший контроль над созданием объекта, так как использование встраивания в поле означает ограничить создание вашего класса отражением и полагаться на поддержку этих конкретных аннотаций внедрения.Кроме того, наличие четких зависимостей от конструктора позволяет легче поддерживать и тестировать код.

Насколько я знаю, нет никакой разницы в отношении того, как он хранится на графе кинжалов, кроме вызова конструкторавсегда быстрее, чем внедренные поля.

По моему мнению, мы должны использовать свойство, когда у нас нет контроля над созданием объекта, как в Activities и Fragments, например.

0 голосов
/ 20 ноября 2018

Эти классы будут вести себя одинаково, когда Fooz будет внедрен с использованием внедрения зависимостей.Однако они будут вести себя по-разному, если построены с использованием конструктора, который вы определили.

Пример 1. Вызов new Fooz () приведет к тому, что mFoo1 будет нулевым.

Пример 2. В результате вызова new Fooz (foo1)в mFoo1 инициализируется как foo1.

Предпочтительным (личное мнение) способом является использование аннотации внедрения зависимостей в конструкторе, потому что это позволит избежать исключений нулевого указателя, как объяснено при сравнении примера 1 и примера 2. Что более важнотакой конструктор дает больше гибкости при тестировании ваших классов, так как вы можете обеспечить макеты, намного проще.

Это правило sonarqube с лучшим описанием, объясняющее то, что я упомянул https://sonarcloud.io/coding_rules?open=squid%3AS3306&rule_key=squid%3AS3306.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...